#💻・modding-dev

1 messages · Page 334 of 1

heady siren
#

I have my own joker that debuffs an adjacent joker I could give you the code for

#

Try it, it probably will

#

If not joker_main then it'll be main_scoring

heady siren
placid star
#

but im going to sleep i cbf with this rn

rustic swallow
#

how do you override vanilla values again

#

nvm

#

why is there an unexpected symbol at 1511

old cairn
chrome widget
#

Is there a specific function that handles when the application is put into focus?

heady siren
#

Am glad it worked

#

Gonna bump again

red flower
heady siren
red flower
#

yeah

rapid stag
#

bump

red flower
high sinew
#

for using VS Code for Lua is there a way I can set up ---@param to see how everything is returning

red flower
#

--@return

#

also i don't think those types are correct at all

#

self is SMODS.Center, card is Card and context is CalcContext

eager pendant
#

Can you tell me how to add ignore slots consumable?

wind steppe
#

does anyone know why my game crashes? i've been trying to make this joker and it says there's an unexpected symbol near one of the ifs

SMODS.Joker{ -- Yellow Card implementation
    key = 'Yellow Card',
    loc_txt = {
        name = 'Yellow Card',
        text = {
            'Earn {C:money}$#1#{} at end of round. ',
            'Payout increases by {C:money}$#2#{} every',
            '#3# {C:inactive}(#4#){} {C:attention}Booster Pack{} skipped.'
        }
    },
    atlas = 'Jokers',
    pos = {x = 2, y = 0},
    config = { extra = {
        money = 0,
        money_gain = 1,
        pack_require = 3,
        pack_amount = 3
    }
    },
    rarity = 2,
    blueprint_compat = false,
    loc_vars = function(self,info_queue,card)
        return {vars = {card.ability.extra.money, card.ability.extra.money_gain, card.ability.extra.pack_require, card.ability.pack_amount}}
    end,
    calculate = function(self,card,context)
        if context.skipping_booster and not context.blueprint then -- Booster Pack is skipped, decrement the counter
            card.ability.extra.pack_amount = card.ability.extra.pack_amount - 1,
            if card.ability.extra.pack_amount == 0 then -- the error is on this line
                card.ability.extra.pack_amount = card.ability.extra.pack_require
                card.ability.extra.money = card.ability.extra.money + card.ability.extra.money_gain
                return {
                    message = 'Upgrade!',
                    colour = G.C.ATTENTION
                }
            end
        end
    end,
    calc_dollar_bonus = function(self, card) -- Apparently money isn't in the calculate function. Who knew?
        return card.ability.extra.money
    end
}
high sinew
red flower
high sinew
#

ok bet

red flower
#

unless you mean for the lsp as a whole in that case just google lua lsp

red flower
high sinew
#

I mean for like seeing if my jokers return the thing it should

#

see how its unkown

#

is it on documentation for lua somewhere?

red flower
#

its not easy to add those to the extra tables sadly as those are variable for every joker

high sinew
#

ik not easy i just wanna know how to do

heady siren
#

I'm getting this any time I try to start a run, the only thing I've added is my vouchers, which don't even have redeem code yet

wind steppe
red flower
#

loc_vars says card.ability.pack_amount instead of card.ability.extra.pack_amount

red flower
heady siren
#

That worked

high sinew
#

or still need to make it

red flower
high sinew
#

oh ok

#

so it being unkown why is that then?

iron haven
#

so Y still doesn't give you mult.

high sinew
#

ik VS doesnt know lua but i thought the extension with folder gives it output

iron haven
#
SMODS.Joker{
    key = 'yankee',
    loc_txt = {
        name = 'Y',
        text = {
            "{C:attention}Destroys all played 2's{} gains {C:mult}+#2#{} mult for {C:attention}each destroyed 2{}.",
            "{C:inactive}(Currently {C:mult}+#1#{C:inactive} mult)"
        }
    },
    atlas = "Jokers",
    pos = {x = 0, y = 3},
    config = { extra = {
            mult = 2,
            mult_gain = 3
        }
    }, 
    unlocked = true,
    discovered = true,
    rarity = 2,
    cost = 7,
    loc_vars = function(self, info_queue, card)
        return {
            vars = {
                card.ability.extra.mult,
                card.ability.extra.mult_gain,
            }
        }
    end,
    calculate = function(self,card,context)
        if context.before then
            for i = 1, #context.scoring_hand do
                if context.scoring_hand[i]:get_id() == 2 then
                    context.scoring_hand[i]:remove()
                    card.ability.extra.mult = card.ability.extra.mult + 3
                    card_eval_status_text(context.scoring_hand[i], 'extra', nil, nil, nil, {message = 'Upgrade!'})
                end
            end
    if context.joker_main then
        return {
            mult = card.ability.extra.mult,
            card = card
        }
        end
    end
end
}```
what is wrong with this?
#

I know it doesn't give you mult but where in the code is it?

#

hm

red flower
high sinew
#

ah ok

#

so it is best to define in files or just make a types file for joker

gilded narwhal
#

gang for making new global variables similar to all the G.GAME stuff how would you recommend doing it

high sinew
iron haven
red flower
high sinew
#

can you send the debug error?

#

That balatro gives

iron haven
#

It's a logic error not a real error.

high sinew
#

unsure then test in game sorry

iron haven
#

yeah Y doesn't give you the mult that it stored.

hasty mist
#

i'm trying to apply an edition to a selected consumable, this doesn't seem to work properly

#

i'm not sure what's wrong

heady siren
#

Does SMODS add a consumeable_rate for each modded consumeable?

iron haven
#
    if context.joker_main then
        return {
            mult = card.ability.extra.mult,
            card = card
        }
        end
    end
``` I think it is this.
heady siren
#

You have an extra end

#

Returns don't have ends

soft echo
#

how does one add an enhancement to a playing card?

iron haven
#

sorry this is the code

