#💻・modding-dev

1 messages · Page 687 of 1

daring fern
#
for k, v in pairs({'Straight', 'Flush', 'Straight Flush'}) do
    context.poker_hands[v] = next(context.poker_hands[v]) and context.poker_hands[v] or context.scoring_hand
end
timid zinc
#

essentially i'm trying to not load some crossmod content if a certain option in the other mod is selected

#

yeah same thing, config is not indexed at this point

slate turtle
frosty dock
slate turtle
#

oh

#

fuck

slim ferry
#

this is the same code

#

the question is what is line 93

slate turtle
#

idk why its oing that 😭

#

oh right. line 93

#

play_sound('card1', percent)

slim ferry
#

okay uhh

#

i dont know

slate turtle
#

fuck

#

FOUND THE TROUBLEMAKER

#

G.hand.highlighted[i]:flip()

silk latch
silent sail
#

can someone explain why this only works if i put a number in and refuses to work with a variable

silent sail
#
if target_joker then
                        BAGGUTRO.modify_joker_values(target_joker, {['*'] = card.ability.extra.value}, {x_mult = 1, x_chips = 1, h_size = 0, extra_value = true, cry_prob = true, d_size = 0, card_limit = true, extra_slots_used = true})
                        end
#

card.ability.extra.value

hushed stump
#

And which variable do u want to use for that?

silent sail
#
config = {
        extra = {
        value = 1.2
        }
loc_vars = function(self, info_queue, card)
        local val = (card.ability.extra and card.ability.extra.value) or self.config.extra.value
        return {vars = {val}}
    end,
#

value

#

thats the name of the variable

hushed stump
daring fern
silent sail
silk latch
#

How would I make the value given by a consumable increase after scoring over the blind threshold?
Because I tried

    config = { extra = { money = 5, money_gain = 3 } },
    loc_vars = function(self, info_queue, card)
        if SMODS.last_hand_oneshot and test ~= true then
            card.ability.extra.money = card.ability.extra.money + card.ability.extra.money_gain
        end
        return { vars = { card.ability.extra.money, card.ability.extra.money_gain } }
    end,
    use = function(self, card, area, copier)
        G.E_MANAGER:add_event(Event({
            trigger = 'after',
            delay = 0.4,
            func = function()
                play_sound('timpani')
                card:juice_up(0.3, 0.5)
                ease_dollars(card.ability.extra.money, true)
                return true
            end
        }))
        delay(0.6)
    end,

but that increases the value whenever I hover over it (if the last hand oneshot the blind) and for some reason doesn't let me actually use the consumable

silk latch
#

How do I access the primary_color and secondary_color of a consumable type?

daring fern
silk latch
#

do I keep the []?

daring fern
silk latch
#

Also for some reason my booster packs refuse to localize at all whatsoever, despite me having both packs' keys (mannpowerpack_1 > p_mannpower_mannpowerpack_1 and mannpowerpack_2 > p_mannpower_mannpowerpack_2) defined in en-us.lua's descriptions, and the group key in its dictionary, with k_mannpower_pack = "Mannpower Pack"

silent sail
#
create_card = function(self, card, i)
        return {
            set = "Joker",
            rarity = "Legendary",
            edition = "e_baggutro_faded",
            stickers = {"perishable" , "rental"},
            area = G.pack_cards,
            skip_materialize = true,
            soulable = true,
            key_append = "baggutro_faded_legends_pack"
        }
    end,

why does this not apply the stickersx i want?

daring fern
silent sail
#

i see

#

splendid

silk latch
normal crest
#

put them under Other not Booster

urban wasp
#

i have a joker that makes it so that celestial packs have a chance to have tarot cards in them
now, obviously, tarot cards often need a hand in the booster pack to actually do stuff with, so i made it so that draw_hand = true in my hook
...but now hands are always drawn regardless of the ownership of the joker. how can i make it so that draw_hand equals false unless my joker is owned (in which case it'd be true)?

#

because this didn't work

draw_hand = next(SMODS.find_card("j_bof_j_eureka")) and true or false,
#

i assume this function in booster packs isn't always updated but i'm not quite sure how to get around that

daring fern
urban wasp
#
SMODS.Booster:take_ownership_by_kind("Celestial", {
#

er wait maybe i misunderstood that question since i think draw_hand is the function

#

or i'm overthinking it

daring fern
# urban wasp or i'm overthinking it
update_pack = function(self, dt)
    local state_wasnt_complete = not G.STATE_COMPLETE
    SMODS.Booster.update_pack(self, dt)
    if next(SMODS.find_card('j_modprefix_key')) and state_wasnt_complete then
        G.E_MANAGER:add_event(Event({
            trigger = 'immediate',
            func = function()
                G.E_MANAGER:add_event(Event({
                    trigger = 'immediate',
                    func = function()
                        G.FUNCS.draw_from_deck_to_hand()
                        return true
                    end
                }))
                return true
            end
        }))
    end
end
urban wasp
#

or wait is this supposed to be in the hook or the joker itself

#

oh i just saw the edit

#

it works perfectly now!! thank you so much

#

question: why are there two events inside of each other?

#

just curious

daring fern
urban wasp
#

cool

subtle wing
#

Is there any sort of template for Joker mods or at least a rundown of the functions?

frosty dock
subtle wing
#

okay trying to hybridize green joker and greedy joker isn't going as well as i'd hoped

#

at least as far as deciphering it goes

frosty dock
subtle wing
#

i know that, i just have them back to back to try and cross reference and combine them

#

what i'm trying to accomplish is that if a scored card is not exclusively Diamond suit (this includes wild Diamonds) it loses 1 mult
but if it is exclusively Diamond suit, it gains 1 mult

daring fern
subtle wing
#

Basically yes

daring fern
# subtle wing Basically yes
if context.individual and context.cardarea == G.play then
    local passed = context.other_card:is_suit(card.ability.extra.suit)
    for k, v in pairs(SMODS.Suits) do
        if context.other_card:is_suit(v.key) and v.key ~= card.ability.extra.suit then
            passed = false
        end
    end
    if card.ability.extra.mult >= card.ability.extra.false_sub and not passed then
        SMODS.scale_card(card, {
            ref_table = card.ability.extra,
            ref_value = 'mult',
            scalar_value = 'false_sub',
            operation = '-',
            no_message = true
        })
        return {message = localize({type = 'variable', key = 'a_mult_minus', vars = {card.ability.extra.false_sub}}), colour = G.C.RED, message_card = card}
    elseif passed then
        SMODS.scale_card(card, {
            ref_table = card.ability.extra,
            ref_value = 'mult',
            scalar_value = 'true_add',
            no_message = true
        })
        return {message = localize({type = 'variable', key = 'a_mult', vars = {card.ability.extra.true_add}}), message_card = card}
    end
end
if context.joker_main then
    return {mult = card.ability.extra.mult}
end
subtle wing
#

Oh uh
Thank you, didn't expect this

ancient mango
#

i wanna make it so if the player has smeared joker and changes the atlas of the deckskin

#

how do i do that

#

how do i change a texture of something in runtime

gilded blaze
#

Malverk actually allows such things
but you need to modify it to fit your needs

ancient mango
#

is there a different way

#

cause i see a lot of mods that has cards that change texture like blueprint for example

gilded blaze
#

the blueprint mod uses shader, which is way too advanced

ancient mango
#

ah

#

well is there a way to change the textures of something

gilded blaze
#

there's only Malverk for runtime changes

ancient mango
#

then how do i do it

gilded blaze
#

again, you need to modify it to fit your needs

#

it's simply a texture pack manager with its own API

ancient mango
#

ok but how do i do it

gilded blaze
#

no one's done it before h_

#

not even I know how it works

ancient mango
#

how does malverk change textures?

gilded blaze
#

it creates default atlas data based on what's already in the game, makes space for storing external texture packs and redirects several method calls to seamlessly switch between them

ancient mango
#

because it switches textures in runtime

gilded blaze
#

it's mainly designed to switch textures at runtime, but through a config page

#

to do that automatically for your Smeared Joker case, you have to tweak the code a bit and squeeze your logic inside

ancient mango
#

how does take_ownership() work

ancient mango
#

someone?

#

help

silent sail
#
calculate = function(self, card, context)
        if context.repetition and context.cardarea == G.play  then
            if SMODS.get_enhancements(context.other_card)["m_steel"] == true then
                return {
                    repetitions = card.ability.extra.retrig,
                    message = localize('k_again_ex')
                }
            end
        end
        if context.repetition and not context.cardarea == G.hand and context.end_of_round and (next(context.card_effects[1]) or #context.card_effects > 1)  then
            if SMODS.get_enhancements(context.other_card)["m_steel"] == true then
                return {
                    repetitions = card.ability.extra.retrig,
                    message = localize('k_again_ex')
                }
            end
        end
    end

can someone explain why this doesnt work?

gilded blaze
#

steel cards don't trigger at end of round

#

also it's recommended to use SMODS.has_enhancement(context.other_card, "m_steel")

slim ferry
#

not context.cardarea == G.hand also doesnt work

#

not is like one of the first things that happens in order of operations

#

plus the cardarea will pretty much always be G.hand at end of round

rapid stag
slim ferry
#

Kid named ~=

slate turtle
#

so, the reason most multi-effect consumables were worked is because they were being deselected

#

but now, i run into another problem

#

since it is probably needed

#

remaining 29 lines

#

end
for i = 1, #G.hand.highlighted do
local percent = 0.85 + (i - 0.999) / (#G.hand.highlighted - 0.998) * 0.3
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.15,
func = function()
G.hand.highlighted[i]:flip()
play_sound('tarot2', percent, 0.6)
G.hand.highlighted[i]:juice_up(0.3, 0.3)
return true
end
}))
end
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.2,
func = function()
G.hand:unhighlight_all()
return true
end
}))
delay(0.5)
end
end,
can_use = function(self, card)
return (to_big(#G.hand.highlighted) <= to_big(3))
end
}

winter flower
slate turtle
#

where

winter flower
slate turtle
#

tysm

#

so 55 would be end and 56 would be for i = 1, #G.hand.highlighted do

#

oh right. maybe its syntax

#

no its not

#

okay

#

what happens when i use mythril is as follows

#
  • all of the cards selected flip over
#
  • the queen unflips
  • cards flip again
  • game crashes
#

idk why its doing that

slate turtle
faint yacht
#

...assuming context.other_card, should be checking if that's defined. 😅

#

Something like if context.other_card and context.other_card.farts and such.

thorn ingot
#

Guys. How do I change the shop size for a deck? I'm trying this but it doesn't work.

   change_shop_size(2)
end,```
near pagoda
#

im using context.scoring_hand[1]:get_id() in a mod im making and am wondering what the id's are for the non numbered cards and or where to find them

frosty rampart
frosty rampart
near pagoda
#

Thank you : D

thorn ingot
frosty rampart
#

odd

royal comet
#

how do i drawstep BELOW the card or
z order overall for that matter

frosty rampart
#

order can go below 0, and in fact the "center" (the card itself) is at order = -10
i'd recommend staying above -50, as that's when the card's tilt variables get updated, so if you go below that then the tilt will be 1 frame behind the rest of the card

royal comet
#

oh thanks!!

frosty dock
#

shadow is at -1000

#

buttons at -100

#

that's all that's below -50 anyway

thorn ingot
median veldt
#

this is how i have it

#

but it wasnt working

#

waitholdon

#

nevermind!!! i fixed it myself so sorry to bother you

silent sail
daring fern
silent sail
#

ah

#

how would i fix this to not break

urban wasp
#

how do you change the weight of a modded rarity

silent sail
# urban wasp how do you change the weight of a modded rarity
SMODS.Rarity {
    key = "lunar",
    pools = {
        ["Joker"] = true
    },
    default_weight = 0.05,
    badge_colour = HEX('0a2533'),
    loc_txt = {
        name = "Lunar"
    },
    get_weight = function(self, weight, object_type)
        return weight
    end,
}

heres what i have with my rarity

urban wasp
#

that's not what i mean; i'd like a deck to change the weight of a rarity

silent sail
#

oh no clue

daring fern
frosty rampart
#

(for vanilla rarities that's G.GAME.common_mod etc)

urban wasp
#

thank you

#

just needed it for modded rarities

#

(i forgot the mod prefix)

gusty compass
#

how would i go around making a seal that treats the hand played (with the seal) as first hand played, cus idk what im doing wrong but it just doesnt really work

#

for context

daring fern
# gusty compass for context
if context.press_play then
    local passed = false
    for k, v in pairs(G.hand.highlighted) do
        if v == card then
            passed = true
        end
    end
    if passed then
        G.GAME.modprefix_old_hands_played = G.GAME.current_round.hands_played
        G.GAME.current_round.hands_played = 0
    end
end
if context.after and G.GAME.modprefix_old_hands_played then
    G.GAME.current_round.hands_played = G.GAME.modprefix_old_hands_played
    G.GAME.modprefix_old_hands_played = nil
end
gusty compass
#

i tested it with dna and i dont think it worked

#

the edit did work tho

#

thanks :D

slate turtle
#

FUCK

slate turtle
#

SHIT

#

i am about to go crazy

faint yacht
#

Loose , somewhere.

slate turtle
#

thx

subtle wing
#

So how do those pop-ups of side-info work? Like, if you have a joker that works with steel cards, how does it display the pop-up to explain steel cards

slim ferry
#

specifically the info_queue bit

lusty osprey
#

i just wanted to pick up chaos the clown:/

subtle wing
#

so where exactly am I going wrong with this one?

#

(I wanted to build it off of Midas Mask instead but the way it's structured made me unsure how to redirect it to unscored cards)

true jasper
subtle wing
#

(i already fixed the ccontext typo)

daring fern
subtle wing
#

I'm not sure I understand what line that goes on

#

wait shoot i should include the line numbers

lusty osprey
pastel kernel
#

How do I get the base chips and Mult of a straight?

granite apex
#

_

subtle wing
slim ferry
#

And mult

lusty osprey
daring fern
subtle wing
daring fern
subtle wing
slim ferry
#

not SMODS.in_scoring

subtle wing
#

where the hell is it talking about

[lovely SMODS.preflight.loader "src/preflight/loader.lua"]:775: [SMODS lusciousjoker "attempt.lua"]:28: '}' expected (to close '{' at line 18) near 'pos'```
#

I can't find a single spot where a } is missing

frosty dock
subtle wing
#

I tried adding a comma and it just said there was an unexpected symbol

frosty dock
#

show lines 18-29

subtle wing
frosty dock
subtle wing
#

this is the error i get instead

frosty dock
#

what's on line 66

subtle wing
#

just a }

