#💻・modding-dev

1 messages · Page 493 of 1

red flower
#

shame on you bepis

manic rune
#

wuh

modern kindle
#

I have comfy cozy warm but I also keep 3 fans running in my room for a chill

manic rune
#

dms?

modern kindle
#

Yes

manic rune
#

@chrome widget

normal crest
#

No need for artificial cold

modern kindle
#

Zamn its a whole almost 90 degrees Fahrenheit here

brittle yacht
modern kindle
#

Yea its 89 here feels like 96

#

I love chicago

brittle yacht
#

real

#

bro lives in crime city

modern kindle
#

I do be

hard flume
#

Hiii

modern kindle
#

👋

manic rune
#

hi carrot

hard flume
#

Finally taking my mod seriously. Or well, as seriously as one can take a silly Balala mod

brittle yacht
jolly shadow
gaunt thistle
#

edward robinson 🤝

vast bough
#

can anyone shed some insight in what the secondary colour actually does in the consumable set, from my knowledge, it only uses one colour anyways.

#

and also what does the shop rate number actually mean, i understand it is related to how often they show up in the shop, but what does the difference between a 4 and a 5 of this value actually mean practically

brittle yacht
#
    key = 'dreamer',
    loc_txt = {
        name = '{C:red}Dreamer{}',
        text = {
            'When a {C:attention}Blind{} is skipped, {C:green}1 in 6{} chance to spawn {C:rare}Frog Guy{}'
        }
    },
    atlas = 'dreamer',
    pos = { x = 0, y = 0 },
    rarity = 'silly_unobtainable',
    cost = 1,
    unlocked = true,
    discovered = true,
    config = { extra = { odds = 4, } },

    loc_vars = function(self, info_queue, card)
        info_queue[#info_queue+1] = {key = 'silly_dreamer', set = 'Other', vars = { "ENA" }}
    end,

    calculate = function(self, card, context)
        if context.skip_blind and not context.blueprint then
            if (pseudorandom('silly_dreamer') < G.GAME.probabilities.normal / card.ability.extra.odds) then
                    SMODS.add_card { key = "j_silly_fiction" }
            end
        end
    end
}```
is this right?
#

@manic rune

manic rune
#

seems like it, yeah

#

does it still not work?

brittle yacht
#

im testing now

#

yeah still not working

manic rune
#

:3 am i missing something obvious here

brittle yacht
#

idk

red flower
#

i didnt see, did you test without the pseudorandom?

brittle yacht
#

i ont have any red squiggly lines

primal robin
#

Am I only one who so lazy so not using lsp at all trash

red flower
#

i use lsp because i lazy

brittle yacht
#

IT WORKS

#

we are good

#

thanks gang

thick drift
#

I've been trying to make a consumable that increases the number of uses (same implementation as Seltzer) available for a joker, but it doesn't seem to actually modify the joker's variables.

        for j in pairs(G.jokers) do
            if j.name == 'Slingshot' then
                G.E_MANAGER:add_event(Event({
                    trigger = 'after',
                    delay = 0.4,
                    j:set_ability(j,j.ability.extra.hands+card.ability.extra.use_mod),
                    j:juice_up(0.3, 0.4),
                }))
            end
        end
    end```
red flower
#

oh and pairs(G.jokers) too

#

let me rewrite it

thick drift
red flower
#

there's a lot wrong there haha

#

the event is also wrong

near heart
#

reight now im trying to make a joker that makes gold cards trigger every hand you play. to do this, im making it give $3 whenever a gold card is detected after playing a hand. however, this makes it so gold cards also trigger an additional time when its the last hand (this is unwanted). ive tried making it only work when its not context.end_of_round but it doesnt work because it triggers before the context would be true. ive also tried making sure the current chips do not exceed the blinds chip requirement, but this also doesnt work because it triggers the gold cards before jokers are scored. is there a context for triggering held cards after jokers are scored (or another way of doing this entirely)?

red flower
# thick drift that's what I tried first but the code kept underlining it red, so I'm not sure ...
use = function(self, card, area, copier)
    for _, joker in ipairs(G.jokers.cards) do
        if joker.config.center.key == 'j_modprefix_key' then -- replace for your mod's prefix and joker key
            joker.ability.extra.hands = joker.ability.extra.hands + card.ability.extra.use_mod
            joker:juice_up(0.3, 0.4)
        end
    end
end

this is even simpler:

use = function(self, card, area, copier)
    for _, joker in ipairs(SMODS.find_card('j_modprefix_key')) do -- replace for your mod's prefix and joker key
        joker.ability.extra.hands = joker.ability.extra.hands + card.ability.extra.use_mod
        joker:juice_up(0.3, 0.4)
    end
end
knotty orchid
#

Hey! When creating a new booster pack, I have 2 questions.
1- How do I create the "Raimon" pool as in this example, as it crashes right now.
2- How do I disable standard cards from showing

local Raimon = {
    name = "Raimon Pack",
    key = "team_pack_raimon",
    kind = "Team",
    atlas = "Boosters01",
    pos = { x = 0, y = 0 },
    config = { extra = 3, choose = 1, c_keys = {}},
    cost = 4,
    order = 1,
    weight = 100,
    draw_hand = true,
    unlocked = true,
    discovered = true,
    create_card = function(self, card, i)
        return create_card("Raimon", G.pack_cards, nil, nil, true, true, nil, nil)
    end,
    loc_vars = function(self, info_queue, card)
        return { vars = { card.config.center.config.choose, card.ability.extra } }
    end,
    group_key = "k_team_pack",
}
thick drift
red flower
knotty orchid
#

Oh I see, SMODS.ObjectType is missing. I'm using pokermon and cryptid as examples right now so don't really know if this is old

red flower
#

oh yeah then it's not old, cryptid's system is just overly complicated for most mods haha

brittle yacht
#

how do i make shaders for an edition

knotty orchid
#

ty

normal crest
#

Should be just in the smods.edition page actually

chrome widget
normal crest
#

Good morning

jolly shadow
#

so im noticing this is causing Joker to be in the shop like 100% of the time what do i do to fix that

rotund sable
#

isn't weight 1 equal to 100% chance for it to spawn?

normal crest
#

It shouldn't

normal crest
brittle yacht
jolly shadow
brittle yacht
jolly shadow
red flower
brittle yacht
#

atlas = 'Joker', pos = { x = 0, y = 0 }

jolly shadow
#

