#💻・modding-dev

1 messages · Page 446 of 1

red flower
daring fern
#
for k, v in pairs(exceptions) do
    if key == v then
        key = k
    end
end
sonic cedar
#

also i completely forgot about regular pairs

undone pebble
sonic cedar
red flower
#

i like pickles

undone pebble
#

Uh well in that case I just got a crash report and it can be seen in the atachment. Anyone know what happened?

red flower
#

try updating smods

north swallow
#

there is the event attempt

red flower
#

where's... the event?

north swallow
#

you mean the event manager or

sonic cedar
north swallow
#

oh

sonic cedar
north swallow
#

oopsies

#

uhm

#

just be aware that it works

#

i cant open it again bc my pc will crash

#

i have a lot of event thingies

north swallow
#

heres event manager

#

my laptop fan is turning on im dead gangalang

red flower
#

i still don't see an event 😭

#

i mean putting the G.showhorsedeath stuff in an event instead of using delay

#

delay works with events

sonic cedar
mild grove
#

I tried adding the code from the orbital tag but the game still crashes when the tag spawns, what am i doing wrong?

mild grove
red flower
north swallow
sonic cedar
sonic cedar
north swallow
north swallow
#

who dared to speed react me

lyric blade
#

Apparently there exists something like SMODS.calculate_repetitions but I'm not sure, do you know whwere I can find it?

red flower
#

it's an internal function so you need to know what you're doing

mild grove
lyric blade
red flower
red flower
lyric blade
lyric blade
mild grove
red flower
#

idk what you want to do or what you know

quiet bear
#

when a card or joker activates, it shows a little diamond with the effect in it. how to I make it under the triggering joker?

sonic cedar
#

card = card if it isnt doing it automatically i guess??

red flower
#

message_card = card

quiet bear
#

oh i see

#

thank you

sonic cedar
#

i forgot "message" i knew it was off,,

sonic cedar
lament agate
#

how do you detect someone if they enter a shop

sonic cedar
#

youve gotta be fw me rn

north swallow
#

OK SO I ACTUALLY DECIDED TO READ

quiet bear
#

does lua support else / ifelse statements?

north swallow
#

AND FOUND ON N' WAS TALKING ABOUT AN EVENT MANAGER

#

NOT LIKE

#

A TICK MANAGER

#

OOPS

#

WELP

unkempt thicket
north swallow
#

anyways this ended up working so thanks yall ^^

viral ember
#

is there any way to have a seal give extra mult?

pallid sleet
#

is there something to view the variables for thing in balatro ? like to see the diferent things i can use to calculate with?

viral ember
#

I've been going crazy for way too long

pallid sleet
#

also could I trigger a discard AFTER a hand is played?

#

like having a joker that has a chance to do that

pastel kernel
#

Wish me luck everyone

pallid sleet
#

yesh!

brazen tusk
#

On an iPad???

quiet bear
#

why did LocalThunk think making the code to call editions and seals different?

#

like why did he think this was a good idea?

lament agate
unkempt thicket
#

