#💻・modding-dev

1 messages · Page 284 of 1

vast lily
#

idk if i explained it well

#

the text box updates to display the correct number rn, but only when the joker is scored

#

so i dont think changing my config is gonna help because it doesnt change when the variable value is calculated

tawny narwhal
#

Oh so you have your ace tally in calculate?

vast lily
#

yes

#

i wonder what would happen if i just

#

made it calculate that variable regardless of context

#

the problem is the last time i made something happen regardless of context it lagged the game a little

tawny narwhal
#

Maybe add a wait = 1 or something if it lags

hushed field
#

what are you trynna do, nightfreeze?

#

tally the aces, so the mult reflects it?

wicked leaf
#

yes

tawny narwhal
#

of that

hushed field
#

count the aces in the loc_vars function

tawny narwhal
#

Wait yeah

#

I think I need sleep

vast lily
#

oooh i can do that?

hushed field
vast lily
#

my way is currently working but if thats better ill do it

hushed field
#

this joker counts face cards, but the logic should be the same

#

ignore everything outside the loc_vars and calculate function, haha, a lot of that is Kino specific

vast lily
#

gotcha

#

thanks dude

hushed field
#

no problem!

#

btw, @tawny narwhal you're making a mod themed around jets?

tawny narwhal
#

Yessir

hushed field
#

cool concept! Is there a general theme for the jet jokers, ability-wise, or are you trying to keep it broad?

#