frosty dock
#

I need some context, don't you think

#

a few surrounding lines

#

Also you should really install a lua extension

subtle wing
#

okay there we go

frosty dock
subtle wing
#

okay now that the lua extension kicked off it's saying there's 17 problems in the file

#

but i think most of them are just complaining about things like "SMODS" and "localize"

frosty dock
#

you should get red where something is actually wrong

subtle wing
frosty dock
#

-Diamond

subtle wing
#

i thought just mimicking green joker would've made it plug and play

subtle wing
subtle wing
#
            "{C:mult}+#1#{} Mult per {C:diamonds}Diamond{} suit scored",
            "{C:mult}-#2#{} Mult per any other suit scored",
            "{C:inactive}(Currently {C:mult}+#3#{C:inactive} Mult)",
        }```
frosty dock
subtle wing
#

There we go
Now I just need to get it to point to the actual graphic

#

... ignore the + i already know why that's there

hasty kelp
#

what should i fix on my mild salsa card so heart cards gain +1 mult when scored and increase each time its played something is causing the heart cards to not get it and just says error instead of the +1 mult when trigger

    key = 'mildsalsa',
    loc_txt = {
        name = 'Mild Salsa',
        text = {
            'Every played {C:hearts}#2#{} cards',
            'permanently gains',
            '{C:mult}+#1#{} Mult when scored',
        },
    },
    atlas = 'Jokers',
    rarity = 2,
    cost = 5,
    unlocked = true, 
    discovered = true, 
    blueprint_compat = true, 
    perishable_compat = false, 
    pos = {x = 0, y = 0},
    config = {extra = {mult = 1, suit = 'Hearts'}},
    loc_vars = function(self, info_queue, card)
        return {vars = {card.ability.extra.mult, localize(card.ability.extra.suit, 'suits_singular')}}
    end,
    calculate = function(self, card, context)
        if context.individual and context .cardarea == G.play
            and context.other_card:is_suit(card.ability.extra.suit) then 
            context.other_card.perma_mult = (context.other_card.ability.perma_mult or 0) +
                card.ability.extra.mult
            return {
                message = localize('k_upgraded_ex'),
                colour = G.C.RED
            }
        end
    end,
}```
tranquil cypress
subtle wing
daring fern
hasty kelp
fading rivet
#

is there a possibility for patches to work on one device but not another

#

one of them uses bmm the other doesn't

primal robin
#

most cases like this was fixed

fading rivet
#

im gonna a switch it to the new custom ui in loc vars later, but im confused as to why its breaking

subtle wing
subtle wing
#

Can anyone tell me what the failure point is on this?

    loc_vars = function(self, info_queue, card)
        return { vars = { card.ability.extra.true_add, localize(card.ability.extra.suit, 'suits_singular'), card.ability.extra.false_sub, card.ability.extra.mult } }
    end,
    calculate = function(self, card, context)
        if context.individual and context.cardarea == G.play then
            local passed = context.other_card:is_suit(card.ability.extra.suit)
            for k, v in pairs(SMODS.Suits) do
                if context.other_card:is_suit(v.key) and v ~= card.ability.extra.suit then
                    passed = false
                end
            end
            if card.ability.extra.mult >= card.ability.extra.false_sub and not passed then
                SMODS.scale_card(card, {
                    ref_table = card.ability.extra,
                    ref_value = 'mult',
                    scalar_value = 'false_sub',
                    operation = '-',
                    no_message = true
                })
                return {message = localize({type = 'variable', key = 'a_mult_minus', vars = {card.ability.extra.false_sub}}), colour = G.C.RED, message_card = card}
            elseif passed then
                SMODS.scale_card(card, {
                    ref_table = card.ability.extra,
                    ref_value = 'mult',
                    scalar_value = 'true_add',
                    no_message = true
                })
                return {message = localize({type = 'variable', key = 'a_mult', vars = {card.ability.extra.true_add}}), message_card = card}
            end
        end
        if context.joker_main then
            return {mult = card.ability.extra.mult}
        end
    end
}```
daring fern
subtle wing
#

Thank you!

granite apex
#

Would it be possible to change two ranks to act as both ranks at once via hooks, in a similar manner to pareidolia, which makes ranks simultaneously count as faces? So like, I have an ace and a 8, both ranks can trigger both scholar and 8 ball

#

I've been trying to put it in code but its kind of wack, cause even with a hook, you kinda gotta send a final rank to finish the checks

#

Could prolly do a lovely patch huh

#

Gotta look into that

frosty dock
granite apex
#

Oh dang

#

Guess I'll wait a bit then lol

daring fern
slate turtle
#

i believe it may be using calculate wrong

frosty dock
slate turtle
#

i dunno

#

i'm still figuring it out 💔

#

but thanks for informing me

#

now theres something else going on

#

line 82 is lua if not card:is_face(true) and SMODS.pseudorandom_probability(self, "wheeloffortune_sailboat_blind",self.config.numer, self.config.denum) then

frosty dock
slate turtle
#
    calculate = function (self, blind, context)
        if context.hand_drawn and not blind.disabled then
            for i, card in ipairs(context.hand_drawn) do
                if not card:is_face(true) and SMODS.pseudorandom_probability(self, "wheeloffortune_sailboat_blind",self.config.numer, self.config.denum) then
                    context.card:set_debuff(true)
                end
            end
        end
    end
}```
frosty dock
#