if context.joker_main then
        return {
            mult = card.ability.extra.mult,
            card = card
        }
        end```
#

oh it isn't in the calculate function.

heady siren
#

That would be the problem

soft echo
eager pendant
#

Can you tell me how to add ignore slots consumable?

heady siren
#

look for set_ability in the game files

soft echo
#

oh wait i meant edition

iron haven
#

Still doesn't give you mult if I put it in the calculate function.

#
SMODS.Joker{
    key = 'yankee',
    loc_txt = {
        name = 'Y',
        text = {
            "{C:attention}Destroys all played 2's{} gains {C:mult}+#2#{} mult for {C:attention}each destroyed 2{}.",
            "{C:inactive}(Currently {C:mult}+#1#{C:inactive} mult)"
        }
    },
    atlas = "Jokers",
    pos = {x = 0, y = 3},
    config = { extra = {
            mult = 2,
            mult_gain = 3
        }
    }, 
    unlocked = true,
    discovered = true,
    rarity = 2,
    cost = 7,
    loc_vars = function(self, info_queue, card)
        return {
            vars = {
                card.ability.extra.mult,
                card.ability.extra.mult_gain,
            }
        }
    end,
    calculate = function(self,card,context)
        if context.before then
            for i = 1, #context.scoring_hand do
                if context.scoring_hand[i]:get_id() == 2 then
                    context.scoring_hand[i]:remove()
                    card.ability.extra.mult = card.ability.extra.mult + 3
                    card_eval_status_text(context.scoring_hand[i], 'extra', nil, nil, nil, {message = 'Upgrade!'})
                end
            end
        if context.joker_main then
            return {
                mult = card.ability.extra.mult,
                card = card
            }
        end
    end
end
}```
what is causing the logic error?
heady siren
eager pendant
# eager pendant No

Just creates planet and tarot cards, but if there is a location, I'd like the number of locations to be ignored

eager pendant
heady siren
#

What's the code?

red flower
eager pendant
# heady siren What's the code?

calculate = function(self, card, context)
if context.before then
G.GAME.consumeable_buffer = #G.consumeables.cards
end
if context.individual and context.cardarea == G.play and context.other_card.seal == 'Blue' and G.GAME.consumeable_buffer < G.consumeables.config.card_limit then
local card_type = 'Planet'
G.E_MANAGER:add_event(Event({
func = (function()
if G.GAME.last_hand_played then
local _planet = 0
for k, v in pairs(G.P_CENTER_POOLS.Planet) do
if v.config.hand_type == G.GAME.last_hand_played then
_planet = v.key
end
end
local card = create_card(card_type,G.consumeables, nil, nil, nil, nil, _planet, 'blusl')
card:add_to_deck()
G.consumeables:emplace(card)
end
return true
end)}))
G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1
elseif context.individual and context.cardarea == G.play and context.other_card.seal == 'Purple' and G.GAME.consumeable_buffer < G.consumeables.config.card_limit then
G.E_MANAGER:add_event(Event({
func = (function()
local card = create_card('Tarot',G.consumeables, nil, nil, nil, nil, nil, '8ba')
card:add_to_deck()
G.consumeables:emplace(card)
return true
end)}))
G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1
end
end

heady siren
heady siren
# red flower

I ended up patching in a default value and a check in the create_card_for_shop function

eager pendant
iron haven
heady siren
hasty mist
#

i think my problem lies in this section of my code, this seems to be able to apply an edition to a selected playing card, but when i try to modify this code to let me select a consumable instead, it lets me select it, but when used, it doesn't apply the edition

eager pendant
heady siren
heady siren
hasty mist
heady siren
#

It looks like there's no references to G.consumeables.highlighted in the base game code so it might not even have functionality for that

red flower
#

it should

#

i think the problem is that you can only highlight 1 so it's only usable on itself

hasty mist
#

i think i know how to fix that, let me do some testing

dense adder
#

is there a good function to remove or destroys a card after it scores, coming up short using :remove() and :start_dissolve()
code if it helps

if context.other_card.ability.extra.cb_trigger == true then
              card.ability.extra.totalChipMult = card.ability.extra.totalChipMult + card.ability.extra.gainChipMult
              card.ability.extra.flag = true
              local _card = context.other_card
              return{ 
                message = 'Crumble',
                colour = G.C.FILTER,
                G.E_MANAGER:add_event(Event({trigger = 'after', delay = .45,func = function()
                          _card:start_dissolve()
                          return true end}))
              }
          end
red flower
#

yeah don't remove cards using those during scoring. use context.destroy_card and return { remove = true }

iron haven
#

hey guys?

#

you do also don't know where the logic error is too?

hasty mist
#

this seems to allow me to select playing cards and consumables, edition can apply on playing cards but when i use it on a consumable it does nothing

heady siren
#

Your if context.joker_main then is inside your if context.before then statement, move one of the ends to be before the if context.joker_main then line

heady siren
sturdy compass
#

Like Kaeda said, you are missing an end

red flower
iron haven
#

oh

heady siren
#

Your indentation makes it hard to notice

#

Yes, and then remove the very last end in the code

iron haven
#

ok.

hasty mist
#

alright, it works now for the most part, but i can still highlight playing cards, how do i prevent this?

lucid owl
#

this blind score is crashing when the blind is selected, what am i doing wrong? i want to make the most played hand not score

dense adder
red flower
#

remove context.individual

dense adder
#

that conflict does it, well i need it to get context.other_card but i know a workaround, thank you for the help

lucid owl
red flower
red flower
lucid owl
dense adder
lucid owl
#

the crash is happening whenever a card is selected

#

so i assume the actual variable is going through? but for some reason it's not being treated correctly in the table

sleek siren
#

Is there a way to make a certain set of jokers have a much better chance of appearing?

lucid owl
#

but when a card is selected, it seems to think poker_hands is empty?

iron haven
#

How do I make it so that the mult is squared?

lucid owl
sleek siren
#

Oh! ok ^^

Is there a way I can change the rarity values when a deck is selected or a voucher is gained?

hasty mist
#

is there a way to change a specific card's atlas only if it has a certain edition

iron haven
hasty mist
red flower
# lucid owl

maybe im too sleepy but i think this is looking for a string instead of a table

#

i know the docs say it should be a table

iron haven
lucid owl
red flower
#

yeah but it's because hand[table] is always nil

#

hand["High Card"] is not

daring fern
lucid owl
#

let me try it

iron haven
lucid owl
#

so wait, would i set that as another variable of hand?

daring fern
red flower
red flower
lucid owl
iron haven
daring fern
gilded narwhal
#

hey why does this patch not do the thing I want it to (legendaries should spawn in shop if the config is enabled)

lucid owl
iron haven
lucid owl
iron haven
#

uh

lucid owl
iron haven
#

this line?

daring fern
iron haven
#

oh this line?

#

hmm

#

of course it is on the last joker...

#

Talisman?

#