There isn't a context for that but you can make a short lovely patch for one [[patches]] [patches.pattern] target = "game.lua" pattern = "G.CONTROLLER:snap_to({node = G.shop:get_UIE_by_ID('next_round_button')})" position = "before" match_indent = true payload = ''' SMODS.calculate_context({ entering_shop = true, }) '''

merry raven
#

I want to change the background colour of my boss blinds without it changing back to the default colour
Must I use Trance for this?

pastel kernel
unkempt thicket
red flower
#

at least 6 months ago

unkempt thicket
#

They really need to update the wiki

sturdy compass
#

Gonna shoot this here too since it's more active rn

subtle merlin
pallid sleet
#

whats the wiki? i shoudl vieweth it

pallid sleet
#

thx

unkempt thicket
lament agate
sonic cedar
#

-# hi astraaaaaaaaaaa

pallid sleet
subtle merlin
sturdy compass
#

-# hi tomaaaaaaaaaaaa

lament agate
#

fuck

#

im SO stupid

sturdy compass
lament agate
#

hiii astra

sturdy compass
#

I have no clue what the coding standards for that project are lmfao

sturdy compass
sonic cedar
subtle merlin
lament agate
#

also

#

whats the context for

#

if you have this joker

#

in your slot

sturdy compass
lament agate
unkempt thicket
#
if has_joker then```
sonic cedar
sturdy compass
sonic cedar
subtle merlin
sturdy compass
#

I would be such a bad trip sitter lmfao

lament agate
#

:3

unkempt thicket
#

Or you could have the var outside i'm not sure it matters

subtle merlin
quiet bear
#

how do if chains work in lua? if i just put
if ((thing == thing) then
if ((thing == thing)) then
end
end
it just crashes?? IDK why

subtle merlin
unkempt thicket
lament agate
subtle merlin
quiet bear
# subtle merlin the actual code you have may be helpful here

trying to edit some code to make seals work on jokers
if self.ability.name == 'Scary Face' and (
context.other_card:is_face()) then
return {
chips = self.ability.extra,
dollars = self.ability.extra / 10,
card = self
}
if self.seal == 'Red'
#do the thing
end
end
but for some reason the crash error says that the 'if self.seal' line is unended.

sonic cedar
lament agate
#

fucking laptop

#

oh my

#

GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOD

#

WHY DIDNT THEY CAPTURE THIS

sturdy compass
#

THE TORNADO HAS ARRIVED

unkempt thicket
sonic cedar
sturdy compass
#

LOL

lament agate
sonic cedar
#

wait what's stopping me from just recording something rn actually

subtle merlin
lament agate
#

-# because its not a reference

subtle merlin
#

oh :<

sturdy compass
sonic cedar
#

YOU ARE ALONE JESTER

pallid sleet
#

does the wiki not have anything on things like 1 in 6 chance and stuff?

subtle merlin
pallid sleet
#

damn

gilded blaze
#

also learn the basics of Lua

thorn bough
#

The check for destroyed consumables works fine (if not a bit slow to update), but my check for destroyed playing cards doesn't work at all. Can someone lend me a hand?

-- Hook
local card_destroyed = Card.remove
function Card:remove(context)
  if self.added_to_deck and not G.CONTROLLER.locks.selling_card then
    local destroy_key = "destroying_" .. string.lower(self.ability.set or "")

    -- Consumables
    if self.ability.consumeable then
      SMODS.calculate_context{card = self, sriot = {[destroy_key] = true}}
      DRM.Increment()
    
    -- FIX ME
    elseif self.ability.remove_playing_cards then
      SMODS.calculate_context{card = self, sriot = {[destroy_key] = true}}
      DRM.Increment()
    end
  end

  return card_destroyed(self, context)
end
lament agate
#

this exists right

#

@unkempt thicket i need to know more about the card:click

unkempt thicket
#

What do you want to check exactly

lament agate
#

my plan exactly was it gains mults or chips whenever it got clicked

vague crest
#

how would i set up a joker that debuffs certain hands? in the same way as for example, the eye

#

like it should stop certain hands from being played in the same way that psychic doesnt let you play 5 cards

unkempt thicket
# lament agate just when they click

You can probably just add this in the function then SMODS.calculate_context({ clicked_card = self }) then check if the clicked card is the joker you want if context.clicked_card == card then --Do stuff end

vague crest
#

i have this but it doesnt do anything for some reason

#

not even the xmult which is very confusing

#

ok it's doing the xmult now but

gilded blaze
#

it doesn't make sense

vague crest
#

im referencing what the psychic does

#

it does not work with this exact text either so i guess this ones just a blind exclusive

#

i guess there arent really any jokers that actually do this so it makes sense but

#

i coulddd just do like, a set mult to 0 after scoring if playing one of these hands but i want it to like not give money or scale things either like the psychic does

#

hmmm unfortunate taking from the eye also crashes

hidden sable
#

how does boosters work?

#

do i use create_card to make cards in the booster or group_name

#

also how does ease_background_colour work

hidden sable
#

figured some stuff out, my cards are on crack, how fix???

quasi comet
#

might need a 'skip_materialize = true,'

solid grotto
#

Is there an easy way to start out with a specific joker so I can test what I've added

#

Without having to find it naturally

#

Or could someone recommend a mod that does this exact thing

lucid owl
solid grotto
#

I already had debugplus, just didn't know of this feature

#

Thank you!

hidden sable
#

hold tab in debugplus

hidden sable
#

also how do i change the amount thats in the booster

tawdry oriole
#

is there a way to create a new type of card modifier?

unkempt thicket
#

Yea

hidden sable
#

tried this to make background colors

#

crashed

tawdry oriole
hidden sable
#

oh ncm i see it

vague crest
#

where would i find the Key of the vanilla booster packs?

unkempt thicket
# tawdry oriole how?

A Lot of lovely patches and stuff, I recommend checking paperback and what they did with paperclips.

vague crest
#

found them nvm 🙏

solid grotto
#

I'm looking at pseudorandom rn and I don't really understand how it works
My code is:
pseudorandom('j_seven', 1, 5) < (G.GAME.probabilities.normal / card.ability.extra_odds) (x/5)

The right side of this equation should always be a fraction less than one. How does the comparison even work then?

#

Doesn't pseudorandom only return whole numbers?

hidden sable
#

is there a way to send the player to the shop

#

like stop the blind and go to shop

tawdry oriole
chrome widget
lament agate
#

is Xchip_mod a thing

#

or am i tweaking

chrome widget
#

Should be?

#

yeah, it is

#

I'd recommend using x_chips or xchips though unless you have something specific for the message

main hemlock
#

Hiya! I'm working on a joker mod with a friend of mine and we're having some issues getting our jokers to look the same resolution as all the others. As far as we're aware the pixel measurements are the same, I've lined them up correctly in our spritesheet but they're still weirdly low res despite looking perfectly fine in image form. Would anyone know a cause/fix for this sorta thing? Thanks!

#

(Kinda hard to tell with this screenshot but pitted next to other jokers they are obviously not as high res lol

tired kestrel
#

can you play mario on this thing?

chrome widget
#

I assume it might be that your resolution is high enough to default to the 2x version, but if it doesn't actually have increased dimensions, it might look blurry?

chrome widget
#

I have a config menu that just allows you to flatly play games if you load them into a subfolder

tired kestrel
chrome widget
#

But for the purposes of the joker, it's just a reduced little segment of the game

main hemlock
stoic fulcrum
#

does anyone have an example of loyalty card's text string?

tired kestrel
chrome widget
#

No, NES only

main hemlock
#

For the 2x sheet, we just doubled the resolution of the 1x sheet, which is quite big. If thats not how you're supposed to do it that might explain the blurryness

tired kestrel
#

although thought wold be cool to play some roms of MAME

chrome widget
tired kestrel
#

though only thing is that the NES version of Donkey kong was well squished but yeah.

#

Apologies for my poor English, and the highly mature scoreboard entries that people typed into the game during the last weekend. :)

A few additions:
Yeah, the game is obviously "tate mode", meaning that you'll have to turn your TV on the side to play it - it's the only way the game could possibly play completely like the original.
I also made a...

▶ Play video
stoic fulcrum
chrome widget
#

Are you passing in variables to fill it?

stoic fulcrum
#

i'm pretty sure? but maybe i'm missing something

molten musk
#

good morning

#

this is not working as intended, want to create hermit or temprance
but its only creating hermits

unkempt thicket
#

or is used as a backup, it would only return "c_temperance" if "c_hermit" was nil

solid grotto
#

Shouldn't you be using pseudorandom to pick between 1 and 2 and then create a tarot accordingly

#

If you want it to be 50/50

molten musk
#

true

#

sometimes my brain just stopes braining

solid grotto
#

I'm guessing that using the or operator here just kind of picks the first one

#

Because there wouldn't be any situation where hermit isn't available

molten musk
#

yes it does

#

i just used or cause i couldnt think if what to use
my internet was disconnected for a few days and i put this as is andd worked on coding other stuff

copper thorn
#

quick question, what colors are available with {C:} ?

molten musk
#

good question

#

i dont know....

unkempt thicket
solid grotto
#

Idk any others off the top of my head

#

Oh yeah green and money

molten musk
#

there is a lot

solid grotto
#

Most aren't used

molten musk
#

yeah

solid grotto
#

If you want an authentic joker I'd say stick to the main several

#

Is there a difference between blue and chips

tired kestrel
#

@chrome widget sent you the roms.

unkempt thicket
molten musk
solid grotto
#

I've only started modding last night and I already have a (((mostly))) working joker

#

Yay

unkempt thicket
tired kestrel
#

Anyways, has anyone have any experience on shaders? since I couldn't get a JPEG shader to work %100

solid grotto
# molten musk is there an example i can see about this

if pseudorandom("randomshit", 0, 1) = 1 then

SMODS.add_card({ key = "c_hermit", edition = "c_negative", area = G.consumables })
else
SMODS.add_card({ key = "c_temperance", edition = "c_negative", area = G.consumables })

#

I don't really know how if else statements work in lua

#

The else part

hasty mist
#

does anyone know where the code is for the dark_edition color ingame

solid grotto
#

I totally typod that

#

In case you copy paste

#

Consumavles...

#

Btw no guarantee this works lol

#

I feel like it should though

#

Can anyone tell me why my joker is properly scaling but not scoring?
(It has a 1 in 5 chance per scored seven to scale +1 mult)
(Said mult is supposed to activate on scored sevens)

molten musk
solid grotto
#

Np

pastel torrent
#

New to modding balatro, is there something wrong with my Joker Function?

SMODS.Joker {
key = 'Pixow',
blueprint_compat = true,
eternal_compat = false,
atlas = 'Jokers',
cost = 15,
rarity = 3,
pos = { x = 2, y = 0 },

calculate = function(self, card, context)
    if context and context.individual and context.cardarea == G.play and context.scoring_hand and context.full_hand then
        return {
            chips = 1,
            mult = 0,
            message = "+1 Chip"
        }
    end

    return { chips = 0, mult = 0 }
end,

}

pastel torrent
solid grotto
#

Which line brings up the error here

#

I'm kind of struggling to tell what this joker is supposed to do?

#

Can you explain

manic rune
tawdry oriole
#

^

manic rune
#

remove that

pastel torrent
#

gonna be honest its like 8am just used copilot

manic rune
#
calculate = function(self, card, context)
        if context.individual and context.cardarea == G.play then
            return {
                chips = 1,
            }
        end
    end,
#

your calculate should look like this

#

the other context r unnecessary

pastel torrent
#

ima keep you updated

#

testing now

solid grotto
#

Do you want one chip per card?

#

Or is this a test joker

pastel torrent
solid grotto
#

I see

solid grotto
manic rune
#

such a good joker

pastel torrent
# solid grotto I see

final plan is to make him score +7 mult per 7 rank card played and +50 for first card played in hand, also +5 mult if another joker is in the player's possesion

#

im just slight testing

manic rune
pastel torrent
#

to then see how I can make this go right

solid grotto
#

I'm not too skilled in lua

manic rune
#

it should be if pseudorandom("j_seven") <= G.GAME.probabilities.normal/5 then

solid grotto
#

I don't really get that

pastel torrent
#

and Holy it works thanks @manic rune

solid grotto
#

Shouldn't the right side of the equation be (typically) 1/5?

#

And pseudorandom returns whole numbers?

manic rune
#

G.GAME.probabilities.normal is 1, 2, 4, etc, depending on whether you have oa6 or not

solid grotto
#

It's 2^(amount of oops held)

manic rune
#

pseudorandom() returns a number between 0 to 1

#

G.GAME.probabilities.normal/5 is 0.2, so the code inside the if block will only go through when pseudorandom() returns a number below or equal to 0.2, which is essentially 1/5

solid grotto
#

Alright

#

That part of my code was working though

#

The bottom part is my concern

manic rune
#

oh, yeah, it doesnt work

solid grotto
#

if context.individual and context.cardarea == G.play and context.other_card:get_id() == 7 then
return {
mult = card.ability.extra.mult
}
end

#

Not sure what's wrong with it though

manic rune
#

those two if blocks run at the exact same context, and the first one takes priority over the second one

solid grotto
#

Should it be like, a completely seperate calculate call?

#

Or something?

manic rune
#

and since you are returning in the first if statement block, the second one wont go through

solid grotto
#

I see

#

Right

#

Will calculating two different things fix this issue

manic rune
#

do you want them both to happen?

solid grotto
#

Yes

manic rune
#

one sec

solid grotto
#

Again, I am absolutely new to modding balatro and lua

#

Lol

manic rune
#
if context.individual and context.cardarea == G.play and context.other_card:get_id() == 7 then
  if not context.blueprint and pseudorandom("j_seven") <= G.GAME.probabilities.normal/5 then
    card.ability.extra.mult = card.ability.extra.mult + card.ability.extra.mult_gain
    SMODS.calculate_effect({message = localize("k_upgrade_ex"), colour = G.C.RED, message_card = card}, card)
  end
  return {
    mult = card.ability.extra.mult
  }
end
#

this should work 🤔

manic rune
solid grotto
#

How do you make an entire area into comments

manic rune
#
--[[
  comments are all in here
]]
solid grotto
#

I'd like to preserve the part I had

manic rune
#

you can highlight your code, press [ twice, and add the -- before the first [[

pastel torrent
solid grotto
#

I've primarily dealt with websites in javascript so modding and gamedev is a completely new ballpark, but it's been fun to figure out so far

manic rune
#

the contexts are all in the uhh Calculate section in smods documentation or smt

pastel torrent
#

mb

#

thanks!

#

so scoring hand is the one played

unborn bay
#

full_hand is for all of G.play

pastel torrent
#

alr

manic rune
#

context.full_hand refers to the played hand, while context.scoring_hand refers to the scoring hand, so it really depends on what you want to use

pastel torrent
#

well

#

Im trying to get the played hand

#

well hold up

copper thorn
#

quick question, how to i get rid of the spaces betwenn each colored letters ?

pastel torrent
#

the scoring hand

unborn bay
#

that would include cards that aren't part of the poker hand btw

solid grotto
#

My joker completely works! (except for the picture lol)

unborn bay
#

so A 10 7 would result in the scoring hand just being A, while full hand is A 10 7

pastel torrent
#

right?

pastel torrent
#

okay

#

Got it

#

oh

#

didnt do anything

#

perhaps I did it wrong?

manic rune
#

whats the code

hasty mist
pastel torrent
manic rune
#

its a gradient

#

its color is frequently updated in Game:update

hasty mist
#

i thought it used multiple though

manic rune
hasty mist
#

and cycled through them

manic rune
#

nope

#

thats SMODS.Gradient

wintry solar
# pastel torrent

This checking whether the first scored card is the same card as your joker

pastel torrent
#

okay

manic rune
#

wha

#

no

hasty mist
#

so youre saying dark_edition doesn't have any code that tells it what colors to use?

manic rune
#

if context.scoring_hand[1] == context.other_card then

pastel torrent
pastel torrent
#

OH YEAH

#

Im so blind

#

lol

manic rune
#

this is how dark_edition cycles its color

solid grotto
#

How do I un-toggle this. Really annoying

#

I'd like to be able to click in between my characters

pastel torrent
manic rune
pastel torrent
#

of your keyboard

solid grotto
#

Idk how I keep toggling it

pastel torrent
solid grotto
#

I see

pastel torrent
#

same for me

hasty mist
#

well ty

#

also

#

peak server tag

solid grotto
#

I kept toggling it whenever I tried to backspace

manic rune
#

thanks :3

pastel torrent
#

IT WORKSSS

#

thanks @manic rune

solid grotto
#

I love balala too much to change the tag

pastel torrent
#

im actually grateful

solid grotto
#

One last question, shouldn't this be taking the image from the 1x folder?

#

In-game it just appears as a regular jimbo

manic rune
#

did you put the atlas in your SMODS.Joker

pastel torrent
#

wait you can do https requests for Balatro with the API??

manic rune
#

yes

pastel torrent
#

could be useful for twitch or stream integration

#

tbh

manic rune
#

someone did that for twitch, i think

solid grotto
pastel torrent
manic rune
solid grotto
#

Oh alright

#

I'm not too familiar with atlas stuff

#

Thanks

manic rune
#

mhm

solid grotto
#

My joker fully works now

#

Epic

pastel torrent
# manic rune mhm

Hey sorry again but despite looking in the documentation I can't find where to get the card rank played, do you think you know?

manic rune
#

context.other_card:get_id(), this will return a number depending on its rank

#

2,3,4,5,6,7,8,9,10 -> its rank number
J,Q,K,A -> 11, 12, 13, 14

lament agate
manic rune
#

seems like a SMODS.add_card gone wrong

lament agate
#

it works fine when the the prefix was unchanged

manic rune
#

whats the code?

lament agate
#
function Card:resize(mod, force_save)
    self:hard_set_T(self.T.x, self.T.y, self.T.w * mod, self.T.h * mod)
    remove_all(self.children)
    self.children = {}
    self.children.shadow = Moveable(0, 0, 0, 0)
    self:set_sprites(self.config.center, self.base.id and self.config.card)
end

local mainmenuref2 = Game.main_menu
Game.main_menu = function(change_context)

    local ret = mainmenuref2(change_context)

    local newcard = SMODS.create_card({key='j_tngnt_you',area = G.title_top})
    G.title_top.T.w = G.title_top.T.w * 1.7675
    G.title_top.T.x = G.title_top.T.x - 0.8
    G.title_top:emplace(newcard)
    newcard:start_materialize()
    newcard:resize(1.1 * 1.2)
    newcard.no_ui = true
    return ret
end
#

it was mvan_ before, but i changed it to tngnt

#

ignore it

#

jesus christ, hold on

manic rune
#

its very likely that j_tngnt_you is not the correct key

lament agate
#

for FUCK sake

#

yeah that was my fault

manic rune
#

lol

pastel torrent
# manic rune lol

hey so is something like that gonna work?

    if context.individual and context.cardarea == G.play and context.full_hand then
        if context.scoring_hand[1] == context.other_card then
            return {
                chips = 50,
            }
        else if context.other_card:get_id(7) then
            return {
                mult = 7
            }
        end
    end
end,

}```
manic rune
#

remove the and context.full_hand check

pastel torrent
manic rune
#

and also, elseif, not else if

pastel torrent
#

same thing isnt it?

#

but sure

wintry solar
#

No it’s not the same

pastel torrent
#

oh yeah ur right

wintry solar
#

With a space would require an extra end because it’s its own conditional block

pastel torrent
#

I always though it was the same

#

man im such a dummie lol

#

for like

#

5 years?

#

😭

#

alright testing my joker now

copper thorn
#

Is it possible for me to create a new color for {C:} ?

wintry solar
#

It’s a lua quirk

pastel torrent
#

unless I missed something im not sure its supposed to be like that is it?

lyric maple
#

how do you make code that checks if your hand is made up of 5 cards of a specific enhancement
do i have to use for loops

hasty mist
#

experimenting more with smods.gradient, will this work on its own in the context of {C:} or G.C. or do i need something else to make them work like that

pastel torrent
#

hm

hidden sable
#

how can i send a player to shop mid blind

wintry solar
# pastel torrent hm

Card:get_id() returns the id of the card, you need to compare it with something otherwise it’s always true

manic rune
hidden sable
pure salmon
#

how do i give a custom consumable set the spectral shader?

manic rune
pastel torrent
#

or do I need to make a variable for it

hidden sable
wintry solar
pastel torrent
#

oh right

#

okay

hasty mist
unborn bay
#

i believe smods adds the colour to loc colors regardless

manic rune
pure salmon
#

could i patch into this?

manic rune
#

-# never used SMODS.Gradient before, so

unborn bay
#

with your mod prefix

manic rune
pure salmon
#

what if another mod wanted to give a card the booster shader though

keen atlas
pure salmon
#

i just want to draw a shader on my consumables like spectral

wintry solar
manic rune
#

🤔 but maybe draw step is better

pure salmon
#

never used a drawstep before

#

looking into the wiki page

hasty mist
manic rune
#

mm idk then

hasty mist
#

though

hasty mist
#

there seems to be a different effect if the key is correct to when its incorrect

#

if the key is correct it displays as pure black, but if its incorrect it's just balatro black

wintry solar
#

You need to add it to the colour tables yourself

hasty mist
#

how?

#

wait no i dont

#

i just added another hex to the table and it works

wintry solar
#

Oh right it needs two values to change between

merry raven
#

Does anybody know how to spawn sprites on the screen? Where would I start if I want to:

  • display sprites taken from an atlas
  • use conditionals that will change those sprites' textures
  • remove those sprites
  • consider them a "card" in order to use animations such as flip() and juice_up()
manic rune
#

how the hell do i math.log10() a table of numbers, like, {100,50} (its 50100, this is for big nums)

#

:3

keen atlas
# hidden sable

hmm no idea, i know if with the cash out ui displayed but not this one

manic rune
lyric maple
# manic rune yes
if context.individual and context.cardarea == G.play and SMODS.has_enhancement(context.other_card, "m_stone") then
            local stone_cards = 0
            for _, scored_card in ipairs(context.scoring_hand) do
                if SMODS.get_enhancements(scored_card) == "m_stone" then
                    stone_cards = stone_cards + 1
                end
            end,
            if stone_cards >= 5 then
                return {
                    chips = card.ability.extra.chips,
                    mult = card.ability.extra.mult,
                    xmult = card.ability.extra.xmult,
                    card = context.other_card
                }
            else
                return {
                    chips = card.ability.extra.chips,
                    mult = card.ability.extra.mult,
                    card = context.other_card
                }
            end
        end

would this be correct? (i'm using stone as the specific enhancement here)

manic rune
#

and i got this, its a bit inaccurate so im not sure if its the right approach

keen atlas
hidden sable
manic rune
hidden sable
#

how can i modify the current blinds payout

manic rune
#

you want to use SMODS.has_enhancement(scored_card, "m_stone") instead, its cleaner

lyric maple
#

oh mb thanks

#

smh smh vampire you let me down

manic rune
#

they likely used SMODS.get_enhancements just to check if the card has an enhancement or not lol

hidden sable
#

my expected behavior: use consumable, round ends, no payout, straight to shop, after shop, blind hasnt been beaten yet, you need to rebeat the blind

keen atlas
hidden sable
#

right now i can end the round but ill lose, is there an overwrite for this losing i can enable

#

idk what the 2nd line does i just included it because i thought it would work

pastel torrent
#

Hey how can I detect if the player as a specific joker?

hidden sable
keen atlas
pastel torrent
hidden sable
pastel torrent
#

thanks

hidden sable
#

maybe theres a function for setting game state?

pastel torrent
#

or is it looking for a specific one and im just blind?

hidden sable
pastel torrent
#

oh yeah

#

well i'll try to see what I can do with this

lyric maple
#

i'm trying to make a joker that (with the certain stone conditions from earlier) gives X1.1 mult per stone card, with a bonus X0.01 mult for each level of high card. is there any better way to do this than just copypasting card.ability.extra.xmult + card.ability.extra.xmult_gain * G.GAME.hands["High Card"].level everywhere?

keen atlas
hidden sable
#

i lose if i do this

#

how to modify round score?

hidden sable
keen atlas
hidden sable
#

no i mean the

#

stencil jokers

#

like

#

#SMODS.find_card("joker", true)

pastel torrent
#

like?

hidden sable
#

literlaly prints out how many joker jokers i have

#

plain text

pastel torrent
hidden sable
#

+4 mult

pastel torrent
#

oh

keen atlas
pastel torrent
#

so I can replace it

#

right?

hidden sable
#

yes

#

put your own joker name in there

keen atlas
#

it works for me tho shrug

G.FUNCS.draw_from_hand_to_discard()
G.GAME.blind:defeat() --- defeat effect
G.STATE = G.STATES.SHOP
G.STATE_COMPLETE = false
pastel torrent
#

so this should work right?

    if context.individual and context.cardarea == G.play and context.scoring_hand and context.other_card then
        local is_first_card = context.scoring_hand[1] == context.other_card
        local is_seven = context.other_card:get_id() == 7

        local result = {}

        if is_first_card then
            result.chips = 50
        end

        if is_seven then
            result.mult = 7
        end
        
        if #SMODS.find_card("darkHazard", true) > 0 then
            result.mult = (result.mult or 0) + 5
        end

        if result.chips or result.mult then
            return result
        end
    end
end,
}```
#

if #SMODS.find_card("darkHazard", true) > 0 then
result.mult = (result.mult or 0) + 5
end

hidden sable
#

maybe since its running from a consumable

#

lemme try wrapping this in an event

keen atlas
hidden sable
#

BRUNGUS

pastel torrent
#

mb

lyric maple
#

apparently there's an "unexpected symbol on line 328 near '='", but i have absolutely no idea what it is

SMODS.Joker {
    key = "brown",
    loc_txt = {
        name = "Brown",
        text = {
            "{C:attention}-1{} Ante to win,",
            "but shop prices are {C:attention}#1#%{} higher"
        }
    },
    config = { extra = { percent = 40 } },
    rarity = 3,
    atlas = "Jokers",
    blueprint_compat = false,
    pos = { x = 4, y = 1 },
    cost = 7,
    loc_vars = function(self, info_queue, card)
        return { vars = { card.ability.extra.percent } }
    end,
    add_to_deck = function(self, card, from_debuff)
        G.E_MANAGER:add_event(Event({
            func = function()
                G.GAME.discount_percent = G.GAME.discount_percent - card.ability.extra.percent,
                G.GAME.win_ante = G.GAME.win_ante - 1 -- line 328
                for _, v in pairs(G.I.CARD) do
                    if v.set_cost then v:set_cost() end
                end
                return true
            end
        }))
    end,
    remove_from_deck = function(self, card, from_debuff)
        G.E_MANAGER:add_event(Event({
            func = function()
                G.GAME.discount_percent = G.GAME.discount_percent + card.ability.extra.percent,
                G.GAME.win_ante = G.GAME.win_ante + 1,
                for _, v in pairs(G.I.CARD) do
                    if v.set_cost then v:set_cost() end
                end
                return true
            end
        }))
    end
}

(line 328 is marked)

lyric maple
lyric maple
keen atlas
#

at 327, sorry

hidden sable
lyric maple
#

ah

hidden sable
#

same down below

lyric maple
#

ok reboot time

#

ayyy it works now!!!

merry raven
#

I'm trying to make a hologram shader for stickers (not a hologram sprite for a Joker, it's stickers) but for some reason they show up outlined like this? How do I fix it and make it look like the Hologram Joker?

SMODS.Sticker {
    key = "operator",
    loc_txt = {
        name = "Operator",
        text = { 
            "> AWAITING INPUT:",
            "> G.PLAY"
        }
    },
    atlas = "Stickers",
    pos = {x = 4, y = 0},
    default_compat = true,
    draw = function(self, card, layer)
        G.shared_stickers[self.key].role.draw_major = card
        G.shared_stickers[self.key]:draw_shader("hologram", nil, nil, nil, card.children.center)
    end
}
hidden sable
#

got it to kinda work

#

my game is haunted...

merry raven
hidden sable
#

OK I DONT KNOW HOW BUT I GOT IT TO WORK

keen atlas
#

nice

hidden sable
#

only problem is this isnt properly returning

#

like if i get to the shop normally it works

#

but if i get to the shop from the card it doesnt

keen atlas
#

yeah it have some caveats

hidden sable
#

so ill need a custom return

keen atlas
#

it can be buggy if skiping instantly to shop

hidden sable
#

this is my code btw

keen atlas
#

try removing the draw_from_discard_to_deck

hidden sable
#

you think thatll fix the inblind?

lyric maple
#

what does context.repetition do

hidden sable
#

nope

keen atlas
lyric maple
#

i want to add a retrigger, and clearly this is the retrigger, but i'm not sure if it does weird stuff with context.individual

hidden sable
#

maybe have a bool that checks whether skateboard was used or not and if it was used dont let another use until it gets reset by a hook scanning for context.setting_blind

merry raven
#

How would I go about adding a new card type, we got Jokers, consumables, regular playing cards, but I want to add a new one

keen atlas
hidden sable
#

works hopefully?

keen atlas
#

hopefully

hidden sable
#

my second hook ever made works

#

looks fine right

keen atlas
#

i dont use smods, so not sure

lament agate
#

you what

pastel torrent
#

how to set chances on jokers?
for exemple 1 on 4 chance for the joker to give 5+ mult

keen atlas
#

not balamod either

keen atlas
keen atlas
#

okay

hidden sable
#

@daring fern you probably know about this, why do i have to supply 2 images for every atlas

#

a 1x scale and then a 2x scale

#

i know it's for pixel smoothing but like

#

how does it smooth from that

#

and can't it just make the assets itself

#

just upscale the 1x

keen atlas
lament agate
keen atlas
#

i code my own

#

ignore that sentence

near bay
#

how do i create a seal

daring fern
merry raven
#

I wonder how many mods will fight for that new cardarea's position

near bay
#

loadout?

merry raven
#

It's my UI practice thing, it doesn't do anything yet

near bay
#

ah alright

hushed field
near bay
#

how do i check for displayed chip and mult under round score?

daring fern
formal parrot
#

Right somethingcom515 ?

merry raven
pastel torrent
#

game crashing when using {V:1}text{}?

daring fern
pastel torrent
stiff quiver
#

I made this code to duplicate a card with a seal when its destroyed but its not doing anything, whats wrong? lua calculate = function(self,card,context) print("0") if context.remove_playing_cards then print("1") for i = 1, #context.removed do print("2") if context.removed[i].seal and context.removed[i].seal.key == "seal" then for l = 1, 2 do print("3") local copy_card = copy_card(context.removed[i], nil, nil, G.playing_card) copy_card:add_to_deck() end end end end end

formal parrot
#

There’s no seal key thats named seal

formal parrot
#

Context.removed[i].seal returns true or false in your case make it ==false or ~=true

formal parrot
#

I think you need to to use seal_poll to make a random seal aswell

#

Can’t see that

stiff quiver
#

oh so its just card.seal == "seal_key"

daring fern
formal parrot
#

Has_seal ?

daring fern
formal parrot
#

Does it even exists

daring fern
formal parrot
#

Why there’s has_enhancement and no has_seal

#

Lmao

pastel torrent
daring fern
pastel torrent
daring fern
river apex
#
set_card_type_badge = function(self,card,badges)
        local label = localize({ type = "name_text", set = "Enhanced", key = self.key, vars = {} })
        badges[#badges+1] = create_badge(label, pg_sand_colour or G.C.WHITE, G.C.WHITE, 1.2)
    end

How does this is enough to know with key in localization to get ?
Right now I am only getting "ERROR" with a blank description but i saw other mods that works well even when the name was "enh_mysuperenh"
idk why it linked to your message sorry xD

formal parrot
pastel torrent
# daring fern Code?

j_dark_robloxStudio = {
name = '{V:1}Roblox Studio{}!',
text = {
'{C:attention}1 out of 6{} chances to loose your game every minute',
'will prompt a message before loosing',
'{X:mult,C:white} X10 {} Mult',
},
},

pastel torrent
formal parrot
pastel torrent
#

I did

stiff quiver
formal parrot
daring fern
#

In loc_vars

pastel torrent
#

thanks for clarifying

#

both of you thanks

pastel torrent
#

am I forced to use one?

formal parrot
idle plaza
daring fern
idle plaza
#

Ah, my bad

stiff quiver
#
calculate = function(self,card,context)
    print("0")
    if context.remove_playing_cards then
      print("1")
      for i = 1, #context.removed do
        print("2")
        if context.removed[i].seal == "seal_key" then
          for l = 1, 2 do
            print("3")
            local copy_card = copy_card(context.removed[i], nil, nil, G.playing_card)
                copy_card:add_to_deck()
          end
        end
      end
    end
  end```
daring fern
formal parrot
#

But they don’t want that

#

They want to check if the destroyed card has a seal

#

Or not

stiff quiver
#

but even if thats the problem it'd print the 1 when any card is destroyed, which is not happening

formal parrot
#

Not a specific seal

stiff quiver
formal parrot
#

A general seal

#

Not a specific one

stiff quiver
#

this is the entire code lua SMODS.Seal{ key = "shoomimi_seal", loc_txt = { name = "Shoomimi seal", label = "Shomimi seal", text = { "When this card is {C:attention}destroyed{},", "create {C:attention}two{} copies of it"}}, badge_colour = HEX('8CE6BD'), discovered = true, unlocked = true, calculate = function(self,card,context) print("0") if context.remove_playing_cards then print("1") for i = 1, #context.removed do print("2") if context.removed[i].seal == "shoomimi_seal" then for l = 1, 2 do print("3") local copy_card = copy_card(context.removed[i], nil, nil, G.playing_card) copy_card:add_to_deck() end end end end end}

formal parrot
#

If context.card.seal has no seal then #context.card.seal should be =0

#

Am i stupid

stiff quiver
#

oh, what do i use for it then?

#

ok i'll try that, thanks

merry raven
#

Does anybody know how to spawn sprites on the screen? Where would I start if I want to:

  • display sprites taken from an atlas
  • use conditionals that will change those sprites' textures
  • remove those sprites
  • consider them a "card" in order to use animations such as flip() and juice_up()
pastel torrent
#

How would I force a player to loose or win his game?

wintry solar
#

This doesn’t sound correct

pastel torrent
daring fern
pastel torrent
hard mica
#

i did it like this , is it alright?

idle plaza
#

Yeah

hasty mist
#

how do i check if played hand contains only a specific rank?

#

for example only aces or only 4's

stoic fulcrum
#
    key = "deardanielsr", --minda note: fix blueprint not working properly even though it's compatible
    loc_txt = {
        name = 'Dear Daniel',
        text = {"{X:mult,C:white}X4{} Mult if",
            "played hand contains",
            "a {C:red}King of Hearts{} and",
            "a {C:red}Queen of Hearts.{}",
            "If {C:red}Hello Kitty{}",
            "is in your deck,",
            "{X:mult,C:white}X8{} Mult instead,"}
    },
    pos = { x = 0, y = 0 },
    rarity = 2,
    atlas = 'sanriocards',
    blueprint_compat = true,
    cost = 6,
    config = { extra = { Xmult = 4, Xmultkitty = 8, Xmultreset = 4 } },
    loc_vars = function(self, info_queue, card)
        return { vars = { card.ability.extra.Xmult, card.ability.extra.Xmultkitty, card.ability.extra.Xmultreset } }
    end,
    calculate = function(self, card, context)
        if next(SMODS.find_card("j_srio_hellokittysr")) and next(SMODS.find_card("j_srio_deardanielsr")) then
            card.ability.extra.Xmult = card.ability.extra.Xmultkitty
        end
        if not next(SMODS.find_card("j_srio_hellokittysr")) and next(SMODS.find_card("j_srio_deardanielsr")) and card.ability.extra.Xmult == 8 then
            card.ability.extra.Xmult = card.ability.extra.Xmultreset
        end
        if context.individual and context.cardarea == G.play then
              for i = 1, #context.scoring_hand do
                 if context.other_card:get_id() == 12 and context.other_card:is_suit("Hearts") then
                        card.ability.extra.kings = true
                 elseif context.other_card:get_id() == 13 and context.other_card:is_suit("Hearts") then
                        card.ability.extra.queens = true
                 end
             end
        end
           if context.joker_main and card.ability.extra.kings == true and card.ability.extra.queens == true then
              card.ability.extra.kings = false
               card.ability.extra.queens = false
           return {
            Xmult = card.ability.extra.Xmult
          }
    end
  end
}```

is there any code in this joker that prevents it from working properly with blueprint?
snow vale
#

does context.individual checks only scoring cards, or both scoring and non-scoring cards?

hushed field
#

you limit the targets by checking the cardarea

formal parrot
#

Checks every card if you don’t limit

hushed field
#

G.play means the scoring cards get checked, "unscoring" means unscoring gets checked

#

G.hand means hand gets checked

snow vale
#

hmm

#

so i use G.play , right?

hushed field
#

if a mod enables the deck as a target, the deck gets checked too

snow vale
#

to check for scoring

hard mica
#

im having a problem with my tracking for jokers , i have 3 jokers and i got the reward but it still shows 2/3 for some reason

candid sleet
#

what way are you supposed to format the deck type line?

#

i know this is wrong at least but whatever i try balatro just keeps telling me i need to put } expected near = on 1030

tired kestrel
#

good quesiton, you can basically seperate jokers as single files right?

hasty mist
#

please tell me there is a better way to do this

#

(trying to make the calculate function only pass if played hand contains four 4s only)

tawdry oriole
#

is there a way to specify what rarity is the card we wish to create through create_card? (i.e. i'm trying to create a legendary joker)

pastel torrent
#

how to modify hand size via jokers?

candid sleet
#

not sure for legendary though sorry

tawdry oriole
#

nevermind there's quite literally an attribute called "legendary" for what i was looking to do

#

but thanks nonetheless

idle plaza
# stoic fulcrum ```SMODS.Joker { key = "deardanielsr", --minda note: fix blueprint not worki...

You reset the kings and queens variables of your Joker the moment it activaes. Therefore, they are both false after your card does its thing once, and any copy attempts can, at most, set one of those flags to true again.

I think to solve this, contain the parts that set your card's extra fields within not context.blueprint checks so they don't have to run more than necessary. And, put the check to reset the kings and queens fields if they're both true, only at the very start of the calculate. So: The main Joker can find out that they're both true, give any Copiers their own turns to give out the mult, and then reset both to false once the original joker gets its next turn to execute.

candid sleet
formal parrot
#

Hello freud

#

Big fan

idle plaza
# hasty mist please tell me there is a better way to do this
if #G.play.cards ~= 4 then return end
for _, playing_card in ipairs(G.play.cards) do
  if playing_card:get_id() ~= 4 or SMODS.has_no_rank(playing_card) then return end
end
-- If code continues to run, it is only because any non-4 IDs were not found. Continue your code from this comment.
hasty mist
#

thank you

hard mica
pastel torrent
formal parrot
#

Juggler code

pastel torrent
#

sure

#

alr alr

formal parrot
formal parrot
red flower
#

im yusei

formal parrot
#

So you’re not as rich

#

Lakes sense

red flower
hard mica
#

its an objective for my joker

red flower
#

and what's the problem

manic rune
#

hi N'

red flower
#

hiiii

hard mica
#

the problem is the text of the tracking says 2/3 but i have 3 jokers in my joker slots

manic rune
#

oh yeah, how do i check if a new run is made? 🤔

hard mica
hasty mist
manic rune
#

doesnt that also include resuming an old run

red flower
hasty mist
#

does it?

#

if it does i have a LOT of code i need to change

pastel torrent
formal parrot
#

Remove from deck

#

Is when card is removed

manic rune
#

oh, never thought it would be there

#

thanks :3

manic rune
formal parrot
pastel torrent
formal parrot
hasty mist
maiden phoenix
#

Oh no N is getting old....

red flower
#

what!

manic rune
maiden phoenix
#

Each time he helps someone he grows one day older

red flower
#

!!

formal parrot
pastel torrent
#

add_to_deck = function(self, card, from_debuff)
G.hand:change_size(card.ability.extra.h_size)
end,
remove_from_deck = function(self, card, from_debuff)
G.hand:change_size(-card.ability.extra.h_size)
end

manic rune
#

wtf!

hasty mist
#

perhaps

manic rune
#

i pray for your restore

formal parrot
#

Thats your hand size

#

Giving it a number will add that number

cobalt iron
#

is there a way to create a random skip tag?

pastel torrent
#

or manualy do a function to give back the normal hand size?

formal parrot
#

If yourcontext
Change hand size (store the addition amount in config )

formal parrot
#

And when you remove from deck
Do G.hand:hand_size(-config variable )

manic rune
#

whats the uhh

#

real_dt var thingy called again

#

i forgot

red flower
#

isn't it just G.real_dt

unborn bay
#

yeah its just G.real_dt

manic rune
#

oh, thanks

hard mica
#

how can i make a joker not show in a booster pack

formal parrot
hard mica
formal parrot
#

Yeah

#

You just want it to not show in packs?

hard mica
#

yeah

cobalt iron
red flower
red flower
cobalt iron
#

oh ok

merry raven
#

I wonder if it's possible to put a cardarea into a UI window

zealous glen
#

Yes

merry raven
#

I found a wizard who did it

zealous glen
#

The game does it already

merry raven
#

Oh right I forgot the deck existed

zealous glen
merry raven
#

Since a lot of mods fight for that new consumable slot

zealous glen
#

Also the collection

merry raven
#

I figured I could make the "Loadout" button have some use

#

Is it also possible to make the UI window transparent?

zealous glen
#

I think the shop is a UI window too

red flower
#

keep in mind any cardarea in an overlay window gets destroyed immediately after so you need more logic for it

merry raven
#

I want to create some sort of a dropdown menu

red flower
#

i have a button to open a cardarea

zealous glen
#

IIRC Malverk has one too

#

Galdur too

merry raven
#

Oh damn

zealous glen
#

I think Winter did it too

#

And High Card mod had one too

merry raven
#

Yeah I wanna do something like

zealous glen
#

Maybe Bunco too

merry raven
#

And then this

#

Man takes me back to the days of fiddling with CSS

red flower
#

yeah that's not that hard

zealous glen
#

I think one of bepis’ mods might have something similar

#

@merry raven I have a suggestion

#

Don’t use an UI window

#

Just hide the area offscreen

#

And move it

#

Like the hand moves down when you play a card

merry raven
#

Sounds easy on paper, but I have never touched on anything related to card areas nor animation

merry raven
#

That extra consumable slot is copied from another mod from a gist

zealous glen
#

The movement is handled by the game

#

So you’d just need to look how the Hand moves

#

Or whatever N’ does

merry raven
#

This one?

red flower
#

no, the button that opens the other joker area

#

but that one as well

zealous glen
#

Oh, is that hidden offscreen?

red flower
#

the extra deck is yes

zealous glen
#

hmmm

merry raven
#

Oh the extra deck button

#

That's really good

zealous glen
#

I’m suggesting to just move it because then you don’t need an UI window

#

And you don’t need to make it transparent

#

You just need to move the CardArea

merry raven
#

Gotcha gotcha

#

Oh hey cheers, I'll take a look into it

zealous glen
#

Oh another one: Vouchers

merry raven
#

What about em

zealous glen
#

Another example of CardArea inside an UI window

wintry solar
#

You can look at how the shop is moved off screen, I’m pretty sure it’s always just off the bottom of the screen

#

Or maybe that’s just when you open packs and redeem vouchers

merry raven
#

Oh right that exists

#

Uhhh which file is that in again

molten musk
#

this is not working

#

it only shows the mod ones in booster pack

#

doesnt show the others

formal rose
#

I'm making a joker where each played 6 gives +6 chips and +6 mult, and the code works perfectly except the text for the additions seems to happen at the same time, and so do the additions and animations. I don't want this; I want it to happen more like Scholar where the Chips happen first and only once that's done does the Mult happen. All I think I need is a pause, but I don't know how to do this

errant fulcrum
#

Okay so not outside calculate, but before return INSIDE calculate

#

card_eval_status_text(card, "extra", nil, nil, nil, {message = '+30 Chips', colour = G.C.CHIPS})

#

You can do this for each message you need seen

formal rose
#

I tried that, but it makes the joker say those things and not the card, and the chips and mult are still added simultaneously

tired kestrel
#

Now, how do I load in a single image for a joker?

errant fulcrum
formal parrot
#

Can you send

#

The description

#

@pastel torrent

pastel torrent
#

which desc?

formal parrot
#

Of the joker

formal parrot
#

Like do you only have play sound isue

#

?

pastel torrent
#

its just that

vast bough
formal parrot
#

Remove play_sound

#

Use return sound only

pastel torrent
#

right?

zealous glen
#

I feel like SMODS would automatically handle both in the same level

#

But maybe not

formal parrot
#

Should work

pastel torrent
#

its already like that

formal parrot
#

yeah bur

pastel torrent
#

though there is a playSound right up

formal parrot
#

You had

#

Yeah

#

Delete it

vast bough
pastel torrent
#

okay

formal parrot
#

Basically it adds extra sound every time and it becomes wonky thats why

pastel torrent
#

does not play it anymore lol

#

I might be cursed

#

@formal parrot

formal parrot
#

Lmao

#

Wait

#

Let me check the wiki

pastel torrent
#

sure

formal parrot
#

I might be stupid

pastel torrent
#

no ur not

formal rose
pastel torrent
#

depsite me having some experience in lua im struggling just for balatro mods lol yet you do it better

#

didnt know mods were that hard to do

formal parrot
#

No im not

formal parrot
#

Check for key typo maybe

#
    message = localize('k_upgrade_ex'),
    sound = 'MyMod_UpgradeSound',
}```
pastel torrent
pastel torrent
#

inside too?

hard mica
#

how can i give a baffon pack ?

formal parrot
#

Returns the value of additional chips

#

Same as mult

#

xchips= return xvalue of chips

#

so

#

Return {chips=60}

#

Adds 60 chips

#

Make sure its lower case tho

#

Lmao

pastel torrent
#

correct?

#

@formal parrot

formal parrot
#

Why are you return results.message ?

#

If you want to display a message you can do

#

Message=“your message”,

formal parrot
pastel torrent
#

but ima follow ur advices

formal parrot
#

Listen

#

Here’s a good advice

#

Use config instead of local vars

pastel torrent
#

is it any better now?

formal parrot
#

Config={extra={variable1=variable2=}}

hard mica
#

anyone know how i can give a random buffoon pack?

formal parrot
#

access said variable with

#

Card.ability.extra.variable1

candid sleet
#

is there a way to make jokers perishable in challenges, tried this but it didn't work
{ id = 'j_stuntman', stickers = {"perishable"} },
also tried
{ id = 'j_stuntman', perishable = true},
but neither one worked

pastel torrent
formal parrot
pastel torrent
#

noted too

#

didnt know that

snow vale
#

how can i make an edition shader?

formal parrot
formal parrot
#

How do i tell you

snow vale
#

yeah ik it's hard