context.card:set_debuff(true)

frosty dock
#

you did it right in the line above that. make mistakes but be consistent. if you're using different stuff next to each other, some part of it will always be wrong

pastel kernel
#

how do you check if ante is -8?

slim ferry
#

G.GAME.round_resets.ante == -8

frosty dock
#

if {[-8] = true}[G.GAME.round_resets.ante] then end

pastel kernel
#

trying to do this one thing i'm working on rn

#

spawn condition for thomas

#

requirements: Ante is -8, boss is cerulean bell, sell cryptid during boss blind

#

when selling cryptid, the blind size would increase by x100M

#

and then you have to beat the bell.

#

i already got the take_ownership thing

slim ferry
#

fyi

#

showdown blinds dont appear in negative antes

pastel kernel
#

how about the club then

slim ferry
#

you probably want to change the ante>0 check to an ante~=0 check with a patch

#

oh that also works

pastel kernel
#

yea i'm switching to the club

slate turtle
fading rivet
pastel kernel
#
--Spawn Condition for Thomas
SMODS.Blind:take_ownership('bl_club', {
    set_blind = function (self)
        if {[-8] = true}[G.GAME.round_resets.ante] then
        G.GAME.blind.effect.ante = true
        print("club")
        else
        G.GAME.blind.effect.ante = false
        print("noclub")
        end
    end,
    calculate = function (self, blind, context)
    if context.selling_card and context.card.config.center.key == "c_cryptid" then
        G.GAME.blind.effect.soldcryptid = true
        print("ready")
    end
end,
    defeat = function (self)
    if G.GAME.blind.effect.ante and G.GAME.blind.effect.soldcryptid and not next(SMODS.find_card('j_busterb_thomas')) then
        SMODS.add_card{ key = "j_busterb_thomas", edition = 'e_negative', stickers = {'eternal'}, force_stickers = true }
        print("superwinner")
    end
end
})
#

man

pastel kernel
shell timber
#

what on earth is this

#
if {[-8] = true}[G.GAME.round_resets.ante] then
fading rivet
shell timber
#

no its valid

fading rivet
#

why does it crash everytime i do it smh

#

every copy of lua is personalized

wanton jolt
ashen drift
#

why not G.GAME.round_resets.ante == -8?

pastel kernel
fading rivet
#

I always had do to ({})[]

shell timber
#

that. was surely a joke right

fading rivet
wanton jolt
pastel kernel
#

hold on

ashen drift
#

🤷

keen atlas
#

because it does nothing

fading rivet
#

mine*

keen atlas
#

actually

ashen drift
#

i remember specifically you cant do {}[]

keen atlas
#

yeah its invali

ashen drift
#

aure was being a practical joker

#

just use G.GAME.round_resets.ante == -8

fading rivet
#

({[print]=function()return {[math]=print} end})[print]()[math]("hi")

wanton jolt
#

works on my machine

fading rivet
wanton jolt
#

yeah

ashen drift
#

you need parentheses

wanton jolt
#

thats why it did

ashen drift
#

god this is so cursed

fading rivet
ashen drift
#

no reason it wouldnt

fading rivet
#

your never indexing the array though?

mystic river
#
local table = {}
table[table] = table
ashen drift
wanton jolt
#

i saw minty type i was preparing for metatables

fading rivet
ashen drift
#

or hmm

#

im dumb

wanton jolt
#

oh wait i got the cats confused

ashen drift
#

no yeah im just slow lol

#

it shouldnt work

wanton jolt
#

its lily that's metatable obsessed

pastel kernel
#

man fuck this

ashen drift
#

im gonna say it works though to spread misinformation

mystic river
#

yeah I'm the cat that likes silly recursion

slate turtle
#

i genuinely feel like this rn

keen atlas
#

are you using vscode

ashen drift
#

do you have a lsp

slate turtle
#

yep

wanton jolt
ashen drift
#

to which question

slate turtle
#

both

slate turtle
wanton jolt
#

how do you have a lua lsp and still have syntax errors

ashen drift
#

the lsp should tell you when theres a syntax error

mystic river
wanton jolt
#

or the shit not updating in my case

#

when i make a new file

ashen drift
#

1000 mod files

pastel kernel
#

fuck you mean this shit ain't work

    set_blind = function (self)
        if G.GAME.round_resets.ante == -8 then
        G.GAME.blind.effect.ante = true
        print("club")
        else
        G.GAME.blind.effect.ante = false
        print("noclub")
        end
    end,```
wanton jolt
pastel kernel
#

the ante is -8

#

is, not less than or more than

keen atlas
#

nothing is print?

mystic river
#

does it print the wrong thing, or does it not print a thing at all?

pastel kernel
#

no prints

#

it don't print

keen atlas
#

did you load the file?

fading rivet
pastel kernel
#

yes

mystic river
#

then that function isn't running

slim ferry
#

are you taking ownership correctly

mystic river
#

when are you expecting that function to run?

fading rivet
#

are you sure the club is the boss blind

pastel kernel
#
SMODS.Blind:take_ownership('bl_club', {
    set_blind = function (self)
        if G.GAME.round_resets.ante == -8 then
        G.GAME.blind.effect.antething = true
        print("club")
        else
        G.GAME.blind.effect.antething = false
        print("noclub")
        end
    end,
    calculate = function (self, blind, context)
    if context.selling_card and context.card.config.center.key == "c_cryptid" then
        G.GAME.blind.effect.soldcryptid = true
        print("ready")
    end
end,
    defeat = function (self)
    if G.GAME.blind.effect.ante and G.GAME.blind.effect.soldcryptid and not next(SMODS.find_card('j_busterb_thomas')) then
        SMODS.add_card{ key = "j_busterb_thomas", edition = 'e_negative', stickers = {'eternal'}, force_stickers = true }
        print("superwinner")
    end
end
})
keen atlas
#

SMODS.Blind:take_ownership('club'?

slim ferry
#

shouldnt have the class prefix

#

ye

pastel kernel
#

-# ignore the table operator, it's the deck effect

#

no prints

keen atlas
#
print("a thing")
SMODS.Blind:take_ownership('club', ...
wanton jolt
#

is this in a separate file and is that file asserted or something

slate turtle
#

hey

#

this time i have something thats NOT A SYNTAX ERROR (or atleast, i believe)

#

but for some reason you cant use it, no matter how much cards you select

wanton jolt
#

why do you use to_big

#
can_use = function(self, card)
        if not (G.hand and #G.hand.highlighted > 0 and #G.hand.highlighted <= card.ability.max_highlighted) then
            return false
        end

        for i = 1, #G.hand.highlighted do
            return true
        end
        
        return false
    end
true jasper
subtle wing
#

yeah i'm kinda stumped on how to go about the rest of the function
especially the randomization element

gilded blaze
subtle wing
#

I didn't mean to imply any of the other code actually worked

#

i've just been making ransom notes out of other jokers and hoping for the best

idle plaza
#

context.pre_discard will work instead.

gilded blaze
#

anyway

calculate = function(self, card, context)
    if context.pre_discard and G.GAME.current_round.discards_left <= 0 not context.hook then
        local selected = pseudorandom_element(G.hand.highlighted, pseudoseed("katyas_haunt"))
        selected:set_edition("e_negative", true)
        return nil, true -- allows joker retriggers if you wish
    end
end
subtle wing
#

thank you

faint yacht
#

and not context.hook, oop.

subtle wing
idle plaza
#

It can be whatever you want. The point of it is just to be distinct.

subtle wing
#

Had to bump up the discard check to 1 rather than 0 but it works otherwise

stiff locust
#

has wrapping straights been coded yet id rather not reinvent the wheel on it

#

surely someone's done it

gilded blaze
#

hook SMODS.wrap_around_straight

#

it returns false by default since no vanilla joker does it

stiff locust
#

oh cool so if that returns true straight wrapping is enabled?

gilded blaze
#

yep

stiff locust
#

that is rather easy

#

th

#

anks

#

wtf who cut my message

slate turtle
subtle wing
wanton jolt
slate turtle
#

no

subtle wing
#

How do I add custom localize lines
like "Steel!" or "Negative!"

slate turtle
#

GRAAAHHH WHY DOES IT NOT FUCKING WORK

rapid stag
#

...why do you have the entire consumable definition again in an event in the use function?

slate turtle
#

OH

#

wrong copy paste

#

mb

#

40 lines are missing

                }))
            end
            for i = 1, #G.hand.highlighted do
                local percent = 0.85 + (i - 0.999) / (#G.hand.highlighted - 0.998) * 0.3
                G.E_MANAGER:add_event(Event({
                    trigger = 'after',
                    delay = 0.15,
                    func = function()
                        G.hand.highlighted[i]:flip()
                        play_sound('tarot2', percent, 0.6)
                        G.hand.highlighted[i]:juice_up(0.3, 0.3)
                        return true
                    end
                }))
            end
            G.E_MANAGER:add_event(Event({
                trigger = 'after',
                delay = 0.2,
                func = function()
                    G.hand:unhighlight_all()
                    return true
                end
            }))
            delay(0.5)
        end
    can_use = function(self, card)
        if not (G.hand and #G.hand.highlighted > 0 and #G.hand.highlighted <= card.ability.max_highlighted) then
            return false
        end

        for i = 1, #G.hand.highlighted do
            return true
        end
        
        return false
    end

end
end
}```
idle plaza
#