is there a way for me to just,not add weight to it if theres none of that rarity available ?

normal crest
#

You can change that if you want

near heart
red flower
jolly shadow
#

💀

red flower
brittle yacht
#
-- -- Smoky
SMODS.Edition {
    key = 'smoky',
    loc_txt = {
        name = 'Smoky',
        label = 'Smoky',
        text = {
            '{X:mult,C:white}x2{} Mult',
        }
    },
    shader = "smoky",
    in_shop = true,
    weight = 10,
    config = { x_mult = 2, trigger = nil },

    get_weight = function(self)
        return G.GAME.edition_rate * self.weight
    end,
    loc_vars = function(self, info_queue)
        return { vars = { self.config.x_mult } }
    end,
    calculate = function(self, card, context)
        if
            (
                context.edition
                and context.cardarea == G.jokers
                and card.config.trigger
            ) or (
                context.main_scoring
                and context.cardarea == G.play
            )
        then
            return { x_chips = self.config.x_mult }
        end
        if context.joker_main then
            card.config.trigger = true
        end

        if context.after then
            card.config.trigger = nil
        end
    end,
}


-- Shaders
-- -- Smoky Shader
SMODS.Shader({ key = 'smoky', path = 'smoky.fs' })```
knotty orchid
#

Is there a way to change the weight of a booster for example if you have X joker?

normal crest
#

I mean edition

brittle yacht
# normal crest Try defining the shader before the joker
-- -- Smoky
SMODS.Shader({ key = 'smoky', path = 'smoky.fs' })

SMODS.Edition {
    key = 'smoky',
    loc_txt = {
        name = 'Smoky',
        label = 'Smoky',
        text = {
            '{X:mult,C:white}x2{} Mult',
        }
    },
    shader = "smoky",
    in_shop = true,
    weight = 10,
    config = { x_mult = 2, trigger = nil },

    get_weight = function(self)
        return G.GAME.edition_rate * self.weight
    end,
    loc_vars = function(self, info_queue)
        return { vars = { self.config.x_mult } }
    end,
    calculate = function(self, card, context)
        if
            (
                context.edition
                and context.cardarea == G.jokers
                and card.config.trigger
            ) or (
                context.main_scoring
                and context.cardarea == G.play
            )
        then
            return { x_chips = self.config.x_mult }
        end
        if context.joker_main then
            card.config.trigger = true
        end

        if context.after then
            card.config.trigger = nil
        end
    end,
}```
normal crest
#

Same crash?

brittle yacht
#

yeah

#

i have a smoky.fs btw

normal crest
#

What does your fs file look like

brittle yacht
#

so its not that

#

i blantently ripped this from yahimod and made some adjustments

normal crest
brittle yacht
#

oops

#

mmk it works thank you

wintry solar
#

Yeah shaders are a bit weird in that regard

sonic cedar
#

how to check if your area doesnt contain a specific joker?

#

also good afternoon

brittle yacht
#

how do i make a joker destroy itself if another joker has a specific edition

brittle yacht
sonic cedar
brittle yacht
#

<@&1133519078540185692>

knotty orchid
#

What a speed

brittle yacht
#

thank you

sonic cedar
#

oh it was here too?

brittle yacht
#

mods get free sinkhole token

sonic cedar
#

it was in moddingchat

modern kindle
# sonic cedar it was in moddingchat

they usually check for channels that can be chatted in and then send messages through those, so usually if its in one itll make its way to another given enough time

sonic cedar
#

i see

modern kindle
#

also hi toma

sonic cedar
sonic cedar
modern kindle
#

ive decided im winning my balala run

#

paired with brainstorm

sonic cedar
#

oh my god

brittle yacht
modern kindle
#

whats the matter

thick drift
#

appropiate pack name fr

modern kindle
#

i had to grind to get him here

sonic cedar
#

bro is balaling it

modern kindle
#

i fear my run will end soon nonetheless

brittle yacht
#

how do i make a joker destroy itself if another joker has a specific edition

glass crown
#

is there somewhere that you set the id number of a modded rank? or is it automatically set somehow? or should i do the id differently than a number? (yes i know the below is just idenitifying aces, its just here to like show whati m talking about basically)
context.other_card:get_id() == 14

thick drift
#

you mean it's priority? It should be part of the json

#

it's id is also set in the json file

sonic cedar
thick drift
modern kindle
red flower
brittle yacht
dreamy thunder
#

?

red flower
brittle yacht
dreamy thunder
brittle yacht
brittle yacht
brittle yacht
dreamy thunder
#

i mean you could put it in calculate yes

brittle yacht
#

so what if i wanted a custom edition?

dreamy thunder
# brittle yacht mmk

if you put it in calculate and dont specify a context its going to trigger for every action you do in game
-# i think
and if you put it in update its going to trigger every frame

brittle yacht
lucid owl
#

<@&1133519078540185692>

modern kindle
#

<@&1133519078540185692>

dreamy thunder
#

damn

modern kindle
#

shoot him

lucid owl
#

haha i did it first

brittle yacht
#

what

brittle yacht
modern kindle
dreamy thunder
#

dilly late

#

rip

modern kindle
#

im about to intervene on a cosmic level

dreamy thunder
#

understandable

lucid owl
#

oh dear

dreamy thunder
#

i have so many functions

#

i dont need most of them

modern kindle
#

nah trust you need em all