(I got a request to add Top Gun jokers so I'm doing research ofc)

next timber
#

how come this makes ghost cards? (being run in a joker)

tawny narwhal
long sun
#

it's making ghost cards because i'm making it do that >:3 oooooooooOOooOOOOoooo 👻

brazen tusk
tawny narwhal
#

And some 'planned' jokers I have is

- F/A 18 E/F Super Hornet Joker (no idea what to do with it yet)
- F-16 Fighting Falcon Ground Attack (Similar to hiker? played cards get upgraded/enhanced/destroyed for some purpose)
- Valkyrie Bomber (idk... speeeeeeeeeeeeeeddddd)```
#

Half of it is finding cool images that I go "Yeah, that'd look cool as a pixel art card"

next timber
#

is there an easy check for if a card's been destroyed

#

idk why there would be but

hushed field
next timber
#

oh neat

#

ok cupcakes joker is now complete

#

my first joker and its a reference to an mlp creepypasta, dare i say the mlp creepypasta

#

lol

tawny narwhal
#

Wait how do I set a joker as a custom object type?

wicked leaf
#

OK so

#

I fixed the thingy

#

I think its because I had the file open in aseprite

tawny narwhal
#

...

#

That'll do it

wicked leaf
#

no wait

#

no, I didnt fix it

#

fuck

tawny narwhal
#

rip

sturdy compass
next timber
#

ok so cupcakes + certificate + some cards with the Element of Magic seal is giving me a nice steady supply of increasing xmult lmao

wicked leaf
#

ouuu :c

#

I dont understand whats going wrong

#

is it the file??

long sun
#

dfngjdfngkfdng this is driving my head through the wall 😭

#

waxed.fs is literally just the vanilla shine shader right now

#

and it's still not working 😭😭😭😭😭

next timber
#

did you rename all instances of the original shader name within the shader with waxed

tawny narwhal
#

This... This is horrendous...

                if (v.ability.name == "Gros Michel" or v.ability.name == "Egg" or v.ability.name == "Ice Cream" or v.ability.name == "Cavendish" or v.ability.name == "Turtle Bean" or v.ability.name == "Popcorn" or v.ability.name == "Ramen" or v.ability.name == "Seltzer") and not v.debuff then
                    card.ability.extra.Xmult = card.ability.extra.Xmult + 1
                end```
long sun
#

😭 i didn't realise i had to

#

sorry!! gonna try changing those

#

oh! i've got no idea why that worked :D

#

dfkjgnjdfkgnkdjg

wicked leaf
next timber
long sun
#

i really don't understand shader files 😭😭😭😭😭

#

are there any good tutorials out there that you'd recommend?

next timber
#

nop

#

i struggled my whole way through

#

i did set up this block of variables to help me. comprehend

#

the commented out ones explain variables that are already defined

storm wharf
#

hey y'all. First time trying to mod anything. is there a template or something i could use?

normal crest
#

There's an examples repo inside the steamodded organization in github

long sun
#

thanks ^^

wicked leaf
#

im fucking shaking why isnt this shit working

#

everything is correct

#

im just

#

going to remake the entire folder

next timber
#

damn i just pulled certificate when i already have certificate and i dont have showman

#

ill take 2 free cards per round sure

wicked leaf
#

ok so

#

i am convinced

storm wharf
#

preesh. also one more question. If i'm making a mod just for custom jokers, would i just need the assets folder for the sprites and a script for what they actually do?

wicked leaf
#

my mods folder is just cursed

#

and doesnt want to cooperate with me

heady siren
#

Is it possible to run code similarly to a joker without actually having a joker?

#

Like, contexts and all

tall apex
wicked leaf
#

the problem is that the atlas DOESNT load

#

im gonna try using a different mod as a base hold on

tall apex
#

did you call for it to load in your main?

wicked leaf
#

yes

tall apex
#

Hmmm

#

Can I take a peek? :3

wicked leaf
#

gimmie a sec

tall apex
#

Of course

wicked leaf
#

oh my god im stupid

#

im using x1

#

instead of 1x

tall apex
#

Felt that bestie

#

Hopefully that resolves it, double check everywhere it’s called for that mistake :3

marble flint
long sun
#

noted ^^

chrome widget
#

It's not Balatro specific, it's GLSL

#

Lower level graphics programming is strange

marble flint
#

the thing where the shader name needs to be a shader variable is balatro-specific

#

(and very dumb)

long sun
#

ah, glad ^^"

gilded goblet
#

Shaders scare me

long sun
#

question about the variable in the shader

#

my shader doesn't use one — how can i add it in, without having it be optimised out?

#

i have no idea if this works, i haven't been able to test it dfkjgnkjdfgnkfjd

#

ah wait lemme try something -w-

#

riiiiiiiight

#

gooooootcha

wicked leaf
#

well, I fixed my atlas and the game loads but

#

now it just shows up at the default stuff ingame

hardy viper
#

why is he jimbaked

long sun
#

pffffff

gilded goblet
long sun
#

😭😭😭😭😭😭😭

gilded goblet
#

Sleep paralysis demon

tired skiff
#

does anyone know the hex code for the defult backgroud of a "regular" joker

long sun
#

isn't it white? #FFFFFF?

tired skiff
long sun
#

i'm pretty sure it's white

tired skiff
#

k

gilded goblet
#

Yeah just wite

long sun
#

actually, no, i'm certain :> ya

heavy hare
#

how do i add the node to the 'blind_tracker' table via get_UIE_by_ID?

{n=G.UIT.ROOT, config={align = "cm", minw = 1, r = 0.1}, nodes={
      {n=G.UIT.R, config={align="cm", minw=2, minh=1.6},nodes={
        {n=G.UIT.C, config={align = "cm",id='blind_tracker',minw=2, minh = 1.6},nodes={}
      }}
    }}}
  local tracker = G.HUD_blind_tracker:get_UIE_by_ID('blind_tracker')
  local node = {n=G.UIT.C, config={align = "cm",minw=2, minh = 1.6},nodes={
    {n=G.UIT.O, config={object = blind_choice.animation}}
  }}
chrome widget
#

Uhh need some help with something. I'm using the Joker.load() function because I need to set sprites for a custom visual effect as children of the object, but for some reason, even though the function correctly creates the sprites, they're considered nil by the time the draw function comes around?

long sun
#

at lastttttt :D

#

figured i didn't need the blurring

gilded goblet
#

Wowie

radiant bough
#

What file is the vanilla jokers and consumables in?

chrome widget
#

So I have this function to set the sprites on the joker, creating three children it needs to do the visuals. It correctly sets these values, so it has non-nil tables in bloom1, bloom2, and bloom3 by the end

    if card.children.bloom1 then card.children.bloom1:remove() end
    if card.children.bloom2 then card.children.bloom2:remove() end
    if card.children.bloom3 then card.children.bloom3:remove() end

    sendDebugMessage('creating sprites')

    local role = {
        role_type = 'Minor',
        major = card,
        offset = { x = 0, y = 0 },
        xy_bond = 'Strong',
        wh_bond = 'Strong',
        r_bond = 'Strong',
        scale_bond = 'Strong',
        draw_major = card,
    }   

    local sign_atlas_1 = G.ASSET_ATLAS['fnwk_neonsign_1']
    card.children.bloom1 = Sprite(card.T.x, card.T.y, card.T.w, card.T.h, sign_atlas_1, { x = 0, y = 0 })    
    card.children.bloom1:set_role(role)
    card.children.bloom1.glow_color = {1, 0.96, 0}
    card.children.bloom1.custom_draw = true

    local sign_atlas_2 = G.ASSET_ATLAS['fnwk_neonsign_2']
    card.children.bloom2 = Sprite(card.T.x, card.T.y, card.T.w, card.T.h, sign_atlas_2, { x = 0, y = 0 })    
    card.children.bloom2:set_role(role)
    card.children.bloom2.glow_color = {0, 0.92, 1}
    card.children.bloom2.custom_draw = true

    local sign_atlas_3 = G.ASSET_ATLAS['fnwk_neonsign_3']
    card.children.bloom3 = Sprite(card.T.x, card.T.y, card.T.w, card.T.h, sign_atlas_3, { x = 0, y = 0 })    
    card.children.bloom3:set_role(role)
    card.children.bloom3.glow_color = {1, 0.07, 0.05}
    card.children.bloom3.custom_draw = true
end```

However, this draw function always says the three children are nil specifically if I call `set_love_sprites()` from `Joker.load()`, but it works normally when that function is called from `Joker.set_ability()`
```function jokerInfo.draw(self, card, layer)
    if not card.config.center.discovered then
        return
    end
    
    if not (card.children.bloom1 and card.children.bloom2 and card.children.bloom3) then
        -- always returns here on reload
        return
    end
    
    ...
end```
#

And I'm... not sure what the difference is?

long sun
#

is there a way to only allow an edition to spawn on playing cards?

peak tiger
#

How do I get the current chips/mult this hand?

chrome widget
#

if you want your chips prior to the hand being played, G.GAME.chips

if you want the chips at the current point in score calculation, hand_chips * mult

peak tiger
chrome widget
#

hand_chips * mult, exactly like that

#

They're global values

#

Lua is weird so everything is global unless you specify otherwise, they're technically stored in the global table, which would mean G.hand_chips * G.mult would be equivalent

#

(I think)

modern kindle
#

Hello hello

chrome widget
#

Hello!!

modern kindle
#

Winterrr

chrome widget
#

The winterrrrrr

modern kindle
#

How fares the winter this day

chrome widget
#

Tearing my hair out over why setting sprites as children to a card during loading isn't working

#

Because nothing in the docs implies it's functionally any different

modern kindle
#

Well don't be tearing out the hair that's bad for you

Is there an alternative route to take if it is functionally different?

chrome widget
#

there's a separate set_sprites function that I've ignored using for whatever reason

#

And that works, apparently

#

cool

#

shrug

modern kindle
#

It's alright I'm going to take credit for solving it because I asked a question

#

Ur welcome bestie

#

:D

chrome widget
#

Thanks bestie!!!

gilded goblet
frosty dock
#

this boils down to the fact that nil or false == false and false or nil == nil

primal robin
#

That's why I sometimes do not not (<expression>)

chrome widget
#

......... why exactly does the Negative shader draw in place of the card's center or front but also then draw a second version of itself atop it? None of the other editions do that

tired skiff
#

what would i use to see each card in my hand is certain suit or not?

#

like would it be context.other_card:is_suit:['Diamond']?

#

this?

#

im assuming this may work

#

or this

#

well ill see

frosty dock
heavy canopy
modern kindle
#

There are several posts in there of just their ideas so, I'm sure the bar isn't that high

heavy canopy
#

ok

finite zephyr
#

sorry for adding to all the questions 😭 but how could you make a joker allow only a specific type of card/booster pack (planet cards/celestial packs for example) available in the shop? I imagine I could recycle some parts from the planet/tarot merchant vouchers but I really have no idea which parts I can use

vast lily
#

i think i know how you do this

#

the game stores the base probability weight of all shop items as variables, so you'd wanna apply an effect to the run that sets the probability weight of all booster packs you don't want to have show up to 0

#

ill find the code for this in a few mins, currently recovering from a migraine

finite zephyr
#

ah thank you! and don't worry, please take your time :)

tired skiff
#

dear smart people of the modding dev chat
would somone by chance have some extra time to look at my code and explain to me why it is not working??

my goal for this code is to see check if each card in a scorind hand is a diamond and if it is to give 1.5x mult and if a card isnt for it to give 0.5x mult. (think of anchient joker)

vast lily
#

uh oh i dont see the booster pack probability weights in the same place where the base shop item probability weights are stored

finite zephyr
#

these are them right?

#

would it be as simple as invidually setting each p_[booster].weight to 0? what context would this fall under?

vast lily
#

it would have to set the weights to 0 when it is added to the player's joker list and recalculate them when it is removed

hushed field
#

I think you can update the banned keys list mid-run, right?

vast lily
#

apart from that i think you want to change the return statement for when it scores X0.5 mult to this:

return{
   Xmult = card.ability.extra.Omult,
   card = card
}
#

for the return statements in the calculate function, you have to assign stuff to a specific set of possible returns in the table, and Xmult is the one you have to assign if you want it to affect Xmult at all

#

if i understand it correctly ur totally fine to name ur variable that stores the 0.5 Omult but when you assign it in the return function you have to assign it as Xmult = card.ability.extra.Omult

tired skiff
#

i think this should work but there is a error at the end of each diamonds and usualy i would fix that with a , but that dosnt work :<

vast lily
#

hmm what text editor are u using

tired skiff
#

visual studio

#

with a lua add on

#

lemme run balatro and see if it worjs

vast lily
#

ive never seen an error like that, might have something to do with u putting the conditions for ur if statement on a separate line

#

i honestly have been learning lua exclusively through this tho so no idea if that affects anything or not

frosty dock
gilded goblet
#

yep if ... then and elseif ... then

versed swan
#

vscode folks, is there a way to make vscode not complain whenever i use G or SMODS because they dont exist in my mod's directory

sturdy compass
#

I think you can mark them as global variables in the error menu that pops up when you hover over them

zealous glen
#

or you can add folders to your project with those

#

like Steamodded and Balatro

next timber
#

how do i use the colours of custom suits in text?

sturdy compass
#

{C:suit}

next timber
#

awesome thx

sturdy compass
#

just replace suit with whatever suit you're going for

radiant plank
#

how does one go about iterating over consumeables held in G.consumeables?

sturdy compass
#

you could do it a few ways, what are you trying to do with them?

radiant plank
#

reroll what they are

#

its for an end of round effect joker

sturdy compass
#

then a for k, v in pairs(G.consumeables.cards) do loop would work best

#

v is the currently iterated card in this loop

radiant plank
#

so k would just be the card's index, right?

#

im used to seeing ipairs

sturdy compass
#

k is the key, it would be the index if you where using ipairs

radiant plank
#

what would the key be if, say, i had a single Hanged Man?

sturdy compass
#

I wanna say it would be 'c_hanged_man' but I am not 100% sure

radiant plank
#

ill play around with it, thanks for your help!

sturdy compass
#

Could be very wrong on that lol

#

best of luck

radiant plank
#

sendTraceMessage to the rescue

digital niche
#

what is this crash?

frosty dock
sturdy compass
#

fair nuff

maiden phoenix
#

Actually G.consumeables.cards is best used with ipairs

frosty dock
#

k is just a number here

frosty dock
maiden phoenix
#

Smh Aure said it first 😔

#

Yea I was typping

frosty dock
sturdy compass
#

I'm still not into the full nitty gritty of lua stuff but I know enough to make it bend to my will a bit

maiden phoenix
frosty dock
#

lmao

maiden phoenix
#

Why do you have that emote lmaoo

frosty dock
#

I don't

maiden phoenix
#

Not you

#

Maximus

frosty dock
#

right

sturdy compass
digital niche
maiden phoenix
frosty dock
#

center

sturdy compass
#

above

frosty dock
#

below

maiden phoenix
sturdy compass
#

between

frosty dock
#

bottom-right

maiden phoenix
#

Sounds like me testing every align 😅

sturdy compass
#

forward

digital niche
#

so, i only have like 60 lines in my code

#

thats what is confusing me

frosty dock
#

that looks like a malformed loc_vars

digital niche
sturdy compass
#

This is a line in Balatro's code. Check misc_functions in your lovely/dump folder

frosty dock
#

yeah, of any loc_vars function you have in your code

sturdy compass
#

I know, but it'd be helpful for them to know how to access lines from error codes like this

digital niche
maiden phoenix
#

Missed an extra there

frosty dock
#

yeah the second image is the issue

#

you have vars = (...)

#

that's the wrong brackets

sturdy compass
#

Oh yeah that's not a table lol

digital niche
frosty dock
digital niche
digital niche
#

im going a little faster coding now so i might get to when i lost all my code yesterday soon

quartz ravine
#

Hi guys, what am I missing here? I am trying to ensure that all cards that spawn in the store also have my custom edition applied. So far, all of my playing cards start with the edition, but not necessarily cards I see in the store

G.E_MANAGER:add_event(Event({
        func = function()
            if G.jokers then
                
                local card = create_card("Joker", G.jokers, nil, nil, true, true, nil, "foxakashic")
                card:set_edition("e_Fox_akashic", true, true)
                card:add_to_deck()
                card:start_materialize()
                G.jokers:emplace(card)
                return true
            end
        end,
    }))
        G.E_MANAGER:add_event(Event({
            func = function()
                for i = #G.playing_cards, 1, -1 do
                    -- G.playing_cards[i]:set_ability(G.P_CENTERS.m_glass)
                    -- ("e_Fox_ghostRare", true)
                    G.playing_cards[i]:set_edition("e_Fox_akashic", true, true)
                end
                return true
            end
        }))
    end,
sturdy compass
#

Is this code attached to a hook, a calculate function, a patch, what?

quartz ravine
#

Oh I missed the first line, this is the full thing


SMODS.Back{
    name = "Akashic Deck",
    key = "akashic",
    pos = {x = 0, y = 3},
    config = {polyglass = true},
    loc_txt = {
        name = "Akashic Deck",
        text ={
            "Start with a Deck",
            "full of {C:attention,T:e_polychrome}Akashic{} cards"
        },
    },
    apply = function(self)    
    G.E_MANAGER:add_event(Event({
        func = function()
            if G.jokers then
                
                local card = create_card("Joker", G.jokers, nil, nil, true, true, nil, "foxakashic")
                card:set_edition("e_Fox_akashic", true, true)
                card:add_to_deck()
                card:start_materialize()
                G.jokers:emplace(card)
                return true
            end
        end,
    }))
        G.E_MANAGER:add_event(Event({
            func = function()
                for i = #G.playing_cards, 1, -1 do
                    -- G.playing_cards[i]:set_ability(G.P_CENTERS.m_glass)
                    -- ("e_Fox_ghostRare", true)
                    G.playing_cards[i]:set_edition("e_Fox_akashic", true, true)
                end
                return true
            end
        }))
    end,
    init = function(self)
    SMODS.Edition:take_ownership("negative", {
        get_weight = function(self)
            return self.weight * 80
        end,
    }, true)
end
}```
digital niche
next timber
#

whats the easiest way when applying a deck to choose 6 random cards, while ensuring the same card isn't chosen twice?

unkempt thicket
#

How do you get the effects of a card? like the ones you can use in calculate effect.

fringe gyro
#

how do i make the name or description of an owned joker as a string?

#

/is there even a way?

maiden phoenix
next timber
#

lua does assignment by reference though right so thatll also delete the original card

#

and when i tried using a deep_copy function on G.deck.cards before im pretty sure it caused an infinite loop

#

eh i can just loop through, create a list of indices, then operate on that

digital niche
#

would this work?

#

to get like the same amount of money but in chips

#

like if you have $20 you get +20 chips when playing this card

radiant plank
#

how would one go about converting a tarot card to another without deleting the card? i'd like to flip the tarot and have it converted, similarly to how suit changes are handled

#

is this doable given functions provided by smods or the base game?

maiden phoenix
#

Look into take_ownership

#

(in SMODS' code)

radiant plank
#

is it defined as a method for each Center, or is it a standalone function? i've found examples but want to make sure i'm looking in the right spot

maiden phoenix
#

It works on any SMODS.GameObject, so Center included

radiant plank
#

okay thanks

sonic cedar
#

can anyone tell me why this doesnt work? it's supposed to double the probabilities of only certain cards, in this case wheel of fortune

#

oh and i have this at the top of the joker file

crisp coral
#

due to lua metatables you're also affecting the original table

sonic cedar
#

unless the code IS right and i was suppsoed to add something to the main file- come again

digital niche
sonic cedar
#

install the game font from the unpacked source

#

add it through vs code settings

digital niche
#

tyty!!

sonic cedar
#

np!! ^^

sonic cedar
digital niche
sonic cedar
#

.....

#

where are your other fonts.

digital niche
#

oops

sonic cedar
#

you just put it in front of them so it takes priority ya goof

digital niche
#

oooh, tyty

#

still nothing

sonic cedar
#

first let me see

digital niche
sonic cedar
#

ok cool

#

if it hasnt shown up

#
  1. ctrl s
#
  1. restart
digital niche
digital niche
digital niche
stark geode
#

try quotes around the font name

#

i had it on mine but i didnt like that it wasnt monospace

sonic cedar
#

courier new still needs quotes

digital niche
#

oh okok

cerulean rose
stark geode
digital niche
cerulean rose
digital niche
#

still no

tired skiff
#

when creating a random joker i can just set rarity to = 2

stark geode
#

yes

tired skiff
agile thistle
digital niche
#

yeah

agile thistle
#

wait fuck im late

#

Never mind! flies off using my wonderful little wings

digital niche
#

no stay here i still dont havee it 😭

agile thistle
#

ah

#

Okay!

#

so its installed as in

#

ttf double clicked and install button pressed right

digital niche
#

oooh

agile thistle
#

if not you gotta do that

#

then restart vscode

digital niche
#

doing!

sonic cedar
#

you didnt install it 😭

digital niche
#

i thought installing meant liike having it in the pc like an image😭

#

there it issss, tyyy!

agile thistle
#

heartbreaking: font files now unintuitive🥀

#

no problem!

sonic cedar
digital niche
cerulean rose
stark geode
agile thistle
stark geode
#

the thing loads whatever you tell it to load

#

most people do main.lua

cerulean rose
tired skiff
stark geode
cerulean rose
tired skiff
stark geode
#

wait why is yor joker one line

#

you might need to format it

#

sometimes they dont like being one line

#

its wierd

cerulean rose
#

oh the file just appeared when i pressed quit

tired skiff
#

elaborate

cerulean rose
#

didnt show up when i alt-f4'ed

#

but the default still isn't being loaded

sonic cedar
#

problem solved itself

cerulean rose
stark geode
#

im gumb

#

dumb

sonic cedar
#

autocorrect fears you

stark geode
#

so what exactly are your trying to do

cerulean rose
#

i see the problem

#

i dont think G.GAME.Joker_buffer is the number of jokers u have

agile thistle
#
for i = 1, #G.jokers.cards do
    if G.jokers.cards[i].ability.set == 'Joker' then x = x + 1 end
end
#

this is how abstract does it

stark geode
#

Wait

#

I'm guessing it's trying to check if you have room for a joker

cerulean rose
#

thats fucking stupid what the hell

agile thistle
#

i agree!

stark geode
#

Then creates one of you do

#

Check riff raff

manic rune
cerulean rose
#

but if you allow for that insanity what about jokers placed outside G.jokers

stark geode
#

Well #G.jokers.cards is the number of jimbos

agile thistle
stark geode
#

The rarity thing is smods create card

digital niche
#

what is that "bonusodd" used for?

cerulean rose
#

just an rng key

digital niche
#

it was "lucky" before for everything but someeone told me i chould change

cerulean rose
#

thats because you dont want to use the same rng sequence as lucky cards

digital niche
cerulean rose
#

huh?

digital niche
#

like, if i say pseudorandom("bonusodd") in anything it will be the same chance ?

cerulean rose
#

no

digital niche
#

oh okok

cerulean rose
#

"bonusodd" is a sequence of rng values

#

these are used to seperate rng events to make seeds more consistent

#

ex. lucky cards rolling for hits won't affect what jokers you see in the shop

digital niche
#

oooh

cerulean rose
#

pseudorandom just returns a random number from 0 to 1

digital niche
#

then i say what 0 is and what 1 is under right?

cerulean rose
#

no

#

it returns a decimal number

#

between 0 and 1

digital niche
#

ooh, thought it was like a binary thing

cerulean rose
#

so if you want something to be a 50% chance you would do pseudorandom("whatever") < 0.5

stark geode
#

It's looking at if the added jokers and current jokers will exceed the joker limit

gilded goblet
cerulean rose
agile thistle
manic rune
cerulean rose
#

G.GAME.probabilities.normal is used to make probabilities modifiable by Oops! All 6s!

manic rune
#

pseudorandom("seed",min,max)

cerulean rose
manic rune
#

it can return stuff like 4.3848479383

cerulean rose
#

so still continuous then

manic rune
#

mhm

#

u can slap math.ceil/floor on it though probably not, that can affect the rng a bit

cerulean rose
#

???

digital niche
manic rune
# cerulean rose ???

like

4, 4.2, 4.5, 4.9, etc: if you use math.floor on it then it will all return 4, right?

digital niche
#

how can i make the bonus and dollars into loc_vars so i can use it in the text? i tried but just gives "nil"

manic rune
#

but 5 has a much lower chance to return 5 :p

#

so its something to probably be aware of

#

im not good at mathematics to see how much it actually affects your odds though

tepid eagle
#

if you generate a random number between 4 and 5 and then floor it you will realistically only ever get 4

manic rune
#

if you are going for a random number generator going from 1,5 with them being a whole number, u should probably do math.floor(pseudorandom("aa",1,6)) instead as a result

#

so that from 1 to 5, the five int numbers have equal chances to appear

but of course, theres a very minimal chance that it will hit 6 too soooo

cerulean rose
#

nope

#

lua random excludes the end point

#

for this exact reason actually

manic rune
#

ah

#

icic

#

so it was an imaginary issue i had all along lol

digital niche
manic rune
#

you need to set that to your joker's then, not returning it

digital niche
#

its an enhancement

manic rune
#

oh yeah, you didn't set bonus in your extra

digital niche
#

oh wait i can just set the values in extra and set bonus = card.ability.extra.bonus right?

digital niche
manic rune
#

yeah

digital niche
#

wait but if i set p_dollars = 40 wont it automatically give me the $40 when i play the card?

manic rune
#

only if u make it return 40 in dollars

digital niche
#

oh okok, ty!

vast lily
#
local all_faces = true
for k, v in ipairs(context.scoring_hand) do
    if not v:is_face() then all_faces = false end
end

this code checks all scoring cards in the played hand, and sets the variable to true if they're all face cards and false otherwise, but does anyone know how to make it check the unscored cards in the played hand also?

#

do I just change it to say played_hand where it says scoring_hand?

#

I honestly might not even implement this, but it'd be neat to know how to do it

digital niche
vast lily
#

tried changing it to played_hand and game crashed. so safe to say that doesn't work

digital niche
#

am i missing something in here? trying to make the card score the amount of money you have

fringe gyro
#

how do i keep the joker.label from including the J-ModName?\

sonic cedar
#

someone had said earlier that the setup affecting the actual metatable is why this doesnt work, can someone elaborate? it's supposed to double the properties of certain consumables (in this case wheel probability)

sonic cedar
#

oh SCORe

#

hold on

digital niche
sonic cedar
#

certain amount of what

thin anchor
#

how would i use tailsman number tables or whatever they are for my jokers?

thin anchor
#

wow

#

that looks horrible!

quartz ravine
#

hi folks, anyone have experience with custom decks here? I am trying to ensure all jokers and cards that appear are of a certain edition. So fare, all of my cards in my hand have this edition but not cards or jokers in the store

sonic cedar
#

example of it on a joker

thin anchor
#

ok so no tailsman then

digital niche
thin anchor
#

not doing that for every joker and enhancement i have made

sonic cedar
digital niche
sonic cedar
#

are you thinking of "chips"

digital niche
#

return bonus = G.GAME.dollars

digital niche
stark geode
#

I'm going to add these to my mod

#

idk what else to add rn

sonic cedar
#

smods does it automatically

digital niche
#

ooh, thought had to say bonus to refer to chips

sonic cedar
#

youre probably thinking of money

digital niche
#

wait but in the enhancement charts it says bonus is extra chips

stark geode
#

anyone have that texture for the dr specterd scholar card

sonic cedar
digital niche
sonic cedar
#

let me actually read up then

old dirge
#

how do i add the silly into the game as his own sprite

stark geode
#

as a joker?

old dirge
#

yeah

#

just add him to the jokers sprite sheet

#

?

sonic cedar
stark geode
#

this should get you started on balatro modding

sonic cedar
#

you did

#

it's an enhancement

#

so use bonus

#

and then set it

stark geode
#

anyone know where i can get this card texture

sonic cedar
#

gotta join his community iirc

sonic cedar
stark geode
#

well the mod has a relese for lovly

#

but it no work on smods

#

i want to make smods verson

#

but there is no textures

digital niche
digital niche
sonic cedar
#

what's the crash

digital niche
digital niche
sonic cedar
#

oh wait

#

make it a local variable instead

digital niche
#

so ill say return {vars={dollars={G.GAME.dollars}}} ?

sonic cedar
#

no like

#

local

#

like uhhhhhhhhhhh

digital niche
#

like in here?

sonic cedar
#

local dollars = G.GAME.dollars

#

and then youd have to put that in your calculate

#

and your loc_vars (outside of the return)

digital niche
digital niche
sonic cedar
#

should be

#

did you put the same line in loc_vars

digital niche
#

putting rn!

#

wait you mean like that or as card.ability.extra.dollars?

sonic cedar
#

where did you put that

digital niche
#

in loc_vars

sonic cedar
#

ok but

#

how

digital niche
#

return {vars={local dollars = G.GAME.dollars}}

#

oh wait is outside the return isnt it?

faint yacht
digital niche
#

at least it should, we are trying to make it work

faint yacht
#

return { chips = G.GAME.dollars } ?

digital niche
#

lemme try

sonic cedar
tired skiff
#

chat help me out here

sonic cedar
#

or did chips work on enhancements now

sonic cedar
digital niche
tired skiff
#

crash on line 195

#

i try to create a random uncomman joker

sonic cedar
#

and what's the crash

tired skiff
digital niche
quartz ravine
digital niche
quartz ravine
#

lol!

#

is this a joker who would do that?

digital niche
tired skiff
#

oh

faint yacht
#

Not sure about the chips not being given, but for loc_vars, return { vars = { G.GAME.dollars or 0 } } ?

digital niche
#

lemme try

digital niche
#

the h_dollars its because it also gives youu $6 while holding

faint yacht
#

Should be it.

sonic cedar
old dirge
#

wait what should a main.lua be

#

just for an example

#

(metadata)

digital niche
digital niche
old dirge
#

well

#

ok

faint yacht
#

...something ain't adding up then, though, to be fair, I've not done any editions or enhancements myself, just Jokers primarily. Apologies. 😅

digital niche
#

im a little confused myself aswell, because it should be working with the return thing

quartz ravine
#

I think I've got it for you @digital niche

digital niche
quartz ravine
#

format_ui_value(G.GAME.dollars)

digital niche
#

where do i add this

quartz ravine
#

G.GAME.dollars is a table, this command converts it

digital niche
#

ooooh

#

do i add this in calculate?

quartz ravine
#
SMODS.Joker { --Pair Pear
    name = "Mult Joker",
    key = "testJoker",
    config = {
        chips = 1.0,
        pairChipGrowth = 2,
        threeChipGrowth = 3,
        fourChipGrowth = 4,
        fiveChipGrowth = 5
    },
    loc_txt = {
        ['name'] = 'Mult Joker',
        ['text'] = {
            'Gives mult equal to the current amount of money held',
            "{C:inactive}Currently + #1#s{}",
        }
    },
    loc_vars = function(self, info_queue, card)
        return { vars = { format_ui_value(G.GAME.dollars)or 0 } }
    end,
    pos = {
        x = 7,
        y = 2
    },
    cost = 2,
    rarity = 1,
    blueprint_compat = false,
    eternal_compat = true,
    unlocked = true,
    discovered = true,
    atlas = 'FoxModJokers',

    calculate = function(self, card, context)
        if context.joker_main then
            return {
                chips = tonumber(format_ui_value(G.GAME.dollars)) or 0,
                card = card
            }
        end
    end}
#

ignore the config, and rename it to match, especially don't forget to change the atlas

Also I made it give chips, not mult, so change that too

digital niche
#

im not using a joker, its an ennhancement

digital niche
quartz ravine
#

An enhancement is very close to a joker too. For your use case of the value changing, just add a calculate block

digital niche
#

ook!!

#

tyty!

quartz ravine
#

I don't know if you need an example of an enhancement. I have one if you'd like to see

digital niche
old dirge
#

wait so when i want to add a joker lets say

#

what do i add to the mod's folder

digital niche
#

oh nono, i made a couple already, ty!

quartz ravine
#

Put this calculate in your enhancement ```
calculate = function(self, card, context)
if context.joker_main then
return {
chips = tonumber(format_ui_value(G.GAME.dollars)) or 0,
card = card
}
end
end}

sonic cedar
digital niche
old dirge
#

what kinda file would i create

#

json?

#

lua?

digital niche
old dirge
#

ok

quartz ravine
quartz ravine
#

oh, lol! It's an enhancement, it will never be called in joker main, lol. Sorry

#
    if context.cardarea == G.play and context.main_scoring then
            sendInfoMessage("I am being played", "grassCard")

            return {
                chips = card.ability.extra.h_x_chips
            }
        end
#

that's the context window you want

digital niche
#

also tried using the context.cardarea and still nothin

rapid stag
#

i'm gonna bump this again with the clarification of reordering ALL jokers that appear in the collection, vanilla or not

kinda wish you could at least have it sort by rarity

old dirge
digital niche
#

ty so much @quartz ravine 😭

old dirge
#

also.. is there a joker that gives you +mult for every blind you skip?

digital niche
old dirge
#

yeah but im just wondering if there is one already

crisp coral
old dirge
#

"atlas"?

digital niche
old dirge
#

if i left it blank would it be a normal texture?

quartz ravine
digital niche
#

in your mod folder you'll want to make a folder called "assets" and inside of it one named "1x" and one named "2x"

digital niche
old dirge
quartz ravine
#

always make your card art at 1x. Then use the resize.py script to upsample to 2x

old dirge
#

ok

old dirge
#

except i manually upscaled it

radiant bough
#

How do you duplicate a joker?

spiral crown
#

I don't know where I am going wrong

spiral crown
radiant bough
#

Alr, I will quote you though

spiral crown
old dirge
#

opinions?

spiral crown
old dirge
#

i dont know what this would be for any of their files though

spiral crown
#

where the sprite starts

stark geode
spiral crown
old dirge
digital niche
stark geode
#

does anyone know how to make game reapply custom textures when switching between pixel art smoothing

old dirge
#

the joker i copied doesnt match up with its position

finite kernel
#

Hello, new modder here

digital niche
finite kernel
#

how might one send a message while in an event??

quartz ravine
digital niche
old dirge
finite kernel
#

doing this currently, doesnt work

digital niche
finite kernel
old dirge
#

it says (the circled one) is x-5 y-1

#

im thinking its 5 to the right 1 down

stark geode
#

found that texture

old dirge
#

but maybe??

finite kernel
stark geode
old dirge
stark geode
#

oh wai

#

counting starts a 0

old dirge
#

that ss though has 1 more on the top row to the right

stark geode
#

damnit

old dirge
#

yeah..

#

because the y starts at 0 also

quartz ravine
#

I did something wrong and now they won't stop juicing!

spiral crown
agile thistle
tall apex
digital niche
#

is there a way with debugplus to guarantee a probability?

old dirge
#

so can anyone help me with this bottom part

quartz ravine
#

No, I don't think that's your true issue. I would try commenting out the two ipairs statements and see if it stays more stable

digital niche
agile thistle
#

mod where juicing gets stronger the more it happens

finite kernel
#

new guy ignored, sigh

digital niche
old dirge
brazen tusk
finite kernel
digital niche
finite kernel
#

its a joker

brazen tusk
#

at least im fairly certain it starts at 1

stark geode
digital niche
finite kernel
#

i need it to pay you 20 dollars then kill itself

old dirge
finite kernel
#

it works currently but i cant get it to give you a message that you got the money before it dies

old dirge
#

HOW CODE

digital niche
spiral crown
old dirge
#

also can i get a brief description of eaach of these

#

except blueprint

#

(duh)

digital niche
finite kernel
#

but i want it to splash "20$" THEN die and go " bye bye"

#

you get me?

finite kernel
stark geode
#
SMODS.Joker{
    key = 'PNA',
    atlas = 'jokers',
    pos = {x = 1, y = 1},
    rarity = 'Perkolator_Perkeo_R',
    blueprint_compat = true,
    calculate = function (self,card,context)
        if context.individual and context.cardarea == G.play then
            if #context.full_hand  == 1 and  G.GAME.current_round.hands_played == 0  then
                G.playing_card = (G.playing_card and G.playing_card + 1) or 1
                local _card = copy_card(context.full_hand[1], nil, nil, G.playing_card)
                _card:set_edition('e_negative', true)
                _card:add_to_deck()
                G.deck.config.card_limit = G.deck.config.card_limit + 1
                table.insert(G.playing_cards, _card)
                G.hand:emplace(_card)
                _card.states.visible = nil

                G.E_MANAGER:add_event(Event({
                    func = function()
                        _card:start_materialize()
                        return true
                    end
                })) 
                return {
                    message = localize('k_copied_ex'),
                    colour = G.C.CHIPS,
                    playing_cards_created = {true}
                }
            end
                        --like this
            return {
                message = "DUPLICATED",
                colour = HEX('56a786')
            }
                      --message end
        end
    end
}
finite kernel
#

but this is before that

digital niche
finite kernel
old dirge
digital niche
#

and extra shouldnt be a number, it should be config = {extra = {thing = number}}

old dirge
#

i didnt set it to that lol

#

but like.. what does it do

digital niche
# old dirge what

like, if you want a enhancement that gives +30 cchips you would use:

config = {extra = {bonus = 30}}
loc_vars = (self, infoqueue, context)
return {vars = {card.ability.extra.bonus}}
old dirge
#

oh

#

nah ill just leave it at "4"

digital niche
finite kernel
#

how to force_message

#

??

digital niche
#

extra cant be a number

stark geode
#

im reading the gros micelle code

#

its wierd

old dirge
#

sorry forgot spaces

#

it'll be at 0

#

wait so whats this

old dirge
#

G.JUICEMULT

#

is interesting

agile thistle
#

that should work anyways

finite kernel
#

oh wait i can just steal code

digital niche
old dirge
#

how do i code the joker's ability

digital niche
digital niche
old dirge
#

maybe it should start even actually

digital niche
old dirge
#

4 should work better

spiral crown
old dirge
digital niche
#

start with this

old dirge
#

infoqueue not info_queue?

digital niche
#

we use extra = {(thing you are using)} because then we can refer to the value in the text even if its doubled or smt and will still show the right amount, also for other things ofc

digital niche
old dirge
digital niche
#

yeah! thats it!

#

lemme check how to do the bind skip thing, 1 sec!

old dirge
#

👍 all good

#

thanks for the help so far though

digital niche
#

you welcome!

vague helm
#

Is there an easy way to replace the "Saved by Mr. Bones" text for a custom Joker that also saves the player?

faint yacht
#

...unfortunately, need to Lovely patch for that. I've went down this route already (https://github.com/TheOneGoofAli/TOGAPackBalatro/blob/main/lovely.toml) for one of the Jokers I did.

GitHub

A personal timewaster project that is a mod for Balatro. - TheOneGoofAli/TOGAPackBalatro

GitHub

A personal timewaster project that is a mod for Balatro. - TheOneGoofAli/TOGAPackBalatro

stark geode
sonic cedar
tall apex
#

question

#

how long of an animation can an animated joker have

#

im brewing war crimesxz

faint yacht
#

...depending on how you doing said animations, but I don't think there is one?

keen tiger
#

whats the way balatro does something like random.choice?

tall apex
#

good.,, good.,

keen tiger
#

im trying to reverse my way to the blind changing code

tall apex
faint yacht
stark geode
keen tiger
#

the majority of balatro's game flow is in game.lua, right?

#

mostly trying to dig around in there for aspects of the game lifecycle to hook into

#

also another random question: is it possible for a mod to bring it is own dll fiile to use

#

i might need it architecturally since i might need another non-http networking protofcol

reef belfry
#

Made this one on a whim but i got 0 clue what it should do

sonic cedar
keen tiger
#

oh, so all the state changes are literally just in one file lmfao

digital niche
#

what is the context for skip blind?

narrow iron
#

where is take_ownership() located at in the documentation?
nvm found it!

manic rune
#

the fact that i can only look at y'all questions and unable to answer any of them cuz im in class rn

#

💔

narrow iron
#

nooo 💔

sonic cedar
#

youre killing me bepis

digital niche
manic rune
sonic cedar
#

ends your class with my mind

narrow iron
#

when im using take_ownership for glass cards, what do i put after SMODS. ? like i would put Joker for jokers but im using it for glass cards

#

i think i figured it out Enhanced

#

welp, thats not it

spiral crown
#

Trying to find a way to message for each card destroyed/removed I feel like I am missing something obvious here but I have been up for WAY too long lol

narrow iron
#
  {
    update = function(self, card, dt)
      if G.mymod.change_glass then
        self.config.x_mult = 1.5
      else
        self.config.x_mult = 2
      end
    end
  }
)```
hey why isnt this working?
im trying to change the xMult of glass cards based on a variable
chrome widget
#

The prefix is wrong

#

Are you trying to change glass joker?

narrow iron
#

nope, glass cards

chrome widget
#

You're trying to take ownership of a joker

narrow iron
#

well what do i change Joker to then?

chrome widget
#

SMODS.Enhancement:take_ownership()

young ridge
#

hey guys, this probably has been asked a ton so Im sorry, but im working on my first ever mod, and I think Ive suceesfully addes a joker, the thing I want to ask for help is if you could help me to give myself mynew joker at the beggining of the game so I can test it? thx in advance

narrow iron
#

oh, i mustive misspelled it the first time

narrow iron
#

its what most people use i believe

keen tiger
#

Does smods have the capability to do function hooking?

young ridge
#

ty

keen tiger
#

i know lovely can inject code but it looks...intimidating

narrow iron
hardy viper
chrome widget
keen tiger
#

sorry pidgin lua since im not familiar with the language efully

chrome widget
#

Ideally you store the return from old() and then return it at the end

keen tiger
#

oh yeah

chrome widget
#

(even if the function returns nil normally, just for the sake of mod compatibility, since someone else could hook the same function)

keen tiger
chrome widget
#

Since it's a global function/table, it technically just goes anywhere

keen tiger
#

okay so just top of mod file gotit

chrome widget
#

Lua has very little in the way of like type or scope protection

#

If you declare functions used in the same file, you need to have them above where they're used in the file

hardy viper
#

just call something 5000 times and it'll become statically typed obviously

#

(yes i know that it'll have guards) (yes i know that luajit compiles traces and not functions)

narrow iron
chrome widget
#

do Xmult instead of x_mult

narrow iron
#

thx

daring fern
#

How could one retrigger a consumable when it's being used?

spiral crown
#

Can't tell you the whole thing but I would start with context.using_consumeable and then looking at the retrigger example for sock and buskin

#

@daring fern

digital niche
#

the gray text is {E:1}?

manic rune
#

no

narrow iron
#

like this?

daring fern
manic rune
#

C:inactive

narrow iron
#

yea

digital niche
#

oh tyty!

manic rune
narrow iron
#

ah fair

spiral crown
#

why does message not trigger for each card broken/destroyed?

manic rune
#

im thinking about making a small mod that lets you easily add music in balatro to replace main theme, blind music and such

manic rune
daring fern
manic rune
#

its not as simple as that, i think

#

someone tried doing the same, and i dont remember their name but another person explained that retriggers dont work the same way for consumables

spiral crown
manic rune
#

nop

#

SMODS.calculate_effect({message = "test"}, card)

spiral crown
manic rune
#

thanks 😭

narrow iron
#

where does the source code choose what message cards should display when scoring?

#

like the 'X2' for glass cards

manic rune
#

the

spark pumice
#

I've never made a mod before (but I have plenty of other mods installed already), is there a simple tutorial for me to follow to get started?

daring fern
gentle rain
#

can i get help with the wording on this? this is the best i can think of but i feel like it could be better

#

the "unused discard" means how many you have left at the end of the round

daring fern
#

How could I put my mod badge on things that have seals other than playing cards?

tall apex
hexed heath
tall apex
hexed heath
#

yeah

#

not on mac for now

tall apex
#

You my friend have gotten a mod downloaderer

#

218 mult on a common gonna go crazy

spiral crown
gentle rain
#

joker that scales with the size of your hard drive.

gentle rain
karmic arch
narrow iron
#

wow this source code is very confusing

#

nvm it was a typo on my part 🤦

digital niche
#

what is wrong in here?

hexed heath
unborn quail
hexed heath
#

uhh

#

gains 0.25x mult when K or J scored

unborn quail
#

cool

karmic arch
# hexed heath

I just realized that this is a pay to win joker (well, almost)

digital niche
spiral crown
#

"X 1 mult for every dollar donated to my patreon" lol

hexed heath
#

ez

narrow iron
#

smods completely rewrites the glass shattering part of the evaluate_play function, which means ive spent the last 2 hours basing everything off code which doesnt exist 😭

tired skiff
#

litterly how

#

i need to know

hexed heath
#

nativefs

tired skiff
#

imagin a joker that gives xmult = to thhe amount of viruses u have installed

spiral crown
digital niche
tepid crow
tepid crow
# digital niche

I'd like to reiterate the first part of that question "what is supposed to be happening but isn't"

digital niche
#

when skipping blind it is crashing when should be giving +2 perma mult

narrow iron
#

can i use lovely to inject to modify one of steamodded's files?
i need to modify a smods function

digital niche
#

tried to perform arithmetic uaing mult (a nil value)

spiral crown
#

could try adding a context.joker_main at the end

#

found that int he documentation

tawny narwhal
spiral crown
tawny narwhal
#

Guys, I'm trying to make a Joker that replays other (specific) jokers. I've looked at S&B and Baseball Joker, but I still can't crack this one.

manic rune
glass scaffold
#

can

manic rune
#

that wont work

digital niche
#

yeah

manic rune
#

u gotta remove the return part

narrow iron
reef belfry
#

whas the pixel width n height of a booster pack

tawny narwhal
#

Dayum my joker won't work for some reason...

tawny narwhal
tawny narwhal
#

yea

#

I'm good with word

#

English is the only language I speak and I still speak it like my second

manic rune
#

mmm did u turn on the retrigger_joker part in optional features

tawny narwhal
#

No...

#

I didn't even know that was a thing.......

mystic moth
#

Hey im really sorry to interrupt anything

Does anyone know how to change UI like the Title Screen or the BG? I saw this code in the files but i wasnt sure how to change it since im horrid at coding itsfine

manic rune
tall wharf
#

belis wtf

manic rune
#

whos that

tawny narwhal
manic rune
#

@tawny narwhal put this at the top of your main.lua or smt similiar first

#

then in here, you will have to make sure that context.other_card is the joker you want to retrigger

tawny narwhal
#

Chad

agile thistle
manic rune
#

you could have something in their ability.extra to tell whether they are a jet joker or not

#

like

tawny narwhal
manic rune
#

...and context.other_card.ability.extra.is_jet_joker then

manic rune
#

did i explain it well enough lol

tawny narwhal
#

Yes

#

One q

minor furnace
tawny narwhal
#

SMODS.current_mod... Is that the prefix I should put in there, or is it literally "...current_mod..."

tawny narwhal
manic rune
#

SMODS.current_mod refers to your own mod already

#

theres no need for prefix

manic rune
#

since i havent done it myself 💔

mystic moth
#

Ok! Thank you!! <:]]

gentle rain
#

can someone help me with this? for some reason, its incrementing once per card held in hand, resulting in 41 retriggers if there are 8 cards held?

#

ohhh, am i missing context.individual?

tall apex
#

i was gonna try and help but i got nothin

daring fern
gentle rain
#

aah right right

manic rune
#

both work i think

gentle rain
#

for whatever reason the source code has neither of those

manic rune
#

its smt added by smods

gentle rain
#

i see

long acorn
#

is there a way to simply check if the played hand in a secret hand
to account for cross mod stuff

daring fern
gentle rain
#

would secret hands that have been revealed be considered visible in that case?

daring fern
long acorn
#

yeah im just iffy if like that would make it not work if the hand is already played

gentle rain
#

lemme see how cardsauce does it

#

it has a joker thats "level up played secret hand" and it works with spectrums not found in the mod

gentle rain
daring fern
#

Did you find where this was defined?

long acorn
#

im guessing i gotta write something like isSecret() that fires when the game starts and make my joker read that

gentle rain
long acorn
#

luas weird

gentle rain
#

every joker has its own lua file in cardsauce

daring fern
gentle rain
tawny narwhal
manic rune
#

weird

#

how does your code look like rn?

tawny narwhal
#

wait

#

it shouldn't be in the calulate area should it?...

manic rune
#

it should be in calculate