For reference, this is how your file looks with corrected indenting and nothing else changed.

slate turtle
#

fixed the indenting i think

idle plaza
slate turtle
#

this better?

frosty dock
#

note that the indenting itself isn't the issue

idle plaza
idle plaza
frosty dock
#

true

slate turtle
silk latch
frosty dock
#

not sure at a glance but why are we creating cards manually

silk latch
#

That's just how the code was from the vanillaremade arcana pack iirc

idle plaza
silk latch
slate turtle
frosty dock
slate turtle
#

i know

#

"why" was just a comment

frosty dock
#

oh right

#

i had nothing more helpful to say due to how much context was given

slate turtle
#

fixed it methinks

#

in case you wonder how it happened

#
  • i used the consumable
idle plaza
#

What does your code look like now?

slate turtle
#
  • the cards flipped face-down
  • one card flipped face-up
  • cards flipped
  • crash
idle plaza
# slate turtle - the cards flipped face-down - one card flipped face-up - cards flipped - crash

You have one for i = 1, #G.hand.highlighted do that's inside another for i = 1, #G.hand.highlighted do. This causes issues because they're both trying to track their progress using the i variable, making them conflict with each other.

To fix this, use any other letter for the for i = 1, #G.hand.highlighted do on line 56.

Also you can probably remove some of your events in general. Your file calls G.hand.highlighted[i]:flip() on 4 separate occasions, that probably isn't necessary.

slate turtle
idle plaza
#

What's the error?

slate turtle
#

brb

silk latch
wary moth
#

Is there a history of certain actions in the game?
Like, used consumeable cards?
I feel like that'd be a great inclusion to SMODS if there isn't, because that would make effects like "last spectral card used" or "+mult for each The Fool you've used this run" or any other thing targeting custom cards a lot easier to do without having to hook anything yourself

frosty rampart
#

you don't have to hook anything yourself
just use the mod calculate and context.using_consumeable to track it

subtle wing
#

man i really thought i was gonna be able to do this one myself

idle plaza
#

What's your code?

subtle wing
idle plaza
# subtle wing

You want context.discard instead as that's an individual card context, instead of context.pre_discard which is only checked once. It also doesn't use context.hook at all so you can remove that check.

subtle wing
#

well it fixed that issue
but it's giving them chips instead of dollars and the "upgrade" popup is appearing on the joker instead of the card

idle plaza
#

That's because perma_bonus is only for chips. Replace that with perma_p_dollars to make the bonus dollars instead.

In your return table, add the line message_card = context.other_card so the individual card gets the message instead.

subtle wing
idle plaza
subtle wing
#

thanks

final jewel
#

Ok so I have this credit card modification and I was wondering how could I update G.GAME.bankrupt_at value update when card.ability.taw_data.bankrupt change ?

silk latch
#

Where do I put the dictionary section in my localization files? Because when I left it out of the descriptions = {}, it didn't actually load them or anything, and when I put it in there, it showed this error and then my entire PC hit me with the wii crash sound

subtle wing
#

is this effect possible yet
if not i can just comment out this joker for now

tidal hemlock
subtle wing
#

no the point is that when you draw them again, they come to the hand face down

tidal hemlock
#

oh
that's a little complicated but still possible

silk latch
slim ferry
#

dictionary should be inside of misc

#

which is outside of descriptions

#

this crash seems unrelated though unless im mistaken

silk latch
#

i mean it was literally mid-launch when it happened lol

subtle wing
silk latch
#
SMODS.Consumable {
    key = 'precision',
    set = 'Mannpower',
    atlas = 'mannpowercards',
    pos = {
        x = 2,
        y = 1
    },
    select_card = 'consumeables',
    config = { extra = { money = 5, money_gain = 3 } },
    loc_vars = function(self, info_queue, card)
        -- supposed to increase the money one time when a hand scores more than the blind requirements, but currently increases it each time you hover over it, as long as the last hand was a oneshot.
        if SMODS.last_hand_oneshot then
            card.ability.extra.money = card.ability.extra.money + card.ability.extra.money_gain
        end
        return { vars = { card.ability.extra.money, card.ability.extra.money_gain } }
    end,
    use = function(self, card, area, copier)
        G.E_MANAGER:add_event(Event({
            trigger = 'after',
            delay = 0.4,
            func = function()
                play_sound('timpani')
                card:juice_up(0.3, 0.5)
                ease_dollars(card.ability.extra.money, true)
                return true
            end
        }))
        delay(0.6)
    end,
    can_use = function(self, card)
        return true
    end
}

Also there's this thing I'm having trouble with

tidal hemlock
long sun
#

how do i get the total number of Chips a card will give when scored?

#

[including base and bonus chips but not Joker triggers]

faint yacht
#

card:get_chip_bonus()

long sun
#

thanks ^^

rigid solar
daring fern
rigid solar
#

oh woops

#

ah but it doesn't take the edition into account

#

so no foil

faint yacht
#

That only considers base Chips, including perma-bonuses.

wintry solar
#
function get_chips_from_edition(card)
    if not card.edition then return 0 end
    local ret = card:calculate_edition({main_scoring = true, cardarea = G.play})
    if not ret then return 0 end
    if ret.chips then return ret.chips end
    if ret.chip_mod then return ret.chip_mod end
    return 0
end

something like this gets most edition chips

rigid solar
#