What is wrong?

#

...

#

I have no idea.

brisk rose
#

Someone who was playing vanilla is trying to recover the seed for their naninf run. They're posting in modding chat, but I figure active mod coders are more likely to be able to help

iron haven
#

why is it on that line?

#

uh.

#

@daring fern what is wrong?

daring fern
iron haven
#

and now my jokers don't show.

daring fern
iron haven
#

The mods button is missing!.

daring fern
iron haven
#

I put it in the Mods folder.

daring fern
iron haven
#

and put the new one in.

#

hm

#

uhhhh

daring fern
daring fern
iron haven
rough furnace
#

smods doesn't care what it's named

#

whats inside the smods folder?

iron haven
rough furnace
#

can I see the breadcrumbs on top?

iron haven
brisk rose
#

It's nested

iron haven
#

ok

brisk rose
#

Copy smods-main to the root of Mods and delete Steamodded

#

Or resolve it a different equivalent way

iron haven
rough furnace
#

talisman is nested too

brisk rose
brisk rose
iron haven
#

ok but now Z isn't in my collection.

daring fern
iron haven
#

oh nvm.

#

ok Z works now.

hoary crown
#

how do generate money when consumable use

rough furnace
#

ease_dollars

heady siren
#

I got colored text to work with my buff cards [=

#

Through a really hacky method of making my own color tables and using conditions inside the colours table

hoary crown
heady siren
#

The amount you want to give or remove from the player

#

Somethingcom is thinking up a storm right now

hoary crown
#

lmao

#

so just..

ease_dollars 5

heady siren
#

ease_dollars(5)

#

It's a function

hoary crown
#

ok

sturdy compass
#

But hey it works so who am I to judge

heady siren
#

Now I just gotta find a unique held in hand color, any suggestions?

#

Scored is blue, discarded is red, in deck is green

iron haven
#

RGB.

frosty rampart
#

vanilla jokers use the standard orange-yellow "attention" color for that, but if you want a new color i'd probably lean towards a light purple (since you aren't scoring or discarding it)

iron haven
#

what about magenta?

heady siren
#

I'll make it purple, since that's a color already in the game

kindred basin
# brisk rose

yo people of modding chat
that someone in question is me

#

where is the seed of the current run stored in the game files?

#

basically I scored naninf
I closed out of the game
I reopened the game later to finish the run
hitting continue on the run instantly crashes the game

#

results in this screen

#

if someone in here knows how to get the seed of the run would be appreciated thanks

daring fern
kindred basin
#

I do have balatro save editor installed

heady siren
kindred basin
#

couldn't figure out how to find the seed

#

that is helpful tho thanks

daring fern
kindred basin
#

how do u view the save.jkr file in balatrosaveeditor?

daring fern
kindred basin
#

im on windows
I went to C: -> users -> me -> AppData -> Roaming -> Balatro -> 1 -> save.jkr

#

dragged and dropped that there

#

and got that

#

that is the right file right?

daring fern
kindred basin
#

fuuuuuuuuuuuc

#

does scoring infinity straight up corrupt the entire save file?

#

I mean I should be able to start a new run pretty sure

kindred basin
#

I just haven't yet bc I aint tryna lose the seed of this current one

#

okay so basically im cooked lol

#

I don't need the seed it would just be kinda nice to have

#

thanks tho

#

but yea dropping profile.jkr in there works

#

save.jkr is just not working at all

daring fern
kindred basin
#

i mean yea it looks like it

#

trying to do math or not a number makes computer not happy

heady siren
#

It now includes the rarity of the card as if it's a joker

celest aspen
#

anyone know how the Loyalty cards description works? It changes to "Active!" when the number of cards needed to activate reaches 0. I tried to reuse the Loyalty Cards code, adapting it to my code, but it just says ERROR.

daring fern
celest aspen
#

Is there a way to do it via SMODS?

brisk rose
#

Like where do they live?

heady siren
#

They have their own card area that processes cards after scoring cards but before jokers

#

Also I made it so that their max is 4, the level 2 voucher gives you 4 slots, and there's a joker that gives you 4 more slots, so you can have 12 total

brisk rose
heady siren
#

You can just not take buff cards

brisk rose
#

Well yeah ofc, though you should probably make a config so they don't clutter he shop in the case. I'm definitely interested in your mod generally

heady siren
#

They don't cover any cards in the shop, at least not enough to make the shop hard to use

#

I could make a setting to always compress them in shops

#

Like they do when selecting a blind

brisk rose
#

I meant that if I'm not taking them I may as well not be offered them

heady siren
#

Oh

#

I should probably just do that for all features honestly

#

Like some mods do, you can pick and choose what's added

brisk rose
#

Yeah, modularity is always a good thing imo

sturdy compass
#

Can agree

heady siren
#

You can just slap SMOD object definitions into if statements right?

sturdy compass
#

Yep!

heady siren
#

I just need to figure out an actually good menu for it /=

brisk rose
heady siren
#

I refuse to do so unless it is offered to me

sturdy compass
#

Utilize mod.config_tab!

heady siren
#

I already am for my music toggle

brisk rose
sturdy compass
heady siren
#

I mean like, what types of UI elements to use, should I use a card area for jokers?

brisk rose
#

That would be strange if possible

heady siren
#

I've seen it done before

sturdy compass
#

fascinating

brisk rose
#

I have too come to think of it. Though for smth as granular as individual jokers maybe just recommend "banner"

shell timber
#

that's what cryptid does, right(?)

#

you can click on jokers in the collection to change if they're banned

brisk rose
#

Because that's how it works

#

Afaik

sturdy compass
#

I honestly just leave it to users to comment them out within the code if they want to get rid of 'em Emoti_Shrug

brisk rose
#

Meant Sylvi

#

Apparently cg is just a contributor

sturdy compass
#

That looks like a great mod

brisk rose
#

Yeah, I need to add it to my modpack and make use of it

#

First off to get rid of the stupid Bunco polyminos

shell timber
#

yeah that was the one part of bunco i didnt like tbh

heady siren
#

If I put code in the SMODS.current_mod.config_tab function will it only run when the tab is opened?

sturdy compass
#

I think so?

#

I think it runs it on open not while open

brisk rose
#

Unless it stores the config in the Mods folder instead of the config folder, in which case I could still do that and it would overwrite every time

sturdy compass
#

Might be worth investigating

daring fern
#

Is there a way to retrigger without returning?