dreamy thunder
brittle yacht
modern kindle
dreamy thunder
brittle yacht
dreamy thunder
brittle yacht
# dreamy thunder code?
    key = 'frog_guy',
    loc_txt = {
        name = '{C:#000000}Frog Guy{}',
        text = {
            '{X:mult,C:white}X3{} Mult',
            'Destroys if any Jokers have the {C:inactive}Smoky{} Edition (UNFINISHED)'
        }
    },
    atlas = 'frog_guy',
    pos = { x = 0, y = 0 },
    rarity = 3,
    cost = 7,
    unlocked = true,
    discovered = true,
    pools = { ['SillyPool'] = true },
    config = { extra = { Xmult = 3, } },

    loc_vars = function(self, info_queue, center)
        info_queue[#info_queue + 1] = { key = 'silly_dreamer', set = 'Other', vars = { "Froggy" } }
        return { vars = { center.ability.extra.Xmult } }
    end,

    calculate = function(self, card, context)
        if context.joker_main then
            return {
                card = card,
                Xmult_mod = card.ability.extra.Xmult,
                message = 'X' .. card.ability.extra.Xmult,
                colour = G.C.MULT
            }
        end

        for _, v in pairs(G.jokers.cards) do 
            if v.edition and v.edition.silly_smoky then 
                SMODS.destroy_cards(card)
                play_sound('silly_cough', 1, 1)
              end
        end
    end
}```
violet gull
#

how do i do ^^^^ with talisman

brittle yacht
dreamy thunder
#

i was afk

brittle yacht
#

ah

dreamy thunder
#

me a sec

#

gimme*

dreamy thunder
brittle yacht
#

js want me to put it in update?

dreamy thunder
#

that wouldnt change it

brittle yacht
#

hmmm

wintry solar
dreamy thunder
dreamy thunder
brittle yacht
wintry solar
brittle yacht
wintry solar
#

It’s not within a context check so it’ll recursively trigger from destroying the cards iirc

lucid owl
#

it's not in a context so it triggers basically at everything

#

which essentially causes an avalanche

dreamy thunder
#

E manager

#

could fix it though

lucid owl
#

or just put it in a context

#

it won't be immediate but i think destroying immediately wouldn't be smart anyways

wintry solar
#

It’s destroy as soon as you click a card 🤣

lucid owl
#

yeah lol

brittle yacht
#

what

dreamy thunder
brittle yacht
dreamy thunder
#

so it just

lucid owl
#

calculate is a function called at essentially every action, and if you don't put in a context it'll trigger at everything

#

this causes what's basically an explosion in the code

#

so you should probably figure out a context to throw it in

dreamy thunder
#

^this is true

brittle yacht
dreamy thunder
#

no

#

context

lucid owl
dreamy thunder
#

context.setting_blind for example

lucid owl
#

that would make it be called every frame which again, you don't want

jolly shadow
#

how would i go abt having a joker make certain rank cards be drawn first

dreamy thunder
#

if you still dont want to put it in a context figure out a way to make it trigger once

brittle yacht
lucid owl
#

update is another function, a context is something like context.joker_main

dreamy thunder
#

so it doesnt crash

lucid owl
brittle yacht
#

so what context would it go into

#

hmmmm

lucid owl
#

just depends on when you want it to destroy

#

context.setting_blind makes sense to me

dreamy thunder
#

^

wintry solar
#

It’d be fine in update

#

I think the crash is specifically because destroying cards calls calculate again

brittle yacht
#

nah we good

wintry solar
#

To check if they’re eternal or not

brittle yacht
#

it's fine

lucid owl
#

probably would be a bit less satisfying for them to be destroyed immediately

#

oh yeah you should probably not destroy eternals

dreamy thunder
#

you could make a check or something too idk

jolly shadow
#

how would i make aces be prioritized when drawing cards

red flower
wintry solar
#

The eternal check is handled for you

formal parrot
dreamy thunder
#

i've been using card:start_dissolve() 😔

red flower
#

it's pretty new

lucid owl
jolly shadow
lucid owl
#

what the hell

#

this is a saga

jolly shadow
#

yes

sonic cedar
#

n when are you updating vanillaremade to use the new probability context troll_4k

dreamy thunder
#

doesnt it

#

already use it

red flower
#

i merged it like 10 minutes after the update

lucid owl
#

lol

jolly shadow
#

ty for the recommendation tho

red flower
#

speaking of, im cooking

sonic cedar
sonic cedar
red flower
modern kindle
#

you did a great job trying though!

red flower
#

did i

modern kindle
#

yes because you are beautiful and perfect and smart

red flower
#

thank you dilly

modern kindle
#

:D

wooden nexus
#

Gonna revive this idea

#

Probably expand it past Tag Cards too

sonic cedar
#

or vice versa

#

oh right

#

@wooden nexus

#

i hope this makes sense

jolly shadow
lucid owl
jolly shadow
#

ya i moved that around

#

what i have now

wooden nexus
lucid owl
#

i t hink that else referring to drawing the cards by default needs to be part of the logic that handles SMODS.find_card()

#

as in, you want to move the end after the else statement, to before it

#

and format from there ofc

#

actually i may be wrong, hm

lucid owl
jolly shadow
#

it doesnt ;;

#

after adjusting this too

sonic cedar
red flower
modern kindle
#

see how smart you are

red flower
#

true!

modern kindle
#

=]

snow vale
#

ik i have ts wrong, but idk what nor how to fix it

red flower
red flower
modern kindle
snow vale
red flower
#

what's the intended effect?

snow vale
#

to give $1 for every 50% of the blind requirement you've scored in the first hand

#

actually

#

id prefer it not to be just for the first hand

red flower
#

is that solved then

snow vale
#

not yet

#

i've scored 360/300 in 1 hand, and got $60 instead of $2

#

ig the math is wrong

#

yeah % is not the correct operator

ionic cobalt
#

isnt that modulo

snow vale
#

yeah

red flower
#

yeah it would be division

ionic cobalt
#

just divide by 100

snow vale
#

but that could give me 0.5 money or smthing?

limber blaze
#

does anyone remember what the fix is for these weird lines on sprites ingame

ionic cobalt
#

round then

snow vale
#

and yeah how to round in lua

ionic cobalt
#

ceiling or floor

limber blaze
#

or round that exists too

#

math.round

ionic cobalt
#

yeah

red flower
limber blaze
#

huh

#

could have sworn it existed

red flower
#

i think its in other lua versions

snow vale
limber blaze
#

i mean math.floor(x+0.5) is the same thing anyway

ionic cobalt
floral narwhal
#

how can show this long number. in game this number transforms to 3.14

ionic cobalt
#

isnt that how round was defined

red flower
floral narwhal
foggy ginkgo
#

When will factorial be real 🥀

#

Wrong chat

red flower
ionic cobalt
#

bruh

floral narwhal
#

k. thanks

foggy ginkgo
#

Actually is factorial a thing or did people already have this conversation already

red flower
#

factorial as in factorial mult?

foggy ginkgo
#

Yeah

#

I think Nxkoo did it before

red flower
#

i mean it's a thing in that you can do it but i dont think theres a api for it

#

i dont keep updated with talisman tho

foggy ginkgo
#

Sigh

#

Screw Talisman

red flower
#

factorial without talisman would just be instant naneinf most of the time

foggy ginkgo
#

That's fair

#

Is there a way to calculate the rounds

#

To detect the number in rounds

#

I can't words

#

To detect the number on what round you are on

daring fern
foggy ginkgo
#

Makes sense

red flower
#

god my keyboard has a hard time responding today

#

ironically enough the n key is barely working

wary blaze
red flower
#

Can we see the code? Also while it is allowed, I would recommend asking in the JokerForge thread instead

wary blaze
#

Whoops, hand't even checked to see if there was a JokerForge thread

#

Will move there

vast bough
#

hello modding dev

#

what is the point of having a primary and a secondary colour for consumable set. i was told that one is the text colour and the other is the badge colour but after some testing, i cant see that at all

#

getting rid of secondary colour crashes because its a required field, but what is its purpose

daring fern
vast bough
#

the root of my question is, to simplify the process, should i only have a colour wheel for secondary colour and not primary colour when creating a new consumable set in joker forge

#

and then the code can hardcode primary to be like #fff or something

daring fern
foggy ginkgo
#

Is it possible to square root or power

broken rivet
#

math.sqrt() and ^

daring fern
foggy ginkgo
#

Thank you

#

I knew about power but not squaring

ripe kestrel
#

how can i create a random joker kinda like judgement

daring fern
ripe kestrel
#

thx

jolly shadow
#

lowk half the headache was having to listen to the alibi remix the whole time hdfghfdg

#

tedious playtesting

daring fern
jolly shadow
#

hooked draw_card

jolly shadow
#

can someone help me make a config tab? it only needs to have one toggle, having trouble understanding how to do that

glass crown
#

how would i get a count of the amount of cards of a certain rank in my deck?

fossil nebula
#

I made a tarot card that gets rid of some of the required score, is there a way to create a gif on the score that will destroy itself after it's done playing?

red flower
fossil nebula
#

in simpler terms I want to create an explosion on the score after the card is used

jolly shadow
glass crown
jolly shadow
jolly shadow
red flower
# jolly shadow ui
SMODS.current_mod.config_tab = function()
    return {
        n = G.UIT.ROOT,
        config = { r = 0.1, minw = 8, align = "tm", padding = 0.2, colour = G.C.BLACK },
        nodes = {
            {
                n = G.UIT.R,
                config = { padding = 0.2 },
                nodes = {
                    {
                        n = G.UIT.C,
                        config = { align = "cm" },
                        nodes = {
                            {
                                n = G.UIT.R,
                                config = { align = "cm", padding = 0.01 },
                                nodes = {
                                    create_toggle({
                                        label = "Text",
                                        ref_table = SMODS.Mods["modid"].config, -- replace your mod id
                                        ref_value = 'config_name' -- replace for your config name in config.lua
                                    })
                                }
                            },
                        }
                    },
                }
            },
        }
    }
end
sonic cedar
#

How can I have a calculate_effect target a joker added within the same event?

red flower
#

wdym by target?

#

like add a message to that joker?

sonic cedar
#

yes

#

i have the calc effect in there so i can do a message

jolly shadow
#

add an event after the joker's added?

red flower
sonic cedar
red flower
#

yes

sonic cedar
#

got it

sonic cedar
modern kindle
#

youre all good

sonic cedar
#

hi dilly

modern kindle
#

bestie westie

#

hi

#

i spent one hundred dollars on food

sonic cedar
#

why

modern kindle
#

hungie

sonic cedar
#

damn 😭

modern kindle
#

hi smt i hope youve had a splendid day today

red flower
#

im writing effects :3

modern kindle
#

you give me the joy_effect every time i see you

jolly shadow
red flower
#

im joy_normal about you

modern kindle
#

D:

modern kindle
jolly shadow
#

no

#

i am edward robinson

modern kindle
#

Idk who Edward Robinson is

harsh bobcat
#

How do I make one of these? The G.P_CENTERS.m_e"nhancement". (I tried searching for it; hence the 3 instead of e)

daring fern
harsh bobcat
#

I meant the

#

G.P_CENTERS. where does it come from?

daring fern
pure salmon
#

game is crashing because outgoing_joker is nil despite a valid outgoing_joker_key

daring fern
pure salmon
#

yeah

daring fern
pure salmon
#

oh, nevermind

#

i think i found the issue

jolly shadow
#

gb_find_eligible_shatters() is empty perhaps?

pure salmon
#

gb_find_eligible_shatters() was returning the key of the shattered joker and not of the original joker

jolly shadow
#

quit with the reactions we get it

modern kindle
#

Reactions are kinda his thing
You get use to it

normal crest
#

Yeah he is very shy

modern kindle
#

But we like him anyway

red flower
#

first time i get to #21#

normal crest
#

new record

modern kindle
#

Can you get to 100

red flower
#

im not looking forward to the loc_vars

red flower
#

i would die

modern kindle
#

Whats the point..

harsh bobcat
#

that is what i did

daring fern
harsh bobcat
#

oh e isntead of r

daring fern
fossil nebula
#

I have a problem

#

I have a jokre that has a chance to add a specific tarot card after a jack is scored

harsh bobcat
fossil nebula
#

and if it triggers one time it gives a good card

daring fern
fossil nebula
#

but every jack after it's a diffrent random tarot card

harsh bobcat
#

so its m

daring fern
harsh bobcat
#

mm

fossil nebula
#

So in add _card

#

how do i give a specific tarot card

daring fern
vague crest
#

not sure if this is the right place to ask but, im trying to add some documentation for what my jokers all do now that the mod is out but when i go to edit this page all the actual links are gone so im not sure where to go to add a link

harsh bobcat
#

It says error loading this file

#

is there anything wrong?

red flower
#

you dont edit that page directly tho, you add a tag to your mod's page

digital trellis
#

Hi, I'm making a comic based Balatro mod and I have the first joker set up but it won't appear in game (I've tried using mods to get it and it still won't work). I'm super new to coding and am basically just copying other mods I have, but I have no idea what the issue is

digital trellis
#

of the joker or of the mod?

red flower
#

the entire mod if possible

burnt apex
#

Anyone know why vscode isn't reading definitions from a lsp folder when its in the workspace?

digital trellis
#

SMODS.Atlas({
key = "Superman",
path = "SupermanJoker1.png",
px = 71,
py = 95
}):register()

SMODS.Atlas({
key = "Batman",
path = "BatmanJoker1.png",
px = 71,
py = 95
}):register()

SMODS.Joker {
key = "Superman",
loc_txt = {
name = "Superman",
text = {
"Each Joker gives {X:mult,C:white}X#3#{} Mult"
},
},
config = {
xmult = 1.1,
odds = 1
},
unlocked = true,
loc_vars = function(card, info_queue, card)
return { vars = { G.GAME.probabilities.normal, card.ability.odds, card.ability.xmult } }
end,
locked_loc_vars = function(self, info_queue, card)
return { vars = { G.GAME.probabilities.normal } }
end,
rarity = 0,
blueprint_compat = true,
eternal_compat = true,
atlas = "jokers",
pos = { x = 9, y = 8 },
cost = 3,
calculate = function(self, card, context)
if context.other_joker and pseudorandom("Superman") < G.GAME.probabilities.normal/card.ability.odds then
G.E_MANAGER:add_event(Event({
func = function()
context.other_joker:juice_up(0.5, 0.5)
return true
end,
}))
return {
xmult = card.ability.xmult
}
end
end,
}

#

this is the main.lua folder, no idea how this works so i'm super sorry if this is complete nonsense lol

harsh bobcat
red flower
red flower
burnt apex
digital trellis
#

yes, here it is
{
"id": "CB",
"name": "Comic Balatro",
"author": "Sam",
"description": "",
"prefix": "CB",
"main_file": "main.lua",
"badge_colour": "000000",
"badge_text_colour": "ffffff",
"dependencies": [],
"version": "1.0.0"
}
the MOD is showing up in the mod menu, but the actual jokers don't appear

red flower
red flower
#

oh also is the joker not appearing at all? or is it invisible?

digital trellis
#

not appearing at all, i can't find it in collection/shop/menus

burnt apex
red flower
red flower
burnt apex
red flower
#

i think vscode settings are per-workspace

#

idk how to do it globally

broken tulip
#

so since modding chat it a trainwreck right now im gonna ask here instead, is there a way (config option, mod, etc.) to change the amount of suits shown in the deck view? like instead of deck pages it just has the other suits in the same page?

normal crest
#

What are contexts that get called very frequently, currently I have mod_probability, fix_probability, check_enhancement and check_eternal. Any I'm missing?

red flower
normal crest
#

Very frequently is not the right expression, more like, contexts for which a returned value does not immediately imply a visual effect for the player

normal crest
#

Maybe I should just check if the returned effect has a message

burnt apex
red flower
#

modify_scoring_hand sounds like that

normal crest
#

the one that lets you splash/unsplash cards right

wintry solar
#

set_debuff too

red flower
#

debuff_hand and evaluate_poker_hand also do stuff without messages but with a visual effect

wintry solar
#

oh it's debuff_hand

red flower
harsh bobcat
#

I can't for the life of me get enhancers to load.

#

I've tried loading the file from the main mod file

#

it still doesn't add the enhancers

ripe kestrel
#

how can i create a joker with both edition and stickers, like i have this SMODS.add_card({key = "j_mr_bones", but i want it to be negative, and eternal

red flower
brisk atlas
#

How do you add things to base game Jokers? (I want to add things to smeared joker)

red flower
#

(or hooking/patching the relevant functions)

hasty mist
#

God i wish there was an easier way to do this /ref

red flower
#

i hope that's just a joke lol

hasty mist
#

it is

#

lmao

glass crown
#

okay, complex question:
im trying to make a joker that when a hand is played, destroys a random card in hand of a specific suit
how would i go about doing that?

daring fern
brisk atlas
red flower
brisk atlas
#

cool

normal crest
#

Anyway

#

Would a joker triggering in post_trigger ever return something besides jokers in context.other_ret

normal crest
#

what would be an example?

brisk atlas
# red flower take_ownership https://github.com/Steamodded/smods/wiki/API-Documentation#taking...

How would I add to smeared?

local card_is_suit_ref = Card.is_suit
function Card:is_suit(suit, bypass_debuff, flush_calc)
local ret = card_is_suit_ref(self, suit, bypass_debuff, flush_calc)
if not ret and not SMODS.has_no_suit(self) and next(SMODS.find_card("j_vremade_smeared")) then
return SMODS.smeared_check(self, suit)
end
return ret
end
Is the function of smeared from vanillaremade but idk what its actually doing nor how to modify it

daring fern
normal crest
#

that would be with your mod right? What about in vanilla, is there any case

wintry solar
#

what are you trying to do srock

#

you have piqued my intereset

daring fern
brisk atlas
daring fern
normal crest
#

triggering from the perspective of the player anyway

daring fern
normal crest
#

no, it does

#

i'm skipping the cases in which it returned a table and that table didn't have a message

#

only because some jokers can return nil, true to signify they triggered

daring fern
brisk atlas
# daring fern What is the goal?

Adding functionality to smeared so Hearts, Diamonds and Swords (new suit) are all "smeared" together and adding cups (another new suit) to the dark suits

normal crest
daring fern
normal crest
#

I guess I'd just make my own context by hooking card_eval_status_text then

brisk atlas
daring fern
# brisk atlas I uh dont know what that means
Klei Entertainment Forums

In LUA, it is a very important concept to understand that everything is a variable and all variables may be edited in runtime. This includes functions. With modding other peoples' LUA files, like Klei's basegame code, you may find yourself wanting to run your code before or after the original fun...

fathom void
#

what's a good text or code editor for lua

sturdy compass
#

Visual Studio Code seems to be the default here

#

Also Aven joining dev gang? 👀

fathom void
#

perhaps

near heart
#

does in_pool = false make it so jokers cant appear in shop & wont be spawned via judgement and stuff

daring fern
#

It's in_pool = function(self) return false end

near heart
#

thanks goat

fathom void
#

i want to try adding some form of consumable to the game, havent decided on theming yet though

red flower
normal crest
#

I started to name the numerators and denominators n1 and d1 respectively once there was more than one chance in the description

normal crest
#

i know, the resulting code just looks ugly

#

I had to do it for at least 30 jokers cus of the smods update too

jolly shadow
red flower
jolly shadow
#

just me tho

red flower
#

then dont ping me if you dont want my response lmao

fathom void
#

btw is there a specific version of vsc thats good to use

red flower
#

vscodium

jolly shadow
fathom void
#

i see

red flower
jolly shadow
red flower
#

i dont like this server today, ill go back to coding

normal crest
#

you single-handedly made the modding chats worse

#

it's usually so peaceful here

hasty mist
#

how do you check if a joker is in the leftmost joker slot?

red flower
hasty mist
#

ty

chrome widget
jolly shadow
# normal crest it's usually so peaceful here

the first time i came in here talking abt my first ever joker implemented, i was fought for a while because it wasnt balanced or good in the slightest
doesnt feel like it was peaceful at all lmfao

red flower
#

hii winter how are you

chrome widget
#

Eepy

red flower
#

same

hasty mist
#

ive never had more than like #5# i think

red flower
#

also that code is for this

chrome widget
#

Okay yeah for Yugioh rules, makes sense

#

Does SMODS currently support multi-box descriptions or is that an extension you or someone else made?

red flower
#

it does!

#

also multi line names

chrome widget
#

Ooooh. I should implement them for my current mod

#

How do?

red flower
chrome widget
#

Oh, cool. Simple

normal crest
jolly shadow
#

talkin abt how i had to keep sayin its a meme joker and wasnt meant to be balanced n stuff

chrome widget
#

Anyway here's my current suit progress stuff

#

First one is for a final boss blind that obscures suits by showing alternate suits instead, second one is a blind that stops cards from scoring their base chips, third one is for a blind that makes cards have no ranks

modern kindle
#

👋

#

I like the suits

#

I just woke up from a big fat nap has everyone did big and large developments

maiden phoenix
chrome widget
modern kindle
#

Greetings eremel

hasty mist
#

if a probability is 0 in n, it always fails, right?

chrome widget
#

Still haven't decided if I want the obscured suits to just kind of replace one entire suit with one entire of the bespoke suits, or if I want it to literally randomly assign every card a new suit which is a lot more chaotic

modern kindle
#

Make it random each blind, replace 1 to 4 suits

wintry solar
#

Hello dilly

modern kindle
#

I do be silly

wintry solar
#

Look at my silly phone

wintry solar
modern kindle
#

Process of elimination would tell people the suit if its less i suppose

daring fern
#

When a function is called, is it possible to see where it was called from?

chrome widget
#

No what i mean is, it either does two things

  • Replaces every suit with one entire new suit randomly (I.E. Hearts becomes Masks, Diamonds becomes Arrow, etc, choices change every time you play the blind
  • Replaces every card individually with a new suit randomly
#

One is easier to parse over multiple hands, you can determine which suit is which. The second is a lot harder

modern kindle
#

I think i like the individual approach myself more

chrome widget
#

It is a final boss blind, but some are def harder than others (for example I've only ever had a close call with Cerulean Bell as a result of its effect like once in 1000 hours)

#

So I'm not sure what difficulty level I want to go with

wintry solar
#

Yeah individually sounds better, I’m not sure that replacing entire suits makes much difference

#

I am assuming they will still trigger standard suit effects though

hasty mist
#

sorry for posting a syntax error here, but i dont quite understand why this is failing, lua extension isnt helping me, it TELLS me there's a syntax error though but i dont know how to fix it, ive genuinely tried doing so many different things

unborn bay
#

why is there an end to your elseif the first two times

#
if something then
elseif something_else then
end
hasty mist
#

i think the brackets were tripping me up

normal crest
#

which should be builtin

wintry solar
#

The error stack trace does so it’s definitely in there somewhere

hard flume
#

Hiii

thorn furnace
#

hiii

wooden nexus
#

Dumb question, if I have math.random(0, 9), does it include 0 and 9?

#

i forget if it's inclusive inbetween or exclusive

scarlet imp
#

pretty sure its inclusive

wooden nexus
#

alright, and if i have {"Spades", "Hearts", "Clubs", "Diamonds"}, I assume Spades = 1 in the list, right?

thorn furnace
#

pseudorandom_element is probably easier there

scarlet imp
#

true

thorn furnace
#

math.random is inclusive tho

Finally, we can call random with two integer arguments, l and u, to get a pseudo-random integer x such that l <= x <= u.

wooden nexus
#

ok one moment

lucid owl
#

oh my god lmfao

#

ignore

#

i forgot to copy over the file with the hook

hasty mist
#

how do i actually concatenate this

red flower
#

the syntax looks correct

#

whats the problem

hasty mist
#

wait what the fuck

#

hold on

#

i misread

#

what is causing this

daring fern
hasty mist
#

is there a difference

daring fern
#

It goes before everything else.

#

And it ignores joker order.

manic rune
#

would an event with SMODS.calculate_effect helps 🤔

#

-# im just curious

daring fern
daring fern
manic rune
#

aw

#

thanks

hasty mist
#

ill try returing then

#

okay it still returns nan

daring fern
daring fern
hasty mist
#

heres the new code

#

its a return now

#

but its still doing nothing

hasty mist
#

this is what ive done

lucid owl
#

why is this hook seemingly not actually activating?

hasty mist
#

it still returns nan (or just zero sometimes) but it also just isnt even doing anything on chips anymore either now

daring fern
lucid owl
#

agh, you're right

#

well i guess going for a universal hook won't work

wild escarp
#

Are there any good references for a joker delete/add effect? I want a consumable to delete a chosen card and then replace it with the upgraded version.

jolly shadow
#

id look into vanillaremade stuff, id probably look at the stuff for DNA joker (create card)and that one tarot card that destroys 2 cards

#

if ur specifically looking to make a joker card tho id look into that one that makes 2 common jokers at blind select

twilit cargo
#

anyone got any idea why this isnt working? my joker has a random chance to debuff a whole hand, but i dont want to keep them debuffed for the rest of the game & also it changes sprite at the same time - im trying to go through all cards, check if theyre debuffed and remove the debuff and return the sprite n stuff back to normal

twilit cargo
final jewel
#

why does the probability don't upgrade to 2/3 2/7 and 2/10 ?

normal crest
normal crest
# final jewel

you need to use SMODS.get_probability_vars in your loc_vars

normal crest
#

maybe just try passing nil instead of false

twilit cargo
#

ive tried context.final_scoring_step too but it never seems to reach the code, when using sendInfoMessage i wasnt gettitng anything

#

oops

normal crest
#

Is your card's sprite changing at least

twilit cargo
#

nop

normal crest
#

ah, you have your context.end_of_round check inside the context.repetition if statement

twilit cargo
#

OH

#

indentation was goofed omg thank you

final jewel
daring fern
#

It does that for you.

final jewel
#

oh ok

#

So smods is soo cool

#

it does everything for me

twilit cargo
#

seperate question does anyone know where to even start with making dynatext localiseable (???? is that a word)

normal crest
#

what does your dynatext definition look like

twilit cargo
#

its horror i cant really fit it in one screenshot, its basically just manually assembling the whole description based on lines and individual colours 😭

#

my idea was to make a function where u pass an array from the loc file thats formatted like a regular description, then that structures the object but id like to know if theres a better approach bc i dont really know what im doing here lmao

normal crest
#

which part of this do you want to localize

twilit cargo
#

whole desc

#

im not translating it so ive been asked to take into consideration discrepancies with how long the descriptions will be in other languages too

hasty mist
#

trying to figure out why this makes score become nan

normal crest
#

but you can put it under misc in the localization file

twilit cargo
#

its aight i dont really know how to explain it 😭 ill try making the function as a proof of concept

normal crest
#

Wait

normal crest
#

unless you were looking for something else

twilit cargo
#

useful tyty

normal crest
#

actually you can just put it under dictionary instead of "some_name", and then you can do localize('some_other_name') which is a bit shorter and more convenient

jolly shadow
normal crest
#

those were some very depressing discards

sonic cedar
#

hi moddingdev
goodnight moddingdev

normal crest
#

hi toma

#

goodbye toma

chrome widget
near heart
#

how might one spawn a specific joker
i tried SMODS.add_card([joker key]) but thats not working and is causing a crash

normal crest
#

should be SMODS.add_card { key = 'j_prefix_key' }

near heart
#

ah ok i missed the key part

#

thanks

near heart
daring fern
foggy ginkgo
#

What's changing rank and giving seals again

daring fern
rough furnace
#

You can get the key by hovering over your joker and running eval dp.hovered.config.center.key in the DebugPlus console

foggy ginkgo
near heart
#

k yeah it works now

near heart
foggy ginkgo
#

Is SMODS.change_base talisman support or am I doing something wrong

#

SMODS.change_base('2')

Is it like this or different

daring fern
foggy ginkgo
#

Ah

daring fern
#

It doesn't know what to change if you don't give it the card.

foggy ginkgo
#

Right

foggy ginkgo
daring fern
foggy ginkgo
#

Thank you

#

The goat as always

glass scaffold
#

Is there a way for me to restrict Jokers in an ObjectType from appearing in Shops naturally?

glass scaffold
#

I have this currently.

glass scaffold
daring fern
daring fern
# glass scaffold Yes

Just put in_pool = function(self) return false end in the definitions of those jokers.

foggy ginkgo
#

Do you know why when I set an edition the audio is always delayed and plays the noise when the score is done

#

Or is that just a Balatro thing

daring fern
foggy ginkgo
#

If context.individual

#

Those are events rifht

#

I'm tripping

daring fern
foggy ginkgo
#

Oh yeah

#

It is

daring fern
foggy ginkgo
#

G.E_MANAGER:add_event(Event({
func = function()
other_card:juice_up()
other_card:set_edition('e_polychrome')
other_card:set_ability('m_steel')
return true
end
}))

daring fern
foggy ginkgo
#

Oh

#

Cool

#

What's the nil and true representing

daring fern
foggy ginkgo
#

Ah

glass scaffold
#

Well, no crashes, but not spawning the correct Jokers. Where'd I screw up?

glass scaffold
foggy ginkgo
#

Are they not appearing in the pack or is the pack not spawning

glass scaffold
foggy ginkgo
#

What does appear

#

Jimbo?

glass scaffold
#

Yep.

foggy ginkgo
#

<@&1133519078540185692>

glass scaffold
#

<@&1133519078540185692>

#

JUMP THEM

livid scroll
#

🔫

foggy ginkgo
#

Thank you my goat

polar tulip
#

Nope!

polar tulip
glass scaffold
foggy ginkgo
#

Trying to figure it out

#

Not pro like the others

foggy ginkgo
#

From the create card section

#

Just this

#

create_card = function(self, card)
return {
set = "GAP_Jokers",
skip_materialize = true,
area = G.pack_cards,
}
end,

#

Question mark

#

It's a maybe

glass scaffold
#

Well... that didn't work

foggy ginkgo
#

Hm

vague crest
#

is there a way to check if a playing card returns a certain value? looking to check if a card gives money in any context (held in hand, being played, from a joker like business card, gold seals, etc)

foggy ginkgo
#

Not a gamer like they are

normal crest
glass scaffold
normal crest
#

What card spawned

glass scaffold
#

Jimbo. Again.

normal crest
#

what card did you put as default

glass scaffold
#

Another Joker from my mod.

glass scaffold
normal crest
#

What shows up if you do eval G.P_CENTER_POOLS.GAP_Jokers with debugplus

daring fern
normal crest
#

you mistyped it

glass scaffold
#

Ah. I see the issue now...

#

It just doesn't exist apparently.

normal crest
#

And are those jokers being created before the object type definition

glass scaffold
normal crest
#

my guess is that you have the wrong key

daring fern
jolly shadow
#

how would i go about making a booster pack only create jokers of a certain custom rarity

normal crest
#

you can specify the rarity in what you return from create_card

glass scaffold
#

Now it's working

normal crest
#

oh okay, so you had the wrong key in the pool the entire time

#

lol

jolly shadow
#

i set my booster pack's name in the loc_txt but it says error as the name

everything else functionsthough

jolly shadow
#
SMODS.Booster {
    key = "alibi_pack_1",
    weight = 0.6,
    kind = 'eddy_alibi',
    cost = 4,

    loc_txt = {
        name = "Alibi Pack",
        text = {
            "Choose {C:attention}#1#{} of up to",
            "{C:attention}#2#{} {C:eddy_alibi}Alibi{C:joker} Jokers{}",
        }
    },

    atlas = "Boosters",
    pos = { x = 0, y = 0 },
    config = { extra = 2, choose = 1 },

    group_key = "k_alibi_pack",
    loc_vars = function(self, info_queue, card)
        local cfg = (card and card.ability) or self.config

        return {
            vars = { cfg.choose, cfg.extra }
        };
    end,

    ease_background_colour = function(self)
        ease_background_colour_blind(G.STATES.BUFFOON_PACK)
    end,

    create_card = function(self, card, i)
        return { set = "Joker", area = G.pack_cards, skip_materialize = true, soulable = true, key_append = "eddy_alibi", rarity = "eddy_alibi" }
    end,
}
manic rune
#

why is it crashing when the joker is retriggered

normal crest
#

can you send the enire crash

manic rune
#

sure, one sec

#

im pretty sure its when the joker is retriggered specifically, because it doesnt crash when its not retriggered by anything
-# i wonder why

jolly shadow
normal crest
#

Honestly I think this is an issue with steamodded

normal crest
jolly shadow
#

kk ty

jolly shadow
manic rune
#

this is how i retriggered the joker if it helps

normal crest
manic rune
#

which, i kinda doubt its wrong 🤔

#

the funny thing is that this is seele and bronya synergy 😭

#

it seems they arent meant for each other after all

jolly shadow
daring fern
jolly shadow
#

ohh ok

#

works now ty

hasty mist
normal crest
#

For some reason retriggering jokers during context.repetition causes this

manic rune
#

mhm, im guessing the not context.retrigger_joker check is not working properly here

#

since removing it wont crash the game anymore, although it retriggers like 5 times instead of 1 but thats probably unrelated :3

hasty mist
manic rune
faint urchin
#

I'm getting this issue: Could not open file resources/sounds/ckl_sure.ogg. Does not exist. does anyone know how to fix

local click = Controller.L_cursor_press
Controller.L_cursor_press = function(self, x, y)
    click(self, x, y)
    if G.GAME.blind and G.GAME.blind.name == "The Mark" then
        play_sound('ckl_sure')
    end
end
jolly shadow
manic rune
#

it should be play_sound("modprefix_key")

faint urchin
normal crest
#

Are you using smods

faint urchin
#

yes but the thing is in a hook so i'm wondering if it's not picking up that it should be using the smods function

normal crest
#

Can you show your SMODS.Sound definition

bold gyro
#

hey y'all, i'm trying to search through all extra variables in a joker and set any that contain "odds" to 1. for some reason, joker_left.ability.extra.k does nothing. how do i fix this?

for k, v in pairs(joker_left.ability.extra) do
          if string.match(k, "odds") then
            print("success!")
            print(k) --prints the correct index
            print(joker_left.ability.extra.k) --prints nil
            print(joker_left.ability.extra.odds) --prints the correct value
            joker_left.ability.extra.k = 1 --does nothing
            odds_count = 1
          end
        end
faint urchin
manic rune
#

the path looks wrong

#

it should only be sure.ogg

#

🤔

normal crest
bold gyro
#

thank you!

faint urchin
hasty mist
#

what in the world is happening

#

this code is causing so many different issues that i cant identify

manic rune
#

one of my jokers broke too

#

:3

#

which i hope isnt on my end

#

oh yeah rock have u seen the new seele art

hasty mist
#

so, whenever this joker scores, the chips and mult both become infinity, and the score becomes nan, im losing my mind trying to diagnose this, any help would be very appreciated

normal crest
normal crest
#

🦋

bold gyro
#

does the new 'context.joker_type_destroyed' context also check for consumables being destroyed? (on the release page it says "non-playing cards")

manic rune
normal crest
#

I'm pretty confident is not a mod issue

#

I was about to get out of bed and turn on my pc to make the example but I am too comfortable

manic rune
#

i just updated smods, why does it look weird??

normal crest
#

Oh god eremel is not gonna be happy to hear that

manic rune
#

😭

#

its a bit too big isnt it

foggy ginkgo
hasty mist
manic rune
#

yeah

hasty mist
#

(i am going insane)

foggy ginkgo
normal crest
foggy ginkgo
#

FUCK TALISMAN

manic rune
#

damn.

normal crest
#

Are u able to increase the resolution

hasty mist
#

ive never been anti talisman but these past few days have made me genuinely despise it

foggy ginkgo
#

Welcome to the club

manic rune
foggy ginkgo
#

Holy shit it's real

#

I thought you were playing with me

hasty mist
#

how do i convert a joker key into it's respective title

normal crest
lament agate
#
        if context.individual and context.cardarea == G.play and not context.blueprint then
            if SMODS.has_enhancement(context.other_card, "m_stone") then
#

if i want to detect seals

#

how'd i do it

normal crest
#

Someone who knows more than we do will look at it then

lament agate
#

thats it?

daring fern
lament agate
#

oh?

foggy ginkgo
#

Uh oh

manic rune
#

actually is it .ability.seal or .seal

daring fern
manic rune
#

yeah i keep, mixing the two

daring fern
#

Or card:get_seal

manic rune
#

thanks

normal crest
#

No one knows more about seals than john seals on every

manic rune
#

true...

lament agate
#

asking the cheese master about cheese

lament agate
#

say, red seal

daring fern
molten musk
#

morning guys

lament agate
#

you know what

#

thats obvious

#

thanks

normal crest
molten musk
#

took a break for a few days

foggy ginkgo
lament agate
#

WELL

foggy ginkgo
hasty mist
#

itd be nice if it displayed its actual name

#

and not its key

molten musk
#

im back and im nearly done with the mod
2 proplems left

lament agate
#

like this right

molten musk
#

whats wrong with this?

daring fern
foggy ginkgo
normal crest
hasty mist
#

yeah

lament agate
#

THE RED IS FOR LATER

foggy ginkgo
#

Cooked

keen atlas
manic rune
#

.

#

wait wait

#

wait

#

this crash might be related to fucking talisman

unborn bay
#

nxkoo.

lament agate
#

LISTEN

foggy ginkgo
#

Cooked

molten musk
hasty mist
normal crest
daring fern
normal crest
#

So I doubt it

molten musk
#

didnt work on it since then

hasty mist
#

ive tried so many different things

manic rune
#

yeah luckily its not talisman

#

phew

unborn bay
#

but what if it was

manic rune
#

i wouldve genuinely Cash Out $4 there 😭

#

then i would have something to scream at

#

:3

foggy ginkgo
#

Everyone suddenly trying to do seals now

molten musk
#

like what is this local SomeFunction_old = SomeObject.SomeFunction SomeObject.SomeFunction = function(self, arg1, arg2)

keen atlas
# lament agate well yeah

smods lsp refer card as Card while mine have prefixes (balatro.Card), i might need to push changes

daring fern
#

Also if you made the keys of the double seal firstsealkeysecondsealkey it would be a lot easier.

manic rune
#

you know what

#

this emptied my motivation

#

i aint drawing no more 🥀

#

WHAT DO YOU MEAN I CANT USE SEELE WITH BRONYA

#

THATS ILLEGAL

#

oh yeah gotta check something, i think the retriggers dont even work properly
they do

molten musk
#

exactly '❓`

#

that was a line in the tutorial

#

the first hooking example

normal crest
molten musk
#

im looking at it and im like what the f is happening lol

normal crest
#

Don't look just at the code, there is more text