that has the issue of calculating the edition tho, if an edition has some event in it (or literally anything that's not supposed to happen outside of its intended calculation) that can cause problems

#

there's no perfect way to do it regardless

subtle wing
#

I'm not sure what I'm misunderstanding

faint yacht
#

context.remove_playing_cards is called whenever playing cards are destroyed.

rigid solar
#

i don't think you can do this effect with a simple calculate function?

#

or at least not with a new context

faint yacht
#

At least, not for just scoring cards with one context.

#

Assuming the "face down" will also imply drawing said cards to remain face down.

#
if context.stay_flipped and context.other_card then
  -- Are we drawing from played area?
  if context.from_area == G.play then
    -- Mark the card.
    context.other_card.patti = true
    return { modify = { to_area = G.deck } }
  -- Are we drawing from the deck? Check if we got the mark.
  elseif context.from_area == G.deck and context.other_card.patti then
    -- If so, remove the mark and ask to remain flipped.
    context.other_card.patti = nil
    return { stay_flipped = true }
  end
end

Something like so?

frosty rampart
#

i'd probably put the marker in card.ability, but yea that looks right

subtle wing
#

The point of it is meant to be more evident in very thin decks

pale rampart
#

is it possible to flip and shuffle cards of the hand you played like amber acorn does with jokers?

faint yacht
#

return { stay_flipped = true } maintains the face down, however, if anything does return { prevent_stay_flipped = true }, that takes priority.

subtle wing
#

I see

#

... Maybe I could also make this joker treat face-down cards as steel? So it's not like, bad to leave them face down

final jewel
#

sticker compat are true by default, right ?

mossy wharf
#

Does anyone know a mod that lets you chose the next jokers to appear on the shop

slate turtle
#

GRAAAHH WHY ARE MY MODS BLIND ANIMS NOT PLAYING

subtle wing
#

Actually what is the context for identifying if a card is flipped

daring fern
subtle wing
rapid stag
#

can we see the line girldmLurk

subtle wing
rigid solar
#

wdym extra is a nil value, tf is this crash

median veldt
#

how do i add a custom tooltip to info_queue from the localization files without adding something to p_centers

daring fern
daring fern
subtle wing
median veldt
rigid solar
#

you don't need this custom set

#

just put your thing in Other

median veldt
#

ohfair

rigid solar
#

then you can do info_queue[#info_queue + 1] = {set = 'Other', key = "food_joker"}

#

or table.insert whichever you prefer, doesnt matter

rigid solar
#

???

median veldt
#

yeah idek

#

happened when I hovered over it

#

hold on lemme do it again do u want the stacktrace

#

actually i can also looka t the staackrace

rigid solar
#

just show the code for now

median veldt
rigid solar
#

replace the second one by info_queue[#info_queue + 1] = G.P_CENTERS.c_bex_transcend

median veldt
#

ohrigght

#

cool it works thanks

pastel kernel
#

how do you increase a blind's score requirement using the blind itself?

daring fern
pastel kernel
daring fern
pastel kernel
unreal cosmos
#

whats the best way to go about learning lua? i used to know a bit of C# but ive forgotten it

#

?

knotty solstice
#
    apply = function (self,tag,context)
        local result = nil
        if context.type == "new_blind_choice" then
            local lock = tag.ID
            result = SMODS.pseudorandom_probability(self,"t_void_Bloody Tag",1,tag.config.chance)
            if result then
            G.CONTROLLER.locks[lock] = true
            local key = "p_void_Bloody Pack"
            tag:yep("+", G.C.SECONDARY_SET.Spectral,function()
            local card = Card(
                G.play.T.x + G.play.T.w / 2 - G.CARD_W * 1.27 / 2,
                G.play.T.y + G.play.T.h / 2 - G.CARD_H * 1.27 / 2,
                G.CARD_W * 1.27,
                G.CARD_H * 1.27,
                G.P_CARDS.empty,
                G.P_CENTERS[key],
                { bypass_discovery_center = true, bypass_discovery_ui = true }
            )
            card.cost = 0
            card.from_tag = true
            G.FUNCS.use_card({ config = { ref_table = card } })
            card:start_materialize()
            G.CONTROLLER.locks[lock] = nil
            return true
        end)
        tag.triggered = true
    else
        tag:yep("Failed",G.C.RED,function ()
            tag.triggered=true
            return true
            end)
        end
    end
    end,

why does this open multiple booster packs at once instead of waiting for the booster pack to be finished

rapid stag
#

what is this indenting cirSlain

true jasper
unreal cosmos
pastel kernel
#

attempting to make a spawn condition where if you have 100 gold seal/golden cards, a joker spawns```lua
SMODS.current_mod.calculate = function (self, context)
local hundred = 0
for k, v in pairs(G.deck) do
if SMODS.has_enhancement(context.other_card, 'm_gold') or
context.other_card:get_seal() == 'Gold' then
hundred = hundred + 1
end
end
if hundred == 100 then
SMODS.add_card{ key = "j_busterb_samson", edition = 'e_negative', stickers = {'eternal'}, force_stickers = true }
print("winner")
end
end

normal crest
#

replace context.other_card with v

daring fern
pastel kernel
#

currently```lua
SMODS.current_mod.calculate = function (self, context)
local hundred = 0
for k, v in pairs(G.deck.cards) do
if SMODS.has_enhancement(v, 'm_gold') or
v:get_seal() == 'Gold' then
hundred = hundred + 1
end
end
if hundred == 100 and not next(SMODS.find_card("j_busterb_samson")) then
SMODS.add_card{ key = "j_busterb_samson", edition = 'e_negative', stickers = {'eternal'}, force_stickers = true }
print("winner")
end
end

#

idk where to go with this.

normal crest
#

That should at the very least spawn it if you have the 100, but it's only gonna trigger when calculate is called

#

also you should pick a context for when this should happen like somethingcom said

#

And it's only ever gonna trigger if you have exactly 100

rapid stag
#

additionally, do you... want it to keep spawning them? or not spawn if you already have one

#

because it can just end up spamming them depending on how you set up your condition

#

oh wait nvm, you have a not next(SMODS.find_card()) cirDerp

#

i expected it to wrap the whole process as there's kinda no point iterating through the entire deck over and over if you're not going to enter the condition regardless

pastel kernel
#
-- Spawn Condition for Samson
SMODS.current_mod.calculate = function (self, context)
    local hundred = 0
    for k, v in pairs(G.deck.cards) do
        if SMODS.has_enhancement(v, 'm_gold') or
                    v:get_seal() == 'Gold' then
            hundred = hundred + 1
        end
    end
    if context.setting_blind and hundred >= 100 and not next(SMODS.find_card("j_busterb_samson")) then
        SMODS.add_card{ key = "j_busterb_samson", edition = 'e_negative', stickers = {'eternal'}, force_stickers = true }
        print("winner")
    end
end
#

idk

#

I don't know if it's storing local values that makes this a problem

rapid stag
#

no, you can 100% store local values in current_mod.calculate

faint yacht
#

You should probably do the check under the context.setting_blind check.

rapid stag
#

i think if there's any problem, it's going to be performance, because... do you know how many times calculate is called? and for how many contexts? and each time, you're going to be iterating through the deck.

#

whenever you hit play, it's gonna do press_play, before, individual, initial_scoring_step, joker_main, final_scoring_step, after and that's only the ones i can think of off the top of my head

#

now imagine doing like 10 iterations of a deck that's gonna be at least 50 cards, that's then not going to do anything because even if you meet the condition for hundred, the context check won't be met

pastel kernel
#

Well

#

I don’t know how I’m supposed to do it

#

I thought what I did was good

rapid stag
# pastel kernel I don’t know how I’m supposed to do it

it is, it's just

-- Spawn Condition for Samson
SMODS.current_mod.calculate = function (self, context)
  if context.setting_blind and not next(SMODS.find_card("j_busterb_samson")) then
    local hundred = 0
    for k, v in pairs(G.deck.cards) do
        if SMODS.has_enhancement(v, 'm_gold') or
                    v:get_seal() == 'Gold' then
            hundred = hundred + 1
        end
    end
    if hundred >= 100 then
        SMODS.add_card{ key = "j_busterb_samson", edition = 'e_negative', stickers = {'eternal'}, force_stickers = true }
        print("winner")
    end
  end
end
pastel kernel
#

ah

#

i see

rapid stag
pastel kernel
#

because it checks during setting blind

#

instead of continuously

rapid stag
#

yes yes

pastel kernel
#

looks like i'll have to check for prints again

#

no prints

pastel kernel
#

fuck...

#

@shrewd cobalt dawg it doesn't work man

#

-# yea i decided to keep you because you have been one of the most respectable people i've ever met

daring fern
versed swan
#

Given

SMODS.add_card {
  set = "Base",
  enhancement = "m_stone",
  area = etc.
}

Will the card have a random suit/rank?

pastel kernel
#

i think so

near coral
#

If a card has an enhancement is it possible to make adjacent cards not able to be debuffed

#

Trying to see if this will make the enhancement desirable

daring fern
frosty dock
#

this also requires recalculating debuffs on rearrange if you want it to be visually accurate

near coral
#

When moving the card around will it remove the debuff from the cards adjacent to the new postion and reinstate the debuffs from ones they were adjacent to previously

near coral
#

Also will recalculating debuffs on rearrangement be taxing on the game

#

Actually wait it could just be recalculated only when the redacted card changes positions

frosty dock
#

it's probably fine unless you're actually doing it every frame

near coral
#

Ooohhh pceee€€€€€€€eeeeeee€€€€

near coral
#

Is it possible for an enhancement to not have the base card included in its look

#

Do I just not include the enhancement on top of a base card in the atlas

frosty dock
near coral
#

So I don't include it on top of a blank card in the atlas

daring fern
near coral
#

I want the enhancement to look as if it fully replaced the base card

#

Let me show an example

#

Ignore my selection at the top-left

daring fern
gilded blaze
#

it already does

rapid stag
wild patrol
#

debating with an idea here of a tarot card

#

for the twitch mod

#

it's originally was gonna be 50/50 crash the game or get all legendary jokers

#

but thought about making it more skewed to crashing

#

50/50 with 1 oops makes it always give legenaries but I think that could be good balanced againts commands that destroy your jokers

#

but can't decide which seems like a better option

shrewd cobalt
#

If it just crashes the game could you just re open the game and use it again until you get all the legendaries?

wild patrol
#

once a seed is created doesn't it always crash once the tarot is created?

#

I don't think u can change the odds after it's created

#

unless u get oops

median veldt
#

is it possible to make a joker that turns all boss blinds (not counting final bosses maybe) into one specific one

rapid stag
#

...is it possible to do a fakeout death screen?

#

mgs2 fission mailed style

median veldt
gilded blaze
slim ferry
#

I dont think thats true

#

Well it does save when its used

#

But reloading doesnt have it already used up iirc

wild patrol
wild patrol
median veldt
#

noted

wild patrol
#
    G.GAME.perscribed_bosses = G.GAME.perscribed_bosses or {
    }
    if G.GAME.perscribed_bosses and G.GAME.perscribed_bosses[G.GAME.round_resets.ante] then 
        local ret_boss = G.GAME.perscribed_bosses[G.GAME.round_resets.ante] 
        G.GAME.perscribed_bosses[G.GAME.round_resets.ante] = nil
        G.GAME.bosses_used[ret_boss] = G.GAME.bosses_used[ret_boss] + 1
        return ret_boss
    end
    if G.FORCE_BOSS then return G.FORCE_BOSS end```
#

this is porbably the functions ur wanting

#

jsut need to modify it

slim ferry
#

Unless the showdown check would succeed

crystal perch
#

anyone know how to make the player discard their entire hand?

median veldt
#

you have to cycle through and select every card and use the discard function

fading rivet
median veldt
#

sniff

#

what

#

someone else told me that was bad practice

#

okay maybe i misremembered as well

#

I dont knw

crystal perch
#

it might be bad practice 😭

#

i did not add any cards lol

slim ferry
#

Oh nvm that is pretty bad

slim ferry
slim ferry
#

And then just select and discard the cards like the hook does

median veldt
#

this is what i did

G.E_MANAGER:add_event(Event({
    func = function()
        local old_limit = G.hand.config.highlighted_limit
        G.hand.config.highlighted_limit= 9999
        local any_selected = nil
        for _, card in ipairs(G.hand.cards) do
            G.hand:add_to_highlighted(card, true)
            any_selected = true
            play_sound('card1', 1)
        end
        if any_selected then G.FUNCS.discard_cards_from_highlighted(nil, true) end
        G.hand.config.highlighted_limit= old_limit
        -- G.E_MANAGER:add_event(Event({
        --     -- no_delete = true,
        --     -- trigger = 'after',
        --     -- blocking = false,blockable = false,
        --     -- delay = 2.5,
        --     -- timer = 'TOTAL',
        --     func = function()
        --         G.CONTROLLER.locks.skip_blind = nil
        --         return true
        --     end
        -- }))
        return true
    end
}))
crystal perch
#

yoink

median veldt
#

ignore the commented shit that was a futile attempt at something that i didnt end up fixing

slim ferry
#

Yk you can make multi-line comments by using --[[ ]] right

#

That comments everything in the brackets

median veldt
#

no!

#

i did not know that!

gilded blaze
#
[[this is a string btw, it accepts literal newline characters as opposed to \n]]
median veldt
#

(also cuz i just highlight everything and hit ctrl+/)

crystal perch
median veldt
crystal perch
#

the situation is i have a joker that causes you to discard your whole hand on discard which ends up causing this to happen

median veldt
#

Oh

crystal perch
#

this is the calc func

calculate = function(self, card, context)
        if context.discard then
            G.E_MANAGER:add_event(Event({
                func = function()
                    local old_limit = G.hand.config.highlighted_limit
                    G.hand.config.highlighted_limit= 9999
                    local any_selected = nil
                    for _, card in ipairs(G.hand.cards) do
                        G.hand:add_to_highlighted(card, true)
                        any_selected = true
                        play_sound('card1', 1)
                    end
                    if any_selected then G.FUNCS.discard_cards_from_highlighted(nil, true) end
                    G.hand.config.highlighted_limit= old_limit
                    return true
                end
            }))
        end
    end
median veldt
#

sniff

#
if #G.hand.cards == 0 then
    SMODS.draw_cards(G.hand.config.card_limit)
end
#

idk

crystal perch
#

no you draw the cards back after a bit i think it just spams the event queue because each card discarded retriggers the discard hand event

median veldt
#

oh

#

yeah thats tru

#

my code isnt from a joker

crystal perch
#

ill try adding a helper var

pastel kernel
#

how do you destroy the whole deck minus the aces

#

this is what i have currently```lua
if context.using_consumeable and context.consumeable.config.center.key == "c_judgement" then
for k, v in ipairs(G.deck.cards) do
local card_id = v:get_id()
if card_id ~= 14 then

            end
    end```
median veldt
#

wait what the fuck

#

what is this. supposed to do

#

is it like a joker

when you use judgment, destroy all cards that aren't aces?

pastel kernel
#

if you use a judgement, it destroys all cards except for aces

median veldt
#

huh. alright

pastel kernel
#

it's a special interaction thing

median veldt
#

i tihink

median veldt
#
local get_new_boss_ref = get_new_boss
function get_new_boss()
    return next(SMODS.find_card("j_bex_j_pareidolia_ex")) and not G.GAME.blind.config.blind.boss.showdown and "bl_serpent" or get_new_boss_ref()
end
gilded blaze
median veldt
#

that is

#

a very good point

crystal perch
#

just put all the non-aces into an array and feed that in

median veldt
#

something something add cards to an arra- yeah

slim ferry
gilded blaze
#

put all cards to be destroyed in a local table, then call it with said table as the argument instead

slim ferry
#

You need to copy the check for a showdown blind from the original function

crystal perch
#
config = {
        helper = {
            discarded = false
        },
    },
    calculate = function(self, card, context)
        if context.discard and not card.ability.helper.discarded then
            card.ability.helper.discarded = true
            G.E_MANAGER:add_event(Event({
                func = function()
                    local old_limit = G.hand.config.highlighted_limit
                    G.hand.config.highlighted_limit= 9999
                    local any_selected = nil
                    for _, card in ipairs(G.hand.cards) do
                        G.hand:add_to_highlighted(card, true)
                        any_selected = true
                    end
                    if any_selected then G.FUNCS.discard_cards_from_highlighted(nil, true) end
                    G.hand.config.highlighted_limit= old_limit
                    return true
                end
            }))
        end
        if context.hand_drawn then
            card.ability.helper.discarded = false
        end
    end
#

i think just resetting highlighted cards should fix

median veldt
#

wait i should just: try

crystal perch
median veldt
#

yeah it works

pastel kernel
#

how do you directly manipulate the ante?

#

like how instead of using ease_dollars to change the money, you use G.GAME.dollars to do that.

faint yacht
#

ease_ante modifies G.GAME.round_resets.ante G.GAME.round_resets.ante_disp, see the function in the dump for more info.

median veldt
#
function SMODS.current_mod.calculate(self, context)
    if context.joker_type_destroyed then
        if context.card.config.center.bex_exfood and #G.consumeables.cards < G.consumeables.config.card_limit then
            SMODS.add_card { 'c_bex_transcend' }
        end
    end
end

kay what the hell is happening

frosty rampart
#

SMODS.add_card { key = "c_bex_transcend" }

median veldt
#

oh im stupid

#

thanks

dapper sun
viscid talon
#

how do i make a shader apply to a card rarity again?

#

(i forgot)

dapper sun
#

drawstep

viscid talon
#

whats that

dapper sun
viscid talon
#

hmm

dapper sun
viscid talon
#

o nice thankies

#

i found this old code

dapper sun
#

that works for an edition

#

but not a rarity

viscid talon
#

oh hm

dapper sun
#

that's what the drawstep will do

viscid talon
#

i see i see

#

this is what i have for rarity so far

#

this is slightly outdated code i think

dapper sun
#

make a drawstep that checks if the card has the given rarity and then draw the edition shader stuff

viscid talon
#

oh wait hold on

#

i think im going about this all wrong

#

so the idea is that evolved is just a regular ass rarity

#

and that every single divine joker is supposed to spawn with the "divine" edition

#

so all i need to do is find a way to like, have each divine joker appear in the divine edition

#

that should only be a few lines of code perhaps

#

i redid all of the divine joker code a while back with some help, so that's probably why its missing rn

#

i just apply context.card:set_edition("e_hatch_divine", true) i think

#

or just card

#

lemme test that out

#

sort of works - it accidentally set the divine shader to the consumable instead

#

that should be fixed with the local evolution varaible i made

#

yep it works LOL

#

man i am a genius

sleek valley
#

im looking for help from anyone available right now
if anyone's open, i'd appeciate if someone could make shaders for 6 editions i want to add (because frankly im too terrified of F# to try it myself)
please dm me and i can give you any extra info you need
(found someone now, yall can ignore this (thank you Meta :3) )

long sun
#

i'm trying to debuff all face cards in the deck / added to the deck while you own this Joker, but selling it didn't remove the debuffs. why not?

daring fern
long sun
#

ahh i see

#

thanks ^u^

near coral
#

The suit under the 2s aren't supposed to be visible, how can this be fixed

#

I want the bars to cover the 2s like how the jumbled suits cover them in wild cards

near coral
#

Oh

unreal cosmos
#

im copying this after a tutorial btw

#

i dont use juice up either

daring fern
unreal cosmos
#

also i copy and pasted the code from the tutorial, and it hs it with smods calculate before scale card (and it works fine)

#

oh i forgot to do message_colour

#

i did just put message

daring fern
near coral
#

This stake is supposed to have the aged sticker show up on cards but it isn't despite aged being enabled

daring fern
versed swan
#

What is Card:get_nominal supposed to be for?

frosty rampart
#

gets the number of chips that the card's base rank gives

#

(i.e. ignores bonus enhancement and any permabonus chips)

versed swan
#

i see

daring fern
#

The base chips would be card.base.nominal

versed swan
#

ah

near coral
#

How does updating the smods in your mod work

#

Like

#

Does the coder need to have an updated smods to implement the new stuff

#

Is everything technically up to date if there's nothing modern smods releases don't conflict with

near coral
#

Alright

#

Is it that if the one coding has the updated smods they can implement all the new stuff

daring fern
near coral
#

I mean yes

inner terrace
#

Can G.ASSET_ATLAS load atlases declared as animation_atlases?
e.g.
} SMODS.Atlas { key = "j_arrowhead_anim", path = "UNBELIEVABLE.png", atlas_table = 'ANIMATION_ATLAS', frames = 67, fps = 8, px = 71, py = 95, }
Trying to load this results in a crash using G.ASSET_ATLAS["modprefix_j_arrowhead_anim"]
(with the modprefix set to what it needs to be, of course)

faint yacht
#

G.ANIMATION_ATLAS

inner terrace
#

Thankfully I managed to figure that out just a second ago, but now I'm getting a similar crash stating that attempting to index field 'atlas' (a nil value)

near coral
#

Is {C:blind} the new color for blind size
If so it isn't showing the color, it's black by default

inner terrace
#

it's on, uh
card.children.center.atlas = G.ANIMATION_ATLAS["modprefix_j_arrowhead_anim"], effectively

faint yacht
#

Are you trying to swap atlases?

inner terrace
#

Yeah

faint yacht
#

iirc you should do

card.children.center:remove()
card.children.center = SMODS.create_sprite(card.T.x, card.T.y, card.T.w, card.T.h, atlas, pos)

where atlas is either a string atlas key or table of the G.ANIMATION_ATLAS["modprefix_j_arrowhead_anim"] directly and pos contains the { x = 0, y = 0 }, although x will automatically update, so it is y that you need to ensure what row of the atlas is chosen for the animation.

inner terrace
#

Sick
The next couple of lines were doing the set_sprite_pos, so that's easy

rapid stag
#

does context.remove_playing_cards also occur when jokers or consumables are destroyed? like any card object?

faint yacht
#

context.joker_type_destroyed for anything destroyed that's not a playing card.

rapid stag
#

so if context.remove_playing_cards or context.joker_type_destroyed then covers all kinds of card destruction?

faint yacht
#

context.remove_playing_cards + context.removed (ordered table of playing cards to destroy) & context.joker_type_destroyed + context.card respectively.

rapid stag
faint yacht
#

Correct for context.removed, but context.card is an individual card that's being destroyed.

rapid stag
#

oh, right. so in that casee context.card and 1 or 0

near coral
#

I just need to know the {C:color} for the new blind size color is all

faint yacht
#

...I don't think that has been set, unfortunately.

near coral
#

It's in the smods log

#

Oh wait that's in the wrong section

#

Wait no I was right

faint yacht
near coral
#

I think I see a color difference

#

Is that it

faint yacht
#

G.C.BLIND_SIZE = HEX('ad5353')

near coral
#

That's a red color

faint yacht
#

C:blind points to G.C.DYN_UI.DARK

near coral
#

is c:blind for something else then

faint yacht
#

G.ARGS.LOC_COLOURS['blind'] == G.C.DYN_UI.DARK is true.

near coral
#

So that dark color is supposed to be the new blind color?

faint yacht
#

I suppose?

near coral
#

Will something happen if I put c:blind_size?

frosty rampart
#

the blind color matches with the color that the currently active blind sets

#

the shop sets it to red i think

near coral
#

Ohh

frosty rampart
#

but it'll match the color of the current blind during a round

near coral
#

Let me test that rq

faint yacht
#

iirc you just get G.C.UI.TEXT_DARK if an invalid one is specified.

frosty rampart
faint yacht
#

It does not.

#

Fallback is G.C.UI.TEXT_DARK.

near coral
#

What does small blind set it to

#

Ok it's not changing color at all I think I'm missing something

faint yacht
#

Basically, anything in G.ARGS.LOC_COLOURS is what you can use for text styling.

near coral
#

Turns out it is changing color, but it's barely noticable

#

I suppose it matches the color of the boss blind symbol?

#

Nope it's just generally super dark

faint yacht
#

With DebugPlus, execute eval G.ARGS.LOC_COLOURS in-game.

near coral
#

It brings up this, how do I change the colors

#

Of the blind size I mean

faint yacht
#

C:blind is for Blind size. You can also scroll through the Lovely console to see what keys you can use for colorizing the text.

near coral
#

So these dark ahh colors are the intended result?

faint yacht
#

C:purple is for score.

#

Pretty much.

near coral
#

That fucking sucks

#

And it's just for boss blinds?

faint yacht
#

C:blind is for effects pertaining to the Blind size (perma-bonuses, effects from Jokers and/or playing cards) - if you want the actual BLIND_SIZE reddish color, that's not exactly accessible without defining the key in G.ARGS.LOC_COLOURS.

near coral
#

All I was told is that there's a new color partaining to blind size, which my -blind size effects are a part of

#

Well it was worded as -score requirement but you know

faint yacht
#

C:blind is it.

near coral
#

Damn

#

Now I gotta live with mid, at least until it's made better

faint yacht
#

...or you can define your own color in G.ARGS.LOC_COLOURS and use that.

#

G.ARGS.LOC_COLOURS['scorereqred'] = HEX('aaaaaa'), where you swap aaaaaa for the HEX value you want to use, then C:scorereqred. Should probably add your mod prefix to the key.

near coral
#

I will likely define colors for my mod's bzr boss blinds

near coral
faint yacht
#

To the G.ARGS.LOC_COLOURS, yes.

near coral
#

Do I have to do it while facing the specific blind to assign the color to that blind?

faint yacht
#

...you can hook loc_colour function to add your color to the G.ARGS.LOC_COLOURS table or at any point during loading, but, otherwise, you can define it at any point in time.

near coral
faint yacht
#

Though, as there's a fallback, could also just make G.ARGS.LOC_COLOURS empty so that all color-based text styling uses same colors. 😂

daring fern
near coral
#

I don't know what that one does

faint yacht
#

V:1 will use color defined from return { vars = { colours = { ... } }.

#

return { vars = { colours = { HEX('FF0000') } } would lead to your own red color for V:1.

unreal cosmos
#

how do i make custom blinds

#

i want to make a blind themed mod

faint yacht
unreal cosmos
#

the smods page is sort of confusing

faint yacht
#

You can have it just be a simple atlas w/o animation.

unreal cosmos
#

also how do i make the descriptions?

unreal cosmos
#

do i just create a blind folder or do i do anything in main.lua

faint yacht
#

You define the atlas that uses your art from 1x and 2x folders of assets of your mod through SMODS.Atlas, then use the key of the defined atlas for SMODS.Blind.

unreal cosmos
faint yacht
#

Descriptions can be done by defining loc_txt, but are preferred to be made through localization files.

unreal cosmos
#

can there only be1x files

#

and no 2x

faint yacht
#

1x and 2x are needed.

unreal cosmos
faint yacht
#

2x are just basically 1x scaled up 200% without any smoothing (i.e. nearest neighbor) when increased.

unreal cosmos
#

or could i just scale it up with out ruining the file

faint yacht
#

Can scale it up and save in 2x.

unreal cosmos
faint yacht
#

Into both 1x and 2x of that, yes.

#
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

unreal cosmos
faint yacht
#

px and py should be both 34 for Blinds.

#

You can call SMODS.Atlas many times.

unreal cosmos
faint yacht
unreal cosmos
#

cool

unreal cosmos
faint yacht
#

Can do either - if you want to load other scripts from main file, do assert(SMODS.load_file("filename.lua"))().

unreal cosmos
#

would you also recommend different files for each blind or just one big blinds.lua

faint yacht
#

You can have your main script load whatever and however... and same applies for organization of your items - if you want one big file for just Blinds, sure.

unreal cosmos
faint yacht
unreal cosmos
faint yacht
#

if card.ability.played_this_ante, where card is the given playing card - usually referenced as context.other_card (context.other_card.ability.played_this_ante) or context.debuff_card (context.debuff_card.ability.played_this_ante).

unreal cosmos
#

also this doesnt seem to be loading blinds.lua correctly

faint yacht
#

if context.other_card.ability.played_this_ante then

#

Did you create the blinds.lua file next to your main script?

unreal cosmos
#

crashes when i go to the collection page thoughOops! The game crashed:
functions/UI_definitions.lua:4415: attempt to index a nil value

Additional Context:
Balatro Version: 1.0.1o-FULL
Modded Version: 1.0.0~BETA-1620a-STEAMODDED
LÖVE Version: 11.5.0
Lovely Version: 0.9.0
Platform: Windows
Steamodded Mods:
1: DeluxeBlinds by MrSpaceFish [ID: DeluxeBlinds, Version: 0.0.1]
2: DebugPlus by WilsontheWolf [ID: DebugPlus, Version: 1.5.3~dev, Uses Lovely]
Lovely Mods:

Stack Traceback

(3) LÖVE metamethod at file 'boot.lua:352'
Local variables:
errhand = Lua function '(LÖVE Function)' (defined at line 616 of chunk [lovely debugplus.console "debugplus/console.lua"])
handler = Lua function '(LÖVE Function)' (defined at line 616 of chunk [lovely debugplus.console "debugplus/console.lua"])
(4) Lua global 'create_UIBox_blind_popup' at file 'functions/UI_definitions.lua:4415'
Local variables:
blind = table: 0x220d4870 {disable:function: 0x220d4cf0, _saved_d_u:true, original_key:cane, mult:2, dollars:5, registered:true, _discovered_unlocked_overwritten:true, order:33 (more...)}
discovered = boolean: false
vars = nil
blind_text = table: 0x220600b8 {}
_dollars = number: 5
target = table: 0x21eb6130 {type:raw_descriptions, vars:table: 0x22074e50, key:bl_deluxe_cane, set:Blind}
(*temporary) = nil
(*temporary) = string: "bl_deluxe_cane"
(*temporary) = number: 1
(*temporary) = number: 17.5238
(*temporary) = table: 0x21ad0218 {x:11.08567839196, w:1.3, y:0.76315399653988, h:1.3, scale:0.988, r:0.016726950123151}
(*temporary) = number: 0.988
(*temporary) = table: 0x21ba9158 {x:-30, w:80, y:-11, h:33.5, scale:1, r:0}
(*temporary) = table: 0x220f8780 {y:2.0591666666667, x:11.899166666667}
(*temporary) = table: 0x21ebdba8 {y:5.05, x:8.5333333333333}
(*temporary) = table: 0x21e920c0 {}
(*temporary) = number: 0
(*temporary) = boolean: true
(*temporary) = number: 22.5
(*temporary) = number: 33.5
(*temporary) = Lua function '?' (defined at line 130 of chunk [SMODS _ "src/ui.lua"])
(*temporary) = boolean: true
(*temporary) = boolean: true
(*temporary) = string: "attempt to index a nil value"
(5) Lua method 'hover' at Steamodded file 'src/overrides.lua:360'
Local variables:
(*temporary) = table: 0x2211cb30 {blind:table: 0x220d4870, force_focus:true, card:table: 0x21b0bd20, center_key:c_base, center:table: 0x21fc1090}
(6) Lua method 'update' at file 'engine/controller.lua:397'
Local variables:
self = table: 0x21c44070 {held_button_times:table: 0x21a2cbc0, focus_cursor_stack_level:1, snap_cursor_to:table: 0x222fcc78, interrupt:table: 0x21a2cc10, GAMEPAD:table: 0x21a655b0 (more...)}
dt = number: 0.0068243
(7) Lua upvalue 'gameUpdateRef' at file 'game.lua:2769'
Local variables:
self = table: 0x218cf2b0 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, F_ENGLISH_ONLY:false, sort_id:33, F_DISCORD:true, STAGE:1, F_MOBILE_UI:false, F_NO_SAVING:false (more...)}
dt = number: 0
(8) Lua method 'update' at Steamodded file 'src/ui.lua:456'
Local variables:
self = table: 0x218cf2b0 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, F_ENGLISH_ONLY:false, sort_id:33, F_DISCORD:true, STAGE:1, F_MOBILE_UI:false, F_NO_SAVING:false (more...)}
dt = number: 0.0068243
(9) Lua field 'update' at file 'main.lua:1024'
Local variables:
dt = number: 0.0068243
(10) Lua function '?' at file 'main.lua:962' (best guess)
(11) global C function 'xpcall'
(12) LÖVE function at file 'boot.lua:377' (best guess)
Local variables:
func = Lua function '?' (defined at line 933 of chunk main.lua)
inerror = boolean: true
deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"])
earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
'

faint yacht
#

Did you make the description for it?

unreal cosmos
#

didn twork

faint yacht
#

bleh, brain fried atm, can't really help much past this point - do check your atlas definition, its' key used in the atlas in SMODS.Blind, etc... otherwise, wait for someone else to assist. 💀

lime wren
#

Had an idea for a Joker but it might be too complicated for my first time using lua -_-
Picks a random common joker in the collection and has that effect. Changes at the end of every round.
There are issues that might arise with some jokers, especially scaling, but writing the code for it is a struggle. Not sure when or how to trigger things :P

lime wren
#

Am I in the wrong channel? I thought this was for development help.

#

oh nvm i didn't click the thing

keen totem
#

how would i make a card created from add_card a negative card?

#

i cant find it in the documentation

daring fern
keen totem
#

is there not a way to directly make the card spawn as a negative card?

rigid solar
#

put set edition in an event

slim ferry
#

in the arguments

frosty dock
#

that totally is in the docs...

keen totem
#

i dont know where it is in the docs

daring fern
rapid stag
#

i'm assuming that joker copies created via invisible/ankh call add_to_deck, right?

rigid solar
#

yes

fringe oxide
#

is it possible to make consumables that only work when they are in consumable slots?

gilded blaze
#

did you mean "only usable while in consumable slot"

fringe oxide
#

Like it stays in there and gets used passively

#

Like the tapes from cardsauce or zodiac cards from some other mod

gilded blaze
#

consumables are also cards like jokers

#

just define a calculate field

frosty rampart
#

well the fact that those consumables already exist means that the answer is yes
and yea you can just give consumables a calculate function, works exactly the same as jokers

gilded blaze
sleek valley
#

how would i check for the number of king cards in the deck again?
i know i've seen a similar example somewhere but i cant find it-

rapid stag
sleek valley
#

thanks!

fringe oxide
thorn ingot
#

Hey. How do I set Pack appearance rate to 0 in a Deck?

Kind of like G.GAME.tarot_rate = 0, but for Arcana Packs.

shell timber
#

you can use the new object weights system in the decks calculate function

thorn ingot
#

uuu, what's that new function? Don't know about it.

thorn ingot
#

Okay. I found the object_weights thingy, but I don't get how to use it.

silent sail
#

can someone elaborate on why this doesnt modify certain jokers (odd todd, golden joker ect)

#

the function is too big to send but that works fine so idk why this doesnt

rigid solar
#

there's nothing in the joker that does this effect

#

the problem's in whatever that function you're talking about is

silent sail
#
BAGGUTRO = BAGGUTRO or {}

function BAGGUTRO.perform_operations(val1, op, val2)
    if type(val2) == "number" then
        if op == "=" then return val2 end
        if op == "+" then return val1 + val2 end
        if op == "-" then return val1 - val2 end
        if op == "*" then return val1 * val2 end
        if op == "/" then return val1 / val2 end
        if op == "%" then return val1 % val2 end
        if op == "^" then return val1 ^ val2 end
    elseif type(val1) == "number" and type(val2) == "table" then
        local final = val1
        for _, v in ipairs(val2) do
            final = BAGGUTRO.perform_operations(final, op, v)
        end
        return final
    end
end

part 1

#
function BAGGUTRO.modify_joker_values(card, modifytbl, exclusions, ignoreimmutable, nodeckeffects)
    if not card or not modifytbl then return nil end
    if card.config.center.immutable and not ignoreimmutable then return nil end
    local cardwasindeck = card.added_to_deck
    if not nodeckeffects and cardwasindeck then card:remove_from_deck(true) end
    exclusions = exclusions or {}
    local ops = {"=", "+", "-", "*", "/", "%", "^"}
    local function modify_value(ref_table, ref_value, isdirectlyinability)
        if type(ref_table[ref_value]) == 'table' and (ignoreimmutable or ref_value ~= "immutable") then
            for k, v in pairs(ref_table[ref_value]) do
                modify_value(ref_table[ref_value], k, false)
            end
        elseif type(ref_table[ref_value]) == 'number' and ((not (exclusions[ref_value] == true or exclusions[ref_value] == ref_table[ref_value])) or not isdirectlyinability) then
            for i, v in ipairs(ops) do
                if modifytbl[v] then
                    ref_table[ref_value] = BAGGUTRO.perform_operations(ref_table[ref_value], v, modifytbl[v])
                end
            end
        end
    end
    for k, v in pairs(card.ability) do
        modify_value(card.ability, k, true)
    end
    if not nodeckeffects and cardwasindeck then card:add_to_deck(true) end
end

the otehr half

#

i have otherh things and it works perfectly on those

rigid solar
#

i'd just throw prints everywhere and see which part doesnt work

silent sail
#

might just change it to something else that i have working

daring fern
silent sail
#
SMODS.Shader({ key = 'laminated', path = 'laminated.fs' })

SMODS.Edition {
    key = 'laminated',
    shader = 'laminated',
    in_shop = true,
    weight = 3,
    extra_cost = 6,
    apply_to_float = false,
    badge_colour = HEX('867a90'),
    sound = { sound = "baggutro_Laminated1", per = 1.2, vol = 0.4 },
    disable_shadow = false,
    disable_base_shader = false,
    loc_txt = {
        name = 'Laminated',
        label = 'Laminated',
        text = {
            [1] = '{C:attention}All{} values increasd',
            [2] = 'by {C:attention}50%{}',
            [3] = '{C:inactive}[where possible]{}'
        }
    },
    unlocked = true,
    discovered = true,
    no_collection = false,
    get_weight = function(self)
        return G.GAME.edition_rate * self.weight
    end,
    on_apply = function (card)
        BAGGUTRO.modify_joker_values(card, {['*'] = 1.5}, {x_mult = 1, x_chips = 1, h_size = 0, extra_value = true, cry_prob = true, d_size = 0, card_limit = true, extra_slots_used = true})
    end,
    on_remove = function (card)
        BAGGUTRO.modify_joker_values(card, {['/'] = 1.5}, {x_mult = 1, x_chips = 1, h_size = 0, extra_value = true, cry_prob = true, d_size = 0, card_limit = true, extra_slots_used = true})
    end
}
    

this is one i have that works, for edditions

rigid solar
#

at a glance i dont see a reason for it to not work

silent sail
#

it works but only with certain jokers

#

anyway i changed it to use the binder code but only apply once and its a bandaid fix but it works i thiknk

rigid solar
#

i mean again, just throw prints everywhere on that function and use it on odd todd, you'll see where it fails

silent sail
#

yeah fair enough i could do that

silk latch
near coral
#

Why is it that the stakes are stacked out of order on the galdur stake selection

#

It's supposed to stack the reverse way vanilla does, starting with the rightmost one (black stake) on the bottom

#

Also blue stake (2nd to left) is completely omitted from the stake stack for some reason

#

Selecting black stake and teal stake stack it fine, however:
When selecting pink, olive, blue, and tanzanite stakes the stack is out of order
When selecting white stake the stack includes orange stake for some reason
When selecting orange stake white stake isn't there for some reason

frosty rampart
#

the definitions for which stakes apply other stakes are probably just fucked?

near coral
#

Do I fix that in the stake code

#

Or some other file

frosty rampart
#

stake code

near coral
#

Alright

frosty rampart
#

this in particular

inner terrace
#

I'm encountering an interesting issue with SMODS.create_sprite
It makes the sprite correctly, but it appears offscreen, and only flies up to where it's supposed to be when the card is grabbed (as if to drag it) and remains wherever it's left, floating, instead of attached to the card's center

near coral
#

applied_stakes = {"stake_bzr_black","stake_bzr_teal"},

#

Does it have to start with the previous stake then work its way down to black stake

frosty rampart
#

no

this is evaluated recursively to include all stakes applied by applied stakes, so you usually don't need to specify multiple stakes here

near coral
#

ah

frosty rampart
normal crest
near coral
#

So remove stake_bzr_black

normal crest
#

you'd put it before the SMODS.Blind call for example

#

but it can be anywhere as long as it loads

inner terrace
normal crest
near coral
#

I assume above stake means it's the stake above the previous one

#

Or does it mean for me to put the stake above it