sturdy compass
#

Maybe SMODS.calculate_context? Not sure if it handles retriggers

#

Hmm looks like it does not

#

What are you trying to do that would require that?

daring fern
sturdy compass
#

oh goodness

brisk rose
#

So... random uh... I guess it's a question. I'd guess you'd call smodded's approach more or less object oriented... what would you call the base game?

#

It seems to be very random and often inverted as to what polls what from what I'd expect

sturdy compass
#

I think it would be object oriented in base game too, as stuff like cards and blinds do act like objects with their own properties, functions, initializations etc.

brisk rose
#

Yeah, jokers and enhancements and stuff just get really weird

#

Lots of branching conditionals

#

And properties defined in random functions

sturdy compass
#

It definitely could've been handled a bit better lol

#

Then again, Balatro is a personal project

brisk rose
#

Yeah I guess it makes sense that modularity is a hallmark of a modding system, but much less so a 1 person indie game

sturdy compass
#

for sure

shell timber
#
[manifest]
version = "1.0.0"
dump_lua = true
priority = -1

[[patches]]
[patches.pattern]
target = '''=[SMODS Mossed "mossed.lua"]'''
pattern = """if card.area.config.collection then"""
position = "before"
payload = """
if not card then
  return { vars = { card.edition.extra.upgrade, card.edition.extra.sell_up } }
end"""
overwrite = true
match_indent = true

is this how crossmod patches work again (it's not working)

daring fern
shell timber
#

no but JokerDisplay works

#

oh what mossed worked

daring fern
shell timber
#

ah

heady siren
#

It begins

tall wharf
heady siren
#

Why am I able to make hard things but the second I need to make simple things my brain dies?

native zinc
#

you expect yourself to do the easy things so you put pressure on yourself to make them faster

#

then you do worse work 🫠

heady siren
#

It is now possible to set the jokers to be disabled by the configs, which makes them greyed in the menu and that's it right now but later it'll actually remove them from pools and stuff

#

Also nice little particles [=

zealous glen
#

@shell tangle

heady siren
#

Was that the right someone?

#

I even made it so that if the card is disabled it won't even show up in the collection

#

Though it requires a restart

iron haven
#

um. guys?

#

I can't play cards.

daring fern
iron haven
#

or click on one.

daring fern
iron haven
#

still nothing.

#

oh now I can.

eager pendant
#

Could you please tell me how to implement e_mult without cryptid mod?

eager pendant
daring fern
eager pendant
eager pendant
manic rune
#

what do i need to do if i want to increase the money cap of The Hermit 🤔

#

do i take its ownership and use set_ability?

plain apex
#

this successfully retriggers adjacent jokers to this edition but just retriggers the scoring card with this edition when trying to do it for cards

SMODS.Edition({
    key = "Shockwaved",
    loc_txt = {
        name = "Shockwaved",
        text = {
            "{C:green}#1# in 3{} chance to retrigger adjacent cards",
            "Idea: BoiRowan",
        },
    },
    discovered = false,
    unlocked = true,
    shader = 'nitro',
    in_shop = true,
    weight = 0.5,
    extra_cost = 4,
    badge_colour = HEX("ea763e"),
    apply_to_float = true,

    loc_vars = function(self, info_queue, card)
        return {
            vars = { G.GAME.probabilities.normal }
        }
    end,

    calculate = function(self, card, context)
        -- Played card retriggers its adjacent played cards
        if context.repetition and context.cardarea == G.play then
            -- Find this card's index in the current play area
            local idx = nil
            for i, v in ipairs(G.play.cards) do
                if v == card then idx = i break end
            end
            if not idx then return end

            -- Define adjacent card references (safe bounds)
            local left = G.play.cards[idx - 1]
            local right = G.play.cards[idx + 1]

            local results = {}

            -- Attempt to retrigger left card
            if left and pseudorandom('shockwaved') < G.GAME.probabilities.normal / 3 then
                return {
                    message = localize('k_again_ex'),
                    repetitions = 1,
                    card = card
                }
            end

            -- Attempt to retrigger right card
            if right and pseudorandom('shockwaved') < G.GAME.probabilities.normal / 3 then
                return {
                    message = localize('k_again_ex'),
                    repetitions = 1,
                    card = card
                }
            end

            return results
        end

        -- Joker retrigger logic (if used by another Joker)
        if context.retrigger_joker_check and not context.retrigger_joker and context.other_card then
            local idx = nil
            for i, v in ipairs(G.jokers.cards) do
                if v == card then idx = i break end
            end
            if not idx then return end

            local left = G.jokers.cards[idx - 1]
            local right = G.jokers.cards[idx + 1]

            if context.other_card == left or context.other_card == right then
                if pseudorandom('shockwaved') < G.GAME.probabilities.normal / 3 then
                    return {
                        message = localize('k_again_ex'),
                        repetitions = 1,
                        card = card
                    }
                end
            end
        end
    end,
})
daring fern
#

I think.

heady siren
#

Unless you have a hidden external joker that retriggers them itself [=

plain apex
manic rune
#

how do i check whenever the hermit spawns in?

#

that includes tarot pack, shop, and such

plain apex
#

the idea if someones got a better idea for what it should do to playing cards

daring fern
manic rune
#

hmg

#

guess no one has the answer

#

and i havent figured out a way to do it effectively yet, hmmm

daring fern
manic rune
#

...do i really need to use a patch for that one, but that does sound good

slender island
#

why it doesnt show name and description?

manic rune
#

🥀

manic rune
slender island
manic rune
#

it should be j_(mod prefix)_(joker key)

daring fern
manic rune
#

this part

manic rune
eager pendant
#

What are the other parameters in talisman besides e_mult and what do they mean?

zealous glen
daring fern
manic rune
#

changing its config

daring fern
eager pendant
shell timber
#

the same ones exist for chips too

eager pendant
shell timber
#

so if you wanted My Awesome Joker that gives ^^^4 chips you would return eeechips = 4

daring fern
eager pendant
#

Roger that, thank you very much, I've only started doing this a week ago, I don't understand much yet, but which parameter in Joker is responsible for adding slots for using materials?

manic rune
bold gyro
#

I just made a patch for an "edition gate" for a Joker. How would I check that the Joker only spawns if there is a playing card with a specific edition in the deck?

manic rune
#

decided to just patch in this small line, hopefully wont cause any conflicts

eager pendant
zealous glen
shell timber
#

uh

zealous glen
#

Just change the config

shell timber
#

consumeable slots? joker slots?

zealous glen
#

Then also change existing Hermits

#

Future hermits should inherit the new value

#

I think

manic rune
#

thats true

zealous glen
#

Just keep in mind the old config will be reset when the game is loaded

eager pendant
zealous glen
#

So you’ll need to reup every existing Hermit

shell timber
#

there isn't a parameter that i remember, you'll have to use add_to_deck and remove_from_deck

manic rune
shell timber
#

like this lua add_to_deck = function(self, card, from_debuff) G.consumeables.config.card_limit = G.consumeables.config.card_limit + card.ability.extra end, remove_from_deck = function(self, card, from_debuff) G.consumeables.config.card_limit = G.consumeables.config.card_limit - card.ability.extra end

manic rune
#

oh actually, does SMODS.find_card hlp with tit

manic rune
#

tarot packs too

zealous glen
manic rune
#

crap

zealous glen
unborn bay
#

you can actually

#

though it does it before you open the pack

zealous glen
unborn bay
#

what if that isn't what you said

zealous glen
#

What if what you said was what I would have said if what I said was what you would have said I would have said if what you said was what I had said

manic rune
#

what is this cardarea called again, i forgot

wintry solar
#

G.pack_cards iirc

manic rune
#

thanks :p

#

i fucked up somewhere, but uh, progress

cobalt surge
manic rune
#

it changes all existing cards too, which is nice

cobalt surge
#

Progress tho

manic rune
#

true

eager pendant
#

What's the difference emult e_mult E_mult emult?

manic rune
#

none

#

its like xmult, x_mult

#

just different namings

daring heron
#

how do i fix this

#

im just tryna play modded balatro smh 😔

manic rune
#

thats likely beacuse the mod's missing something

daring heron
#

yeah, but i can't find what it's missing

eager pendant
#

What's the difference emult, e_mult, E_mult, emult?

cyan lagoon
#

why does this crash the game?

placid star
#

does anyone know if consumables can return +mult?

daring fern
rapid stag
manic rune
#

😭

manic rune
daring fern
manic rune
placid star
rapid stag
manic rune
#

even in loc vars, its still called card

#

but the naming shouldnt matter

rapid stag
#

oh, derp

daring fern
manic rune
#

my theory is that how they set up config = {extra = ...} is wrong

placid star
rapid stag
#

that's what i was about to say, yeah. i want to see their config table

manic rune
#

or that the joker existed in the run without the config table

rapid stag
#

oh right, it might be a load save test

manic rune
#

mhm

rapid stag
# cyan lagoon

does testing with a fresh instantiation of the joker still cause the crash?

manic rune
#

you should show us how you set up your config if it still does

daring fern
cyan lagoon
manic rune
#

-# i meant the one thats inside your joker's code

cyan lagoon
#

it's the same there

manic rune
#

did you try starting a new run?

cyan lagoon
#

that's how i did config everywhere

cyan lagoon
manic rune
#

i see

#

weird, everything looks right

my only theory is that config is set up incorrectly, but since you claim it to be correct then i dunno whats wrong

cyan lagoon
#

it works just fine if i use G.P_CENTERS.j_key

#

but that includes info_queue of the joker i put into that info_queue

rapid stag
#

wasn't there a fake_card argument you could use for this purpose

#

i forget what the thing was

placid star
daring fern
placid star
wintry solar
#

Show code

daring fern
placid star
placid star
wintry solar
#

Does lua handle ^?

placid star
#

yeah i searched and it does

#

it works in a joker aswell

#

but just not in a consumeables

faint yacht
#

My Tom Scott Joker uses ^ too.

#

local curxmult = card.ability.extra.basexmult ^ toga_calccopiesofself(card.config.center.key)
is better than screenshot, oop.

wintry solar
#

Is the consumable in the normal area?

placid star
#

oh shit

daring fern
wintry solar
#

That would be why 😂

placid star
#

fuckk

#

yeah that would help

#

how would one add a patcj for that?

cyan lagoon
#

how do i make this affect jokers with a specific key?

red flower
#

context.other_card.config.center.key == "key"

cyan lagoon
#

can i make like a table of jokers and plug it in there somehow?

red flower
#

you can iterate through the list and return if any matches the key

placid star
unborn bay
#

a reminder that eventually in your balala modding life you eventually have to embrace the lovely patch

placid star
red flower
#

this is one of the cases where there is no practical alternative

eager pendant
#

How to make Joker pro availability add +2 slots Consumables?

placid star
red flower
#

you can just copy the manifest at the top and the patch i linked you and just replace my area with yours

rapid stag
#

yeah, .tomls are basically just a bunch of little wrappers that you stick lua in. mini injectors

placid star
#

do i have to call them in my main.lua file?

red flower
#

no

#

it needs to either be called "lovely.toml" and be in the root folder or be in a "lovely" folder

eager pendant
#

How to make Joker pro availability add +2 slots Consumables?

red flower
eager pendant
red flower
#

if yes then

add_to_deck = function(self, card, from_debuff)
    G.consumeables.config.card_limit = G.consumeables.config.card_limit + 2
end

and do the opposite in remove_from_deck

placid star
eager pendant
red flower
#

you can just do table.insert(t, your_area)

red flower
placid star
red flower
#

G.domain but yes

#

oh wait no

#

without the if

#

table.insert(t,G.domain)

placid star
#

so like this?

red flower
#

yeah

placid star
#

that seems... to simple...

red flower
#

it is

#

the TARGET comment is literally to make it simple

placid star
#

so what does your code do? since yours contains a if statement

red flower
#

if the mod has conflicts and smods disables it it doesn't disable the lovely patches (contrary to disabling it manually) so I do a check so the game doesn't crash in that case

#

but it doesnt really matter

#

also JoyousSpring.field_spell_area is an alias for G.joy_field_spell_area

heady siren
# tall wharf what the fuck

Here's the code for this by the way, I just yoinked some of the base game collection code and shoved in my own jokers

daring fern
heady siren
#

The aether_jokers table just separates my jokers by rarity without the j_prefix_ part

heady siren
daring fern
heady siren
#

If it works with it then it works with it, but won't require it

#

Disabling a joker just removes it from the spawn pool and collection

zealous glen
#

isn’t banner the discard joker

heady siren
#

Even Handy is named after the tag

glad osprey
#

still upset @scarlet thorn won't name better tags diet cola

zealous glen
#

I hadn’t hear of it

glad osprey
heady siren
#

I just need better names for my jokers because I sucks at naming things period

placid star
#

is there a way to detect when Xmult scores?

daring fern
scarlet thorn
glad osprey
#

nuh uh

#

perfect name

manic rune
#

i agree with squid

cyan lagoon
#

how do i make custom rules for challenges?

daring fern
#

Is there a way to prevent playing cards from being destroyed?

wet sand
#

i think names should at least attempt to be descriptive in some way shape or form for a mod and naming them after cards doesnt really do that

native zinc
wet sand
#

my cool new mod 8 of Hearts. it adds 2 quintillion jokers and none of them are worth your time

native zinc
#

straight from my mod

shell timber
#

talisman is a descriptive name because it is cursed and breaks several mods

native zinc
#

go wild i guess

native zinc
#

maybe

#

i don't actually know

#

hm

thin anchor
#

would this be correct for a consumable

daring fern
thin anchor
#

no

daring fern
thin anchor
#

mm ok

brisk rose
#

it's one thing if you're talking about qol mods, a complete nother with content mods

#

but I personally like quirky mod names even then like Malverk and Galdur, for instance

#

0 descriptiveness, but unique and memorable

#

And that's it when it comes down to it, I think Diet Cola actually would be a far more memorable name than Better tags or whatever it's called

#

but if the dev doesn't like it then fair

glad osprey
#

this is every hand right

shell timber
#

oh that's nice

#

yeah there's 12 hands

glad osprey
#

are all of them recognizable

shell timber
#

highcard, pair, 3oak, 4oak, 5oak, flush 5
two pair, full house, flush house, sflush(?), straight(?), uh

#

those are probably wrong

#

i like the idea though

glad osprey
#

flush straight straight flush

thin anchor
#

ok so how would i list the chance of the effect happening (the 1 in 3) correctly
what i mean is that i want the 1 to be 2 if you have oops all sixes

glad osprey
#

#2#

thin anchor
#

oh

glad osprey
#

thats how you use loc_vars in text

hard needle
glad osprey
#

im not making tags

#

is for rougelite

thin anchor
thin anchor
#

em

glad osprey
#

you may be lucky

hard needle
#

it should be config={extra={odds=3,mult=15}}

glad osprey
#

i dont see any issue but

glad osprey
thin anchor
#

hmhnhmh

hard needle
#

💀 i just automatically assumed they were using extra what is wrong with me

thin anchor
#

its an enhancement

#

if you didnt see

hushed field
#

1/3 is such high odds that you'll definitely get strings of luck that may seem buggy

hard needle
#

make it like

#

1 in 289-4353490583094583049-5834095809485 0957645t89y5u4 or something

#

and then maek it 1 in 1

#

to make sure it works

thin anchor
#

very goog odds

#

more rare than cavendish dying!

glad osprey
#

evil fucked up double tag

shell timber
#

Half Tag

glad osprey
#

starts run with one double tag

zealous glen
#

Grurple

thin anchor
#

ok lets see

glad osprey
#

oh wait

#

i see the issue

#

you set the cards base mult

#

so it will always be 15 mult

#

and then when you hit that chance itll happen again

thin anchor
#

oh.

glad osprey
#

so yea do config.extra.mult

thin anchor
glad osprey
#

yea

thin anchor
#

thumbs

placid star
#

what would be the G.P_CENTERS for a custom seal?

daring fern
thin anchor
#

it crashes and displays odds as "nil"

quartz ravine
#

Does someone have an example of setting the flavor text for a booster pack? In my store, when I open my custom packs, they say 'error'

glad osprey
placid star
#

is it not centers in loc vars?

thin anchor
#

i can be very mad at myself for not knowing such simple things

red flower
hushed field
#

you use the group key and define it in dictionary

glad osprey
#

starting hand and discard

hushed field
#

what are you working on squid?

red flower
#

plusle and minunle

glad osprey
hushed field
#

😊

#

you're changing balatro from a like into a lite?

glad osprey
#

yes

hushed field
#

oh, what are you changing?

quartz ravine
# hushed field

Thanks Ice! BTW i love your booster packs for Ash blossom. You nailed it!

glad osprey
#

perks that apply for the entire run

#

that you unlock outside of runs

hushed field
#

I wanna make more at some point, so that they don't share art between mega and jumbo

#

but yugioh designs are complex

quartz ravine
glad osprey
#
  • hand size :D
hushed field
quartz ravine
thin anchor
#

i love purple

hushed field
glad osprey
#

consumable slots...

thin anchor
#

urbl

quartz ravine
#

Sorry @hushed field , this is what I was trying to rectify!

#

This Error text

hushed field
glad osprey
#

what colour are legendary jokers

quartz ravine
#

ohhhh I was doing it by the booster key, not the group key!

hushed field
#

booster key is for the individual tooltips

red flower
hushed field
#

the groupkey is for this part of the ui

red flower
glad osprey
#

start run with a legendary joker

#

takes up all five perk slots

quartz ravine
glad osprey
quartz ravine
#

Fixed an error!

hushed field
#

reloaded a save probably

glad osprey
#

...okay

quartz ravine
#

oh god wtf

hushed field
#

base balatro can already have that bug, haha

glad osprey
#

did it take you that long to realize 😭

thin anchor
#

silly question
i swear ive done it before but ive forgotten
how would i apply size and color to this bottom string

glad osprey
#

do {C:inactive}

#

it applys size too i think?????

limber aspen
#

How does other_card work?
Is context.other_card:is_face() correct usage?

red flower
thin anchor
#

that worked
i just had a space inbetween those 2

icy oak
#

does this mean stakes applied go in order of lowest to highest or highest to lowest

limber aspen
glad osprey
#

thats not a context

#

thats a card area

limber aspen
#

Oh

red flower
quartz ravine
#

Thanks again Ice!

glad osprey
#

shinies

#

seems better

quartz ravine
#

thanks!

#

SHINE

glad osprey
#

technically there isnt a plural of shiny but thats the best

quartz ravine
glad osprey
#

i dont speak german

#

oh wait thats norwegian

quartz ravine
#

I have a card who will proc and kill a card to trim your hand, I have been trying to determine how to add an arbitrary texture to a ui pane for a moment so I can render the shinu kanji. A call back to Rune's Spell in Phantasy Star IV where he does this

limber aspen
#

What is context for played cards?

red flower
#

context.individual and context.cardarea == G.play

rapid stag
#

is there a way to partially redraw a played hand back to hand?
like say i play 5 cards, but i want a specific card to come back to the hand after being played

limber aspen
#

Thanks!

manic rune
#

where tf is the empress code 😭

red flower
#

arent they all in use_consumeable

manic rune
#

nvm, i had to boot up balatro

#

for some reason some files didnt appear in dump

#

i

manic rune
#

😭

#

it nvm

#

i think its something like that, the empress is grouped with the other tarot cards that change enhancements

glad osprey
#

its just a consumable config thingy

#

same with the suit changes

red flower
#

yeah mod_conv

daring fern
# rapid stag bump

Maybe hook G.FUNCS.draw_from_play_to_discard and send it to hand instead?

pale venture
#

How do you make a global function to check if a blind is beaten? i thought you could just create a function in G.FUNCS with e as argument but it doesn't seem to be the case

glad osprey
#

elaborate

manic rune
pale venture
#

I want to check whether the player beats a specific boss blind, and i've got the if statements down, not sure how to call it every frame

pale venture
manic rune
#

ah

#

hook to end_round then

glad osprey
manic rune
#

^

pale venture
#

nvm it doesn't need to be tbf

glad osprey
#

just have it return a bool for whatever blind it receives

#

or a table of all beaten blinds

manic rune
#

please dont think of update as your first solution unless it really requires that lol

red flower
glad osprey
#

depending on what you plan on using

manic rune
#

i would actually die out of humiliation if N' were to send me that ngl

pale venture
#

i just did lol

manic rune
#

🥀

red flower
#

i mean it's just advice for future questions

worthy stirrup
#

How do i make it so my joker has the bottom part of the tag switching out like cryptid?

manic rune
#

man im still so dumb

glad osprey
#

copy cryptids code because thats always a good idea

manic rune
#

🥀

glad osprey
#

no problems have ever stemmed from copying cryptids code

glad osprey
#

none at all

#

nada

worthy stirrup
#

sorry caps

glad osprey
#

zed

manic rune
#

tbf mathisfun knows exactly what hes doing
-# most of the time

#

so while cryptid's code looks scary as hell, i think its not too bad :p

glad osprey
#

yea with cryptid

manic rune
#

we dont talk about talisman

glad osprey
#

but most of cryptid is built around most of cryptid so that leads to many a issues

manic rune
#

does this make the empress more useful

red flower
#

the problem with cryptid is too many cooks

manic rune
#

or should i bump up the mult increase to +10

glad osprey
#

to 6 so that it ends on an even 10

red flower
#

i think +5 is fine

manic rune
glad osprey
#

ah

manic rune
tepid crow
pale venture
#

hooking end_round works for what i was doing btw, thanks

#

though it doesn't seem like i can edit things about it on the fly the same way one would do with cards

daring fern
#

How would one prevent a playing card from being destroyed?

wintry solar
#

I think the best way currently is to give it a property and then hook dissolve and shatter to ignore cards with that property

glad osprey
#

also give them a nope message obv

worthy stirrup
#

Today I learned Crytid has part of the bee movie in its crash log

glad osprey
#

yea

rapid stag
#

based

#

ok, so i want to hook G.FUNCS.draw_from_play_to_discard(). what's the most efficient way to be like "hey, if X joker is not present, just continue on with the original functionality"

worthy stirrup
worthy stirrup
#

ah

rapid stag
#

i really wish that the G.jokers area had like, a parallel table that was just all keys of present jokers in order, so i could go if aforementionedTable['my_joker_key'] then

manic rune
#

you can use SMODS.find_card, it tells you if the joker/consumable exists in their area

wintry solar
#

That’s exactly what find card does for you

rapid stag
#

...have i mentioned how much i LOVE reinventing the wheel

manic rune
glad osprey
manic rune
#

😭

rapid stag
#

i may be stupid

manic rune
#

oh yeah, something nice to know is that #SMODS.find_card("key") also return how many instances of that card exist, i think
-# i faintly remember someone saying so

red flower
manic rune
#

:3

glad osprey
wintry solar
#

We could probably repurpose the used_jokers table to do something like that

rapid stag
#

i mean, i knew find_card() existed, i just for some reason had it in my head that it's not something that should be used with significant frequency

glad osprey
#

so if you just want to check if the card exists do if SMODS.find_card()[1]

wintry solar
#

next(SMODS.find_card()) is more efficient iirc

red flower
#

or next

wintry solar
#

Or is it that using the index will crash when it’s empty

#

That seems likely

glad osprey
#

whats next do

glad osprey
worthy stirrup
#

Just to be sure, this is correct? I mean it looks correct in game but I dont know if i somehow implemented it wrong

placid star
#

so im trying to make a joker that turns any scored cards with seals into my custom seal but its not working...

red flower
manic rune
rapid stag
# glad osprey whats next do

next just looks at whatever thing is next in the table. it can take a second argument, which iirc it expects to be a table index

manic rune
#

also

manic rune
#

context.other_card, not other_card

#

dang it

glad osprey
#

context.other_card

hardy viper
manic rune
#

i need suggestions on how to buff wild cards

#

:3

red flower
#

treated as every rank

rapid stag
manic rune
#

quantum rank technology is too hard for me

red flower
#

make quantum ranks real

manic rune
#

😭 HOW

worthy stirrup
#

Okay, one last question for now, how do I hide the mod tag. I want it to just be the game its from

manic rune
#

i cant just magically make :get_id() == 13 works with a seven of spades 😭

maiden river
#

did you ever do this btw

daring fern
#

What's the difference between card.seal and card.ability.seal?

wintry solar
rapid stag
manic rune
#

god

maiden river
worthy stirrup
#

under the card, it says what mod its from, how can i remove that within the code

hardy viper
glad osprey
manic rune
#

do i just

#

bump the selection limit to 5 or something

#

😭

glad osprey
#

yea

daring fern
placid star
manic rune
#

nop

#

i mean

#

why dont you just do for i,v in ipairs(G.play.cards) at that point

placid star
#

cause like i dont understand that

manic rune
#

uh

worthy stirrup
#

like this?

hardy viper
# hardy viper order doesn't matter but it still needs to check the full structure to be sure t...

if you had a structure and were asked to return a random value in that array or nothing if it's empty, you would traverse the structure to find some value you can return. to know you can safely assume you can return nothing, you need to traverse the entire structure
however if you're asked to return the element at some certain position in a structure you'll just check whether there's something in that position and you can safely return nothing immediately then

manic rune
#

think of it like this, G.play.cards is just a table containing all played cards, from left to right

wintry solar
manic rune
placid star
manic rune
#

"please check this table from the first value to the last value"

#
local hi = {9,5,3,9,5,9,3}

for i,v in ipairs(hi) do
  print(v)
end

9
5
3
9
5
9
3

placid star
manic rune
#

mhm

placid star
#

meaning i could check it for seals?

manic rune
#

yes

placid star
#

ah okay ty!!

faint yacht
#

ipairs will only do value ranges without breaks. [1] = true, [2] = true, [3] = true, [5] = true will only do the first 3.

manic rune
#

yeah, that

wintry solar
#

What a fun feature!

manic rune
#

truly

worthy stirrup
#

is there a way to just have it be the text only and no blue part?

    set_badges = function(self, card, badges)
        badges[#badges+1] = create_badge('Femtanyl', G.C.BLUE, G.C.GREY,  1)
    end,
red flower
#

G.C.CLEAR instead of blue?

worthy stirrup
#

is clear even one

placid star
#

wow guys, what a useful feature! i truly do love modding balatro, the hit indie title and game of the year nominee!

red flower
#

yes

rapid stag
#

yes

manic rune
worthy stirrup
#

oh

manic rune
#

my first plan was to hook to is_suit(), but that makes jokers which check for suits fucked

worthy stirrup
#

thank yall

wintry solar
#

I think you’d need to override is_suit to add an extra flag to it for when the blind is doing it’s checks

manic rune
#

oh, its possible to do that?

#

-# or alternatively, i could just make wild cards unaffected by debuffs completely, but why do i feel like a joker already has that effect

faint yacht
#

You can do a lot with a simple hook, including replacing the function outright for the most part, but as it is a "hook", you are to call the original function. Replacing without referencing the original function is an override.

manic rune
#

yeah, i know that - i meant the flag part lol

maiden river
manic rune
#

fakj

#

HM

maiden river
#

technically, it's all enhanced cards, but still

wintry solar
#

Oh I 100% meant hook lol

#

It’s not very mod compatible though

manic rune
#

yeah, thats what im afraid of

#

i dont want to add a feature thats only compatible for vanilla blinds 🥀

wintry solar
#

You could it set a global flag instead

#

Oh modded blinds would be a nightmare I’d avoid them completely

manic rune
#

i dont like inconsistency..........

#

like, i will probably have to go with the effect: Can't be debuffed by (most) Boss Blinds

#

and i think it looks goofy 😭

wintry solar
#

You could just do wild cards can’t be debuffed

worthy stirrup
#

this might be a dumb question, are you able to put symbols into the joker names

wintry solar
#

That should be pretty simple

manic rune
#

true

#

wild cards still rely on modded jokers too much anyways, so i think thats fine

worthy stirrup
#

i was thinking of like a little heart symbol lol

red flower
#

my joker has a star in the name but the balatro font doesn't have that so you need a custom one to see it

manic rune
#

oh, i dont think so

worthy stirrup
#

damn

manic rune
#

-# you will need to add a new font i think

#

uh, what function is run to debuff a card again

#

:3

worthy stirrup
#

ill probably just skip on the heart, im prob releasing this mod and i dont want to force people to install a font for it

maiden river
#

you can't just package it with the mod?

manic rune
#

^

worthy stirrup
#

yea, but like, im lazy :3c

maiden river
#

😭

#

i should change my name to a context too

#

this is a good one

#

it's relevant to my struggle

manic rune
#

we can become calculate

#

:3

worthy stirrup
#

jokes on you

manic rune
#

not the localization...................

maiden river
#

i am become calculate, destroyer of mods

#

actually I have a better nickname

worthy stirrup
#

they call me context.cardarea == G.play

placid star
#

uhh so this doesnt work, it doesnt even print true even with a hand with scored seals in it

wintry solar
#

New names are fun when you’re still identifiable

maiden river
#

true

placid star
#

also what happened to your names?? 😭

maiden river
#

we're becoming balatro

worthy stirrup
#

is there a way to get the polychrome text above it?

#

did my message send

manic rune
#

balala

worthy stirrup
#

olh

red flower
worthy stirrup
#

yea

placid star
red flower
#

oh or the badge

manic rune
#

i think they meant the badge

worthy stirrup
#

polychrome above the DDG

manic rune
#

yeah, the badge

red flower
manic rune
maiden river
placid star
manic rune
#

ah, i see

placid star
#

and i checked deja vu, it uses set_seal()

wintry solar
#

Remove the cardarea check

manic rune
#

also, you should use context.before instead

#

wait nvm u r

#

i thought that was context.individual for some reason 😭

#

feafeom ye, remove the cardarea part

placid star
#

ill try thattt

#

that worked...

manic rune
#

is this how i do it

#

actually, this currently doesnt help to un-debuff currently debuffed cards i think, hm

red flower
#

you can try doing something with context.debuff_card and prevent_debuff

manic rune
#

hmm

#

wait

#

what the hell is context.debuff_card??

red flower
#

new blind calc context

manic rune
#

oh

red flower
#

return debuff = true to debuff and prevent_debuff = true to undebuff

manic rune
#

ah icic, but i was mostly concerned about other sources

#

like jokers which debuff some playing cards

#

so even if you turn those cards into wild cards, i dont think they wil de-debuff themselves

red flower
#

that context ignores debuffs i think
but it only runs and the beginning of the blind i think so it wouldn't help if a joker does it in the middle

manic rune
#

crap

#

hm

#

another idea is that when you use The Lovers, it de-debuffs selected cards too

#

doesnt help if they are turned to Wild Cards through other means though, hmmm, maybe i should hook to set_ability?

cyan lagoon
#

this is supposed to trigger on stone cards, but instead triggers on enhanced cards if stone is played

manic rune
#

you dont need to go through context.scoring_hand again

daring fern
manic rune
#

if context.cardarea == G.play and context.individual and SMODS.has_enhancement(context.other_card, "m_stone") then

faint yacht
#

SMODS.has_enhancement still calls SMODS.get_enhancements fwiw.

manic rune
cyan lagoon
#

damn, it's always that easy

#

thanks

manic rune