#💻・modding-dev

1 messages · Page 185 of 1

olive moth
#

:,,,,)

#

of course it doesn't work, i have no idea what i'm doing........

hushed field
#

you can just check whether a card has an edition already, right?

glad osprey
#

how would I make a sticker take away money like the rental sticker

olive moth
#

tried to rip self-destruction code off Gros michel/Cavendish, either crashes or does nothing

prisma loom
olive moth
#

someday i'll get it 🤞

wintry solar
#

You can look at how chameleon works in ortalab, that does something similar

ionic timber
#

a friend of mine wanted to try my mod

onyx sonnet
#

the adachi true invasion

ionic timber
#

he plays his theme everytime he scores

hushed field
onyx sonnet
#

@wintry solar for this joker here, is there a way to check for retriggers instead of regular scoring?

#

oop i forgot to paste

wintry solar
onyx sonnet
#
    key = "aroace",
    config = { extra = { repetitions = 0 } },
    unlocked = true,
    discovered = true, 
    blueprint_compat = true,
    eternal_compat = true,
    perishable_compat = true,
    rarity = 2,
    atlas = "NeatoJokers",
    pos = { x = 5, y = 0 },
    cost = 6,
    calculate = function(self, card, context)
        if context.cardarea == G.play and context.repetition and not context.repetition_only then
            if context.other_card:get_id() == 14 and context.other_card ~= context.scoring_hand[table.getn(context.scoring_hand)] then
                card.ability.extra.repetitions = card.ability.extra.repetitions + 1
            end
            if context.other_card == context.scoring_hand[table.getn(context.scoring_hand)] then
                rep = card.ability.extra.repetitions
                card.ability.extra.repetitions = 0
                return {
                    repetitions = rep,
                    card=self,
                }
            end
        end
    end
}```
wintry solar
#

Can you screenshot for mobile pls

onyx sonnet
#

okk

#

oh wait i just realized its probbaly the Not repetition thats stopping the retriggers from counting

prisma loom
#

not context.other_card.enhancement?

wintry solar
#

context.other_card.ability.set ~= “Enhanced”

prisma loom
#

thanks!

onyx sonnet
#

but it seems to ignore retriggers and only cares about the quantity of scored aces

wintry solar
#

Don’t check for repetition on the first block, check for individual

onyx sonnet
#

so just context.individual

#

?

prisma loom
wintry solar
#

And the value check too

onyx sonnet
#

oh thank you very much!!

olive moth
#

and back to our regular rubric "Sophie asking the most obvious questions"

#

how do i make a joker self-destruct 😭

#

what do i call

wintry solar
#

joker:start_dissolve()

olive moth
#

YAAAAY

#

TY

onyx sonnet
wintry solar
#

The repetition context is called once per card to check for how many further triggers to do, individual is called every time the card triggers, so to count triggers you want to increment your counter within the individual context

#

You still need the check for an ace that you already had though

minor furnace
#

is there a prefix for adding a custom sticker center to the infoqueue, like how enhancements take m_ or tarots/planets take c_?

minor magnet
#

i am bumping this again even tho i said i wouldnt because i just can't figure it out and it's literally the last piece im missing for completing the most complex joker i've ever made

onyx sonnet
minor magnet
#

set should be other

minor furnace
#

I'm not sure I follow

minor magnet
#

info_queue[#info_queue+1] = {set = "Other", key = "perishable", specific_vars = {}}

#

should work

minor furnace
#

and so I just replace "perishable" with whatever the name of my custom sticker is?

limpid wing
#

I will ask again, what is the key word for change the atlas for tarots, planets and spectral cards

minor magnet
limpid wing
#

but what is the one for the consumable atlas

minor furnace
limpid wing
#

i was thinking its "Tarot" but that dont work

glad osprey
#

how would i force a consumeable to be unusable

#

like judgement without any joker space

minor furnace
#

except with a condition on how to use it and when to return true or false

minor furnace
#

just had to make it key = "prefix_stickerName"

glad osprey
minor furnace
#

does the consumable have the sticker on it, or does the target card have the sticker?

glad osprey
#

consumable

minor furnace
#

I don't think I'm qualified to answer this one, I'm not sure how stickers are stored yet. This is my first time trying to implement something sticker-related

foggy carbon
#

can I change a joker's rarity dynamically? What I want to do is make my fusions have the default fusion rarity unless the player has DeFused installed, at which point they would have my pre-defined rarities for them

onyx sonnet
chrome widget
#

Is there a way to dynamically and selectively apply lovely patches? Would I literally just need to move the patches I don't want to be applied outside of the lovely folder and reload the mod?

chrome widget
#

How did you do it, Rot8er?

olive moth
#

Trying to add a self-destruct message to sisyphus :,>

minor furnace
#

one must imagine

olive moth
#

the developer happy

#

once again, the responsible code

#

also it plays the sound multiple times fsr (i'm guessing 13, once for every card turned gold, EVEN THOUGH IT SHOULDNT(?))

marsh basalt
#

I think it's executing for every card in hand

olive moth
#

...in deck

maiden phoenix
#

Your play_sound isnt in a context check

olive moth
#

...wait

marsh basalt
#

No, it is in the context check

#

Tabs are just weird

olive moth
#

yea

marsh basalt
#

Try adding not context.repetition into your context check

olive moth
#

wait no, hold up

#

it's not in the check

#

wait it is

#

i need to sleep

minor furnace
#

Does the loc_vars function require a different kind of return than for other objects? Because I don't think this should be giving nil

    key = "ephemeral",
    atlas = "New_Sticker",
    pos = {x = 4, y = 2},
    loc_txt = {
        name = "Ephemeral",
        text = {
            "Debuffed after",
            "{C:attention}#1#{} rounds",
            "Has no sell value",
            "{C:inactive}({C:attention}#2#{C:inactive} remaining)"
        }
    },
    default_compat = true,
    sets = {
        Joker = true
    },
    config = {
        extra = {
            total_turns = 3,
            current_turns = 3
        }
    },
    rate = 0,
    loc_vars = function(self, info_queue, center)
        return {vars = {center.ability.extra.total_turns, center.ability.extra.current_turns}}
    end,
}```
#

related question, are the values inside config mutable?

rose dragon
minor furnace
#

awesome

minor furnace
minor furnace
#

perfect, thanks

neat plover
#

when is the blueprint actually triggered

#

?

limpid halo
marsh basalt
#

Ooh that's a sick visual

chrome widget
#

oooh that's cool as shit

tepid crow
#

Yooo thats awesome

acoustic kernel
minor magnet
#

i give my soul to whoever can fix this

#

NO WAIT

#

I FIXED IT MYSELF LMAO IM AN IDIOT

wintry solar
minor magnet
wintry solar
neat plover
#

the holy trinity

#

in this world its copy or be copied

minor magnet
wintry solar
#

Wait

#

Can’t you just add the center?

olive moth
#

the machine spirit is unknowable in its ways (i have no idea how and why it worked but it did)

wintry solar
#

info_queue[#info_queue+1] = G.P_CENTERS[G.GAME.last_tarot_planet]

hushed field
olive moth
onyx sonnet
minor magnet
#

hermit code even if it doesn't matter since this happens with all tarots

foggy carbon
chrome widget
#

Ah, I see. Thank you!!

#

This might be useful in the future

wintry solar
grim remnant
#

so like, stupid question; how can i set up two if context.s, one for "after playing a hand" and one for "at the end of a boss blind"? my attempts managed to result in "after playing the last hand of a blind" and "Nothing™️", and the former is somehow proccing with our attempt at the latter somehow. (please pardon the excessive pseudocode for what we're planning to do later, first we just want to make sure the contexts Work And Are Good gsdjkhl)

onyx sonnet
minor magnet
wintry solar
#

yeah where you return the reps

minor magnet
wintry solar
minor magnet
wintry solar
#

what's the crash?

minor magnet
#

otherwise it just doesn't display the variables

wintry solar
#

hmmm

#

you could try patching in the info_Queues instead of taking ownership perhaps?

olive moth
#

yall, how do i make custom variables?
i know it's not really good practice, but i need a boolean variable that flips on once the decay animation/its sfx is played to make sure it's not repeated

#

and it just crashes when i try to make one up

onyx sonnet
minor magnet
#

took ownership of all other tarots but fool doesn't cooperate

glad osprey
#

how do i log tables

gray apex
#

Is there anything wrong with this patch file? The logs aren't turning up anything helpful...
The file is lovely.toml, and is placed in my mod's base directory, as per the instructions

[manifest]
version = "1.0.0"
dump_lua = true
priority = -9

[[patches]]
[patches.pattern]
target = "localization/en_us.lua"
pattern = '''name = "Chicot"'''
position = "at"
payload = '''name = "Lorem Ipsum"'''
match_indent = true
limpid halo
gray apex
#

Understood

#

I was having trouble with patching the misc_functions.lua file too, lemme grab the patch

#
version = "1.0.0"
dump_lua = true
priority = -9


[[patches]]
[patches.pattern]
target = "functions/main_functions.lua"
pattern = '''elseif not _c and char ~= '#' and not _s_gather then str_parts[str_it] = (str_parts[str_it] or '')..(control['X'] and char:gsub("%s+", "") or char)'''
position = "before"
payload = '''--'''
match_indent = true```
normal crest
#

you typed main instead of misc

olive moth
#

anywhere i put this, it crashes

gray apex
olive moth
minor magnet
normal crest
#

common_events.lua is under the functions directory

#

so you should target functions/common_events.lua

minor magnet
#

thank you!

#

i'll try

#

same crash as before, even with patches

#

@wintry solar

normal crest
#

Also find_joker doesn't work with keys

#

use SMODS.find_card

minor magnet
normal crest
#

What's on unleashed_tarots.lua at line 39

minor magnet
#

it's the return for hermit

minor magnet
#

it also happens with other tarots which return variables

#

the crash only happens when The Fool calls them as info_queues, not on the tarots themselves

minor furnace
#

I assume if I want any sort of behavior for my custom stickers I'm going to need to use Lovely injections?

minor magnet
#

fuck it imma dump the ownership and rewrite everything as patches

olive moth
#

okayyy, all the visual/audio fluff is finally done

#

imma call it a day for today, thank yall who helped me🥹

glad osprey
#

wheres the code for the stake stickers

#

(eternal, perishable, rental)

minor furnace
#

I believe in card.lua

#

on a related note, how do I force my custom sticker to be added to a Joker I've forced to be created?

#

I already have the joker creation done

neat plover
#

question: how would someone create a new seal or edition?

glad osprey
#

ok new question does anyone know how to not allow a sticker to apply to a card with another sticker

glad osprey
normal crest
#

you can add a stickers field that is a list of stickers by their keys

minor furnace
#

I used create_card

#

I'll check the fields again then

normal crest
#

stickers = { 'eternal', 'rental' } for example

glad osprey
#

(sticker keys are <mod prefix>_<sticker key> btw)

minor magnet
#

i am challenging the gods by running into concrete walls

neat plover
glad osprey
#

yes that is what those links are for

#

did you even look at them

neat plover
#

no i wanted to clarify before

glad osprey
#

ah alr

minor furnace
wintry solar
#

any other shop functionality requests before I finish off this update?

minor furnace
#

ah I guess I should be looking in the Lovely dump then?

frosty dock
#

SMODS.create_card and SMODS.add_card are wrappers around that function that take a single table as argument

#

for those you can just look at the docs

glad osprey
#

you know what i cant read the docs for i think

#

how to make stickers incompatable with eachother

dreamy thunder
#

bump

frosty dock
glad osprey
#

that would explain it yes

frosty dock
#

you can set a should_apply function on both, but that doesn't get you the exact incompatibility that eternal and perishable share

zealous glen
#

idk where but add it

frosty dock
#

sure

glad osprey
#

like what next

wintry solar
#

return true when you want to apply

#

return false when you dont

glad osprey
#

how do i integrate the original true or false of it tho

#

do i just gotta remake that

frosty dock
#

I don't remember there being a base implementation on that

#

lemme check

#

no there totally is

glad osprey
#

just like how do i check whether or not it rolled succesfully to be added

frosty dock
#

you can call the base with SMODS.Sticker.should_apply(self, card, center, area, bypass_roll)

glad osprey
#

oh i can just put that in there?

minor furnace
# frosty dock SMODS.create_card and SMODS.add_card are wrappers around that function that take...

this the function in question?

    if not t.area and t.key and G.P_CENTERS[t.key] then
        t.area = G.P_CENTERS[t.key].consumeable and G.consumeables or G.P_CENTERS[t.key].set == 'Joker' and G.jokers
    end
    if not t.area and not t.key and t.set and SMODS.ConsumableTypes[t.set] then
        t.area = G.consumeables
    end
    SMODS.bypass_create_card_edition = t.no_edition
    local _card = create_card(t.set, t.area, t.legendary, t.rarity, t.skip_materialize, t.soulable, t.key, t.key_append)
    SMODS.bypass_create_card_edition = nil

    -- Should this be restricted to only cards able to handle these
    -- or should that be left to the person calling SMODS.create_card to use it correctly? 
    if t.edition then _card:set_edition(t.edition) end
    if t.enhancement then _card:set_ability(G.P_CENTERS[t.enhancement]) end
    if t.seal then _card:set_seal(t.seal) end
    if t.stickers then 
        for i, v in ipairs(t.stickers) do
            local s = SMODS.Stickers[v]
            if not s or type(s.should_apply) ~= 'function' or s:should_apply(_card, t.area, true) then
                SMODS.Stickers[v]:apply(_card, true)
            end
        end
    end

    return _card
end```
#

I think I can piece back together how to format it from here

minor furnace
hushed field
#

I've been looking around the code but I haven't found an approach that I love. What'd be the best way to go about creating consumables that when used do something based on your next hand? My current approach would be to have them spawn tags, but I'm sure that there's a leaner approach

glad osprey
#

next hand?

frosty dock
glad osprey
#

alr cool

glad osprey
#

why didnt it work :(

hushed field
onyx sonnet
#

dont you mean ranks?

grim remnant
limpid halo
onyx sonnet
#

yeah but those "symbols" are called ranks

limpid halo
#

it can be a suit, # or 🧑‍🦱 too

onyx sonnet
#

oh hm

#

i guess symbol works well then?

#

its a complex joker it makes sense that explaining it is hard

limpid halo
#

yeah fair

minor furnace
#

Ok so this creates the card exactly as I want, except without the sticker
local new_card = SMODS.create_card({area = G.jokers, set = "Joker", stickers = {'reverse_ephemeral'}, edition = 'e_negative'})

frosty dock
wintry solar
#

stickers seem pretty jank still tbh

frosty dock
#

you'd need the should_apply of all involved stickers involved to make them incompatible. With only your sticker having the changed should_apply, eternal and perishable can still happen if they do so after your sticker

frosty dock
#

they've been on my to-do for a bit, I should work on them soon(-ish)

#

I'd recommend not to bother with the current system until there's something better I think

glad osprey
frosty dock
#

that will make them perishable and eternal

glad osprey
#

dammit

dreamy thunder
#

still need help here

frosty dock
#

basically what I'm saying is this

#

your apply check does nothing after your sticker is applied

#

so if the card first gets your sticker, it can still become eternal

glad osprey
#

yea i understand that im just trying to make eternal and perishable not apply aswell

#

would ownership or hooking be the next best thing then?

frosty dock
#

yeah but iirc they're in a bit of a weird spot with being hardcoded to be incompatible from being on the same chance roll

glad osprey
#

.

frosty dock
#

I will work on making a better API for this either way, it's easiest to just wait for that

prisma loom
#

So I want the joker to give a card a random edition if your first hand of round is a single enhanced card. Is everything correct? Game doesnt crash but the joker doesnt work

minor magnet
#

can anyone tell me why this patch isn't applying?

glad osprey
#

yea i will update it when that gets added but for now i really wanna make this lol

dim lynx
#

thanks for all your hard work john smods

frosty dock
#

you'll save yourself some work by not doing it just yet, once it's implemented properly it will be very easy

glad osprey
#

i literally have nothing better to do

prisma loom
#

is this correct?
context.other_card.ability.set ~= "Enhanced"

minor magnet
frosty dock
#

it does not account for there being any quantum enhancements of base cards though

prisma loom
#

I thought it checks for enhancement

#

not the lack of it

glad osprey
#

~=

prisma loom
#

ahhh

frosty dock
#

you put ~=, which reads not equals

prisma loom
#

ic ic

glad osprey
#

should be == if you are looking for equals

minor magnet
hushed field
#

what exactly are quantum enhancements? is it just functionality for jokers that would say 'all 7s count as Steel cards'?

prisma loom
#

didnt notice tilda

glad osprey
frosty dock
#

to account for quantum enhancements, use next(SMODS.get_enhancements(card)) or its inverse

hushed field
frosty dock
minor magnet
prisma loom
glad osprey
#

how do i disable a sticker if the stakes are black or higher

frosty dock
#

set a flag in G.GAME and check for it in should_apply or use a built-in enable flag that is on by default and set to false when black stake is applied

minor magnet
frosty dock
#

oh 1308a

wintry solar
#

oh I think this is before fake cards were added right?

frosty dock
#

you need to update smods

minor magnet
#

i love you john smods

#

it works now

wintry solar
frosty dock
#

will test and review it tmr if that's okay

prisma loom
#

So I wanna add 3 tooltips (one for each edition) for my joker. Is this correct?

#

I fkd up something didnt i

frosty dock
#

what's in the dumps where the crash points to, I'm not sure how that relates

frosty dock
#

I didn't ask for the full crash

prisma loom
#

dumps?

frosty dock
#

I want to see what is around line 2827 in functions/common_events.lua in your lovely dumps

#

I already turned off my PC and I'm too lazy to get back on it

#

besides you're not on latest smods so the line numbers would be different either way

prisma loom
#

nvm! I've mismatched code when copy pasting it

#

my bad

#

all works

frosty dock
#

mkay

wintry solar
prisma loom
#

sorry how often it's updated?

frosty dock
#

always

#

there's new commits almost every day haha

prisma loom
#

I trust you on that jonh SMODS

frosty dock
#

I only know of one jonh around here

#

and that's Jonh DebugPkus

prisma loom
#

lmao

#

sorry for wrong splelling

#

im a bit dizzy rn

frosty dock
#

I won't judge you if you can't dpell

#

I'll just make fun of you 🤪

prisma loom
#

Also, again big thanks to all ya folks for helping me out. This is the progress so far

frosty dock
prisma loom
#

I can relate

#

Just passed winter session

#

on the finish line rn

frosty dock
#

gl with that

prisma loom
#

same to you

frosty dock
#

ty

glad osprey
#

is this how i would hook end_round in state_events.lua

frosty dock
#

yeah looks good from what I can see

glad osprey
wintry solar
#

you could throw that in a consumable calculate function too so it doesnt check every round regardless of if you have them or not

frosty dock
glad osprey
#

debuffed consumables stickers dont get calculated

frosty dock
#

throw a local card = G.consumeables.cards[i] in there

wintry solar
#

oh that is a good point I didn't pick that up from your code 🤣

frosty dock
#

or replace the for loop line with for _, card in ipairs(G.consumeables.cards) do

hushed field
#

hmm, all of a sudden doubt is back and I'm not sure whether tags are the most eloquent solution 🤔

glad osprey
#

whats the G.area for booster packs

#

like the cards that come from booster packs

wintry solar
#

G.pack_cards

glad osprey
#

ty

#

how did i fuck this up

#

oh waiyt

#

tharts how

#

area not card.area lol

hushed field
#

If a tag has an Apply that does something in the right context, but doesn't return tag:yep, does it just not get rid of the tag?

unkempt thicket
#

How can I iterate though each joker checking to see if it has a specific variable (i know how to iterate though each joker in G.joker.cards, but i want to iterate though each joker in the collection before a run is started)

hushed field
#

what variable are you looking for?

unkempt thicket
#

its a custom one, stored in each joker if added

glad osprey
#

how would one change what sprite is used for the card here specifically

hushed field
unkempt thicket
vestal ore
#

how would i change the back sprite of a custom joker when it flips over on amber acorn?

hushed field
vestal ore
vestal ore
#

square joker

unkempt thicket
#

It wont be used on base jokers

chrome widget
#

Am I able to just change the global color table to add a color to it at any time, or do I have to do something specific? I remember having issues attempting to add a different global value to the game before and ended up having ot patch it into game.lua in the main_menu() function

unkempt thicket
chrome widget
#

How could I use a deck to increase the rates of mod-specific jokers?

#

The docs for backs/decks includes in_pool(), but with exactly the same description that most of the other Centers have, which tends to specify how that card specifically (I.E. the deck as a card) could spawn

minor magnet
#

how do i get position in hand of current card being scored? (context.individual)

hushed field
#

iterate over the hand and check if it matches card

minor magnet
#

many thanks

lean dew
#

where should i look for sprite dumps from the vanilla game? is there a pinned post for it somewhere?

vestal ore
#

balatro.exe can be renamed to balatro.zip and you can extract the resources folder inside and then set it back to .exe

lean dew
#

is this an admin permissions thing? because renaming the file doesn't change its internal properties

#

at least not on my end

twilit cargo
#

afaik they're all on spriters resource

glad osprey
lean dew
limpid halo
#

if you have 7-zip you can also just right click balatro.exe and 7-zip > open archive

modern kindle
#

im trying to make a joker so that if you skip blinds then itll send you to the shop, i have its functionality mostly working with the one issue of any of the packs, if one opens it wont send me to the shop

i tried utilizing g.game.pack_interrupt to make it wait, but that didnt seem tow ork
is there a way to check when any of those packs are currently being used?

minor magnet
ivory coral
#

simply problem here, i have a joker that has rng and also needs to display that side enhancement preview thing (like stone joker does for stone cards), how can i get loc_vars to do both? I tried just tossing in extra code:

        info_queue[#info_queue+1] = {set = 'Other', key = 'acrylic_info'},
        return {vars = {(G.GAME.probabilities.normal or 1), card.ability.extra.odds}} --1 in 4 normally
    end,```
but this just crashes (unexpected symbol near 'return')
normal crest
#

remove the comma right after 'acrylic_info'}

limpid halo
#

yo maybe stupid question but are custom rarities excluded from the shop by default? If not what pool do i need to supply to remove it them from the shop.

normal crest
limpid halo
#

ty

#

missed the default_weight one,

#

another silly thing, is it possible to add consumables to buffoon packs?

ivory coral
normal crest
#

(idk how it actually does it)

minor furnace
#

ok so my code accurately adds base game stickers to my created joker, it must be an issue with how I defined my custom one then

normal crest
#

did you define a should apply function

#

in your sticker

minor furnace
#

ah

#

no

#

let me try that real quick

normal crest
#

I don't think you need to define one

#

I don't know why your sticcker isn't applying

#

Would you be able to send your sticker definition

minor furnace
#

yeah

#
    key = "ephemeral",
    atlas = "New_Sticker",
    pos = {x = 4, y = 2},
    loc_txt = {
        name = "Ephemeral",
        text = {
            "Debuffed after",
            "{C:attention}#1#{} rounds",
            "Has no sell value",
            "{C:inactive}({C:attention}#2#{C:inactive} remaining)"
        }
    },
    default_compat = true,
    sets = {
        Joker = true
    },
    config = {
        extra = {
            total_turns = 3,
            turns_remaining = 3
        }
    },
    rate = 0,
    loc_vars = function(self, info_queue, center)
        return {vars = {center.ability.extra.total_turns, center.ability.extra.turns_remaining}}
    end,
    calculate = function(self, card, context)
        card.cost = 0
        if self.ability.extra.turns_remaining > 0 and context.end_of_round then
            self.ability.extra.turns_remaining = self.ability.extra.turns_remaining - 1
        end
        if self.ability.extra.turns_remaining <= 0 then
            card.debuff = true
        end
    end
}```
normal crest
#

I don't see why it would not spawn

#

Do you have debug plus

minor furnace
#

I do, maybe I could try adding a print somewhere

normal crest
#

try going ingame and spawning a joker with your sticker

#

and then do eval G.jokers.cards[1].ability and send a screenshot of what that shows

minor furnace
#

I may need help figuring out what the command to spawn the joker is

#

relatively new to modding in general

normal crest
#

eval SMODS.add_card { set = 'Joker', stickers = { 'reverse_ephemeral' } } I think reverse was your mod prefix, but if it isn't change it

#

put that in the debugplus console while ingame

minor furnace
#

yeah that's the prefix

#

and oh it's basically just the line I would normally write in the lua file?

normal crest
#

yeah with debug plus u can execute lua code like that

#

it's just to see what's going on with your joker when the sticker is applied

minor furnace
#

I got error : attempt to index local 'center' [a nil value]

minor furnace
#

yes

normal crest
#

that is odd

#

can you do eval SMODS.Stickers.reverse_ephemeral

minor furnace
# normal crest can you do `eval SMODS.Stickers.reverse_ephemeral`
INFO - [G] < Table:
loc_vars: function: 0x2a44be98
default_compat: true
_saved_d_u: true
original_key: ephemeral
sticker_sprite: Table:
  click_offset: Table:
    y: 0
    x: 0

  children: Table:

  sprite_pos: Table:
    y: 2
    x: 4

  T: Table:
    x: 0
    w: 2.0487804878049
    y: 0
    h: 2.7512195121951
    +2 more values.

  offset: Table:
    y: 0
    x: 0

  role: Table:
    xy_bond: Strong
    offset: Table:
      y: 0
      +1 more value.

    role_type: Major
    draw_major: Table:
      click_offset: table: 0x2a4a7818
      +34 more values.

    +3 more values.

  last_aligned: -1
  +28 more values.

loc_txt: Table:
  name_parsed: Table:
    1: Table:
      1: table: 0x2a5ee1f0


  text_parsed: Table:
    1: Table:
      1: table: 0x2a5ed668

    2: Table:
      1: table: 0x2a5ed868
      +1 more value.

    3: Table:
      1: table: 0x2a5edc60

    4: Table:
      1: table: 0x2a5ede10
      +2 more values.


  name: Ephemeral
  text: Table:
    1: Debuffed after
    2: {C:attention}#1#{} rounds
    3: Has no sell value
    4: {C:inactive}({C:attention}#2#{C:inactive} remaining)


registered: true
sets: Table:
  Joker: true

order: 5
calculate: function: 0x2a44beb8
rate: 0
pos: Table:
  y: 2
  x: 4

mod: Table:
  version: 1.0.0
  id: reverse_tarot
  main_file: reverse_tarot.lua
  lovely: true
  can_load: true
  badge_colour: Table:
    1: 0.058823529411765
    2: 0.87843137254902
    3: 0.83137254901961
    4: 1

  badge_text_colour: Table:
    1: 0.87843137254902
    2: 0.058823529411765
    3: 0.4078431372549
    4: 1

  +12 more values.

atlas: reverse_New_Sticker
prefix_config: Table:

key: reverse_ephemeral
config: Table:
  extra: Table:
    turns_remaining: 3
    total_turns: 3```
normal crest
#

huh

#

I assume you see your sticker in the collection

minor furnace
#

ah

#

it crashes when I hover over it so I think I messed up the text

normal crest
#

Oh

#

stickers don't apply their config to the cards they're in

#

at least not by default

#

so you should so self.config instead of center.ability

minor furnace
#

interesting, guess they're the exception to that then?

#

because I've been using center.ability for everything else

normal crest
#

yeah, i mean, stickers aren't a center

minor furnace
#

yk that would make sense

#

it doesn't crash now so that's good

normal crest
#

That said

minor furnace
#

still didn't apply to the joker though

normal crest
#

For that specific effect you probably want to attach information to the card itself

#

you should add this to your sticker

#

and do something like card.ability[self.key] = val and copy_table(self.config)

minor furnace
#

Thanks! I'll give it a shot

normal crest
#

Then, within your sticker loc_vars and calculate

#

You should access those values by doing card.ability[self.key].extra.turns_remaining for example

minor furnace
#

in this instance, self.key would just be reverse_ephemeral, right?

normal crest
#

Yeah

#

better to use self.key directly tho, if you ever decide to change the key later

minor furnace
#

good point

normal crest
#

or your mod prefix for that matter

minor furnace
#

yeah...

#

well the sticker's still not applying, at the very least visually

normal crest
#

Hm

#

okay one last idea, do eval SMODS.Stickers.reverse_ephemeral:apply(G.jokers.cards[1], true)

#

that should apply it to your first joker

#

so make sure you have one

limpid halo
#

Hmmm, set is required for consumable.. but I don't want it to appear in Tarot, planet or spectral packs.

minor furnace
#

it did in fact apply it

#

although I have an Error where the sticker name should be

normal crest
#

add label = "Something" to your loc_txt

normal crest
minor furnace
normal crest
#

worst case scenario you can do local joker = SMODS.add_card { set = 'Joker' } and then SMODS.Stickers.reverse_ephemeral:apply(joker, true)

minor furnace
#

honestly yeah I think that's the easiest solution

normal crest
#

it is incredibly weird to me that it's not working when you add the stickers to add_card, considering smods literally calls apply on it

#

unless you have an old version of smods where it's broken?

minor furnace
#

thank you for the help!

#

still have to test its functionality but I should hopefully be able to manage that

minor magnet
#

is there a way to trigger something on context.individual but only on the first trigger of a card?

limpid halo
minor magnet
normal crest
limpid halo
normal crest
#

well in create_card you just put set = key where key is whatever you put in your consumabletype key

#

it doesn't have your mod prefix added

limpid halo
#

Oh so it has no prefix then

#

got it

normal crest
#

personally i don't like that it's not added by default

limpid halo
#

Yeah thats weirdly inconsistent

normal crest
#

if you're like me you can add prefix_config = { key = true }, to its definition

#

and then it'll be prefixed

normal crest
normal crest
#

Oh nvm

#

I completely misunderstood

#

Sorry

minor furnace
#

Is there a full list of contexts somewhere? because it's not on the Calculate Functions page

normal crest
#

what context are you looking for?

minor furnace
#

an end of round, but when I use context.end_of_round it triggers the code inside of the conditional more than once

normal crest
#

Yeah that's because end_of_round is also called for each card held in hand with context.individual

#

you can add context.end_of_round and context.main_eval

#

I don't think that one is in the wiki, but i could be wrong

minor furnace
#

I believe you're right that it isn't there

wintry solar
#

it is but not specifically

#

main_eval is a part of every context

normal crest
#

it's mentioned at a note at the end of the page

#

maybe should have its own section considering how important it is

minor furnace
#

it does seem pretty important

#

Now I'm getting a strange interaction, the sticker is debuffing the Joker properly, but it gets un-debuffed when I enter the cash out screen, and re-debuffed after I perform another action like using a card, buying something from the shop, or exiting the shop

normal crest
#

What does your code look like now

scarlet spire
#

why does this happen
the visual bug with vampire is weird, but it looks even weirder when I have this custom joker that turns cards into stone cards??
vampire causes the ranks of stone cards to appear before the stone is removed, but then having the joker that turns them into stone cards makes the rank disappear again once the stone is removed... even though the joker ONLY triggers on context.after, and isn't in effect yet whatsoever

#

(here is the code that turns clubs cards into stone cards)

minor furnace
# normal crest What does your code look like now

these are the functions

        return {vars = {self.config.extra.total_turns, self.config.extra.turns_remaining}}
    end,
    apply = function(self, card, val)
        card.ability[self.key] = val and copy_table(self.config)
        card.base_cost = 0
        return
    end,
    calculate = function(self, card, context)
        if card.ability[self.key].extra.turns_remaining > 0 and context.end_of_round and context.main_eval then
            print(card.base_cost)
            print("end of round")
            card.ability[self.key].extra.turns_remaining = card.ability[self.key].extra.turns_remaining - 1
            print(card.ability[self.key].extra.turns_remaining)
        end
        if card.ability[self.key].extra.turns_remaining <= 0 then
            card:set_debuff(true)
        end
    end```
#

although I'll also need to figure out how to make the display of the rounds remaining update based on the card data too, since it always says 3/3 despite it updating the card.ability correctly

ionic timber
foggy carbon
#

that looks like Cryptid lol

ionic timber
#

my thought exactly lmao

long sun
#

ADACHIIIIIIIIIIIIIIIIIIIIII!!!!!!!!!

normal crest
normal crest
#

but I'm not sure what the exact problem is

minor furnace
normal crest
#

you forgot to access extra

#

remember center.ability[self.key] is a copy of your config

#

cus that's how you have it in apply

#

@minor furnace

minor furnace
#

ah shoot you're right

#

sure enough that fixed it

#

and this fixed the debuff issue

    SMODS.debuff_card(card, true, self)
end```
candid willow
#

Does anyone have a tutorial they can point me to on how to get started w/ Lua? Wanna try my hand at making a mod. I have a rudimentary understanding of Java and that's about it

minor furnace
#

I cannot for the life of me find what field I need to set for the background color of my sticker name

old bane
scarlet spire
#

the ranks showing before the stone is removed is vampire, but the ranks being completely gone when the stone is removed only happens when my joker is affecting those cards alongside vampire

minor furnace
old bane
old bane
scarlet spire
#

it looks completely normal used on it's own, again it only occurs when you have both vampire and this joker

maiden river
#

is there a way to tell when an ante was just started? I'm working on a deck that gives a joker every three antes

maiden river
hushed field
maiden river
#

I did consider that

#

but that doesn't really account for heiro/petroglyph

old bane
#

and then if you want hieroglyph to lower the counter you can probably detect that with the proper context

maiden river
#

true

#

I guess the counter method is the best way to go

old bane
#

idk how that would exactly work with decks but if it's possible for jokers it'll probably be simple enough for decks as well

maiden river
#

the only reason I was worried about heiroglyph was if someone went ante 3 -> heiro -> ante 2 -> ante3 and got a joker an ante early

#

which would happen if I just checked for [ante] % 3 == 0

old bane
#

is there somewhere that can show me an example of how a custom sticker can be implemented? Cause I tried looking at how Cryptid does their banana sticker but it seemed way too complicated for the use case I want (I want to make a sticker similar to Perishable, but it removes itself after 3 rounds instead of debuffing the Joker after 5 rounds)

maiden river
#

I mean
the docs on SMODS.Sticker don't seem too bad

#

unless you already checked that

old bane
#

yeah im just unsure of how one would implement what im looking for because stickers themselves don't have variables

#

i mean i guess i could just inject code into Card.lua so that the card itself keeps track but idk

maiden river
#

interesting

old bane
#

Cause like normally with Jokers you would put custom vars into config.extra

#

but with Stickers it doesn't seem there is a field for config

#

Which I'm confused with because it has its own calculate function so like idk

manic rune
#

your phone linging

normal crest
#

Anyone know in what part of the code tags are rendered

manic rune
#

how can i make it so that this line triggers everytime the round ends, instead of having to be inside a joker's calculation?

old bane
normal crest
normal crest
old bane
#

oh lmao

red flower
maiden river
#

was for this deck lol

normal crest
#

What does your sticker look like

old bane
#

I fixed it but I made it so that instead of being a sprite it instead makes the joker monochrome with a shader

#

tho idk why it's just white

old bane
normal crest
#

What's your localization file

#

or loc_txt

#

whatever you used

old bane
#

originally i just had the key for the localization entry be the key but then i realized i did still need the prefix

crystal crater
old bane
# normal crest What does your sticker look like

okay i got everything working with the ability itself, i just don't know why the shader doesn't work (i think it draws an enlargened version of the joker instead of the joker but monochrome)

coral grotto
#

the way to make text for a custom challenge rule is to just put it in descriptions.misc.v_text under ch_c_[challenge_name] right? for some reason it's not working properly for me

gusty sequoia
#

Whenever I try to split the description of my joker the thing just crashes, what am I doing wrong?

#

It's written like such
loc_txt ={ name = 'Family Man', text = { 'This joker gains {X:mult,C:white}+0.2X{} Mult' 'if played hand contains a Full House (Currently {X:mult,C:white} X#1#{} Mult)' } }

coral grotto
#

missing a comma

gusty sequoia
#

Ah

#

Where...?

coral grotto
#
loc_txt ={
 name = 'Family Man',
 text = {
  'This joker gains {X:mult,C:white}+0.2X{} Mult',
  'if played hand contains a Full House (Currently {X:mult,C:white} X#1#{} Mult)' } } 
#

you need a comma after every line

gusty sequoia
#

I had not noticed, thanks

#

Also how do I make the "currently blablabla mult" grey?

coral grotto
#
loc_txt = {
  name = 'Family Man',
  text = {
    'This Joker gains {X:mult,C:white}0.2X{} Mult',
    'if played hand contains a Full House',
    '{C:inactive}(Currently {X:mult,C:white} X#1# {C:inactive} Mult)'
  }
}
#

C:inactive

gusty sequoia
#

Thank you!

sonic cedar
#

am i doing this right

#

like will this load the lua file if i run it

minor furnace
#

What am I missing here to make the sell value 0?

card.extra_value = 0
card.sell_cost = 0
card.base_cost = 0
card:set_cost()
#

I might just write a patch for the Card:sell_cost() function for my custom sticker

marble flint
sonic cedar
#

oh hello again

#

thanks (it works thanku!!)

coral grotto
#

i've looked at other mods' code and am pretty sure i'm doing what they're doing?

marble flint
#

misc.challenge_names.c_ModId_challengeKey

coral grotto
#

that's the challenge name, i'm trying to do custom rules

#

like the ch_c stuff

marble flint
#

oh rules

coral grotto
#

yeah

marble flint
#

yeah that's misc.v_text.ch_c_ModId_challengeKey

coral grotto
#

yeah i have that, it's not showing up

marble flint
#

oh that doesn't include the mod id

#

is the custom rule functioning other than that?

coral grotto
#

i have a custom rule named grg_so_grunglover, seems to work for G.GAME.modifiers but putting ch_c_grg_so_grunglover in localization/default.lua under descriptions/misc/v_text is breaking

minor furnace
coral grotto
#

here's what default.lua looks like

return {
    descriptions = {
        misc = {
            v_text = {
                ch_c_grg_so_grunglover = {"All {C:attention}Tarot{} cards are {C:attention}The Grungler{}"}
            }
        }
    }
}
coral grotto
marble flint
#

misc goes outside of descriptions

coral grotto
#

ah

#

yeah now it works thanks

#

must have misread the localization page

weak gate
#

is it wise to use a card's unique_val to check if a card is a specific one?

#

mmm yes it seems to stay consistent after reloading

sonic cedar
#

how would i play two sounds in quick succession here? (one for the chips, one for the mult)

faint yacht
#

?

return {
  chips = card.ability.extra.chips,
  sound = "hpfx_thumbsup",
  extra = {
    mult = card.ability.extra.mult,
    sound = "hpfx_thumbsup"
  },
  card = card
}
sonic cedar
#

oh my god i forgot about extra

#

thanks ali

desert ore
#

any recommendantions for what image software to use? Have been using gimp, but the scaling feature makes the pixels blurry, so I'll have to make the art twice for 1x and 2x

faint yacht
#

Are you resizing with "nearest neighbour" in mind?

paper zealot
desert ore
#

oh sweet thanks

paper zealot
#

Aseprite has about 9 years of extra development on top of the point where LibreSprite forked it and is worth the money imo. There's also a free trial version which you can grab on Steam of all places

desert ore
#

yeah I'll try it out at the very least

chrome widget
#

Huh, I'm having trouble with an includes file for some reason?

#

require "libs.serpent"
require "utils"

I'm trying to find this library, in the same folder as the file that's requiring it, but for some reason it says it can't be found?

#

Is this something specific with SMODS?

paper zealot
chrome widget
#

SMODS is required so I'll do the latter

#

Let's see if this works....

#

Ugh, still struggling for whatever reason

normal crest
#

Note Balatro runs on Lua 5.1

#

So if those libraries are for a different version then they might not work

chrome widget
#

Seem to have got it past

paper zealot
#

Anyone know of any Lovely mods that have implemented their own language/localization system outside of SMODS? I'd like to give it a try but want to know if there are any neat ways of doing it

random sleet
#

you just patch the localization files directly at that point i reckon

paper zealot
#

Import them all as modules then write a wrapper to check the relevant one as needed?

chrome widget
#

Okay I think it finally worked???

sonic cedar
minor furnace
#

Less of a "how to do" question and more of a "which way" question, but opinions on how to implement a card being able to count as two suits at once? Debating making it an enhancement or a seal, and not sure which to go with

chrome widget
#

I implemented a card that acts as basically a rotating version of smeared if that's what you wat

#

in which case I wrote a lovely patch for the is_suit() function

minor furnace
#

hmm that's interesting

#

I think I want the secondary suit to stay fixed though

sonic cedar
minor furnace
#

should be as simple as slapping a conditional onto it

#

I think my real question is, do I think it's too unbalanced to make it compatible with other enhancements or not

random sleet
minor furnace
#

And Blackboard for that matter

normal crest
minor furnace
#

but if wild cards don't break Blackboard then I'm fine if this doesn't either

paper zealot
random sleet
#

theyre just lua files that return a massive table

normal crest
#

And no, I don't know why

#

It seems odd to me too

random sleet
#

so the alternate answer is to stop pretending anyone cares if your mod is lovely only or requires smods

#

and thus not reinvent the wheel. for the fifth time.

normal crest
#

Actually now that I look at it, it seems that person typed _ instead of -

#

so maybe it's possible to patch loc files

#

Lesson learned to not blindly trust what eremel says lol

chrome widget
#

Hmm.... I'm attempting to draw a canvas but it's not working as intended

#

I will admit, graphics programming goes over my head most of the time

normal crest
#

It doesn't work

paper zealot
# random sleet and thus not reinvent the wheel. for the fifth time.

That's very wise. Alternatively, i can reduce my dependencies and learn more along the way.
This is a relatively straightforward way to build a simple but functional localization table. No safety checks yet

local locale = {}

if not SMODS then
locale = {
    ['de'] = require('systemclock.locale.de').misc.dictionary,
    ['en-us'] = require('systemclock.locale.en-us').misc.dictionary,
    ['es_419'] = require('systemclock.locale.es_419').misc.dictionary,
    ['es_ES'] = require('systemclock.locale.es_ES').misc.dictionary,
    ['fr'] = require('systemclock.locale.fr').misc.dictionary,
...
}
end

function locale.translate(key)
    if SMODS then return localize(key) end
    return locale[G.SETTINGS.language][key  ] or locale['en-us'][key] or nil
end

return locale
scarlet spire
#

it makes sense, it seems lovely just straight up doesn't dump the localization files at all, which I imagine means it doesn't touch them at all

#

not sure why though

normal crest
#

I wonder what logic it uses to decide those files to be excluded

random sleet
#

i wonder who will ping dave lovely first

edgy reef
#

Maybe it's loadstring vs. load/require diff?

paper zealot
frank ore
#

alright I realised I probably put this in the wrong channel so:

ive been messing around with balatro and kinda making a mod, but it's not something I could easily send to someone else, as it's a modification to the base game files.
I saw the github for steammodded, and i've poked around in the guides, it looks like thats more useful for adding new cards, but what im doing moreso alters existing cards and some of the game files unrelated to the individual cards themselves
I don't know if there is a way to transfer that into a mod easily, and I dont know what to do at this point xd
I can easily keep poking around in the files and changing stuff but I would like to be able to send it to other people

normal crest
paper zealot
#

What's the better way?

normal crest
chrome widget
#

Okay yeah, can anyone help with basically just drawing something to the screen using base Love2D functions?

#

I want to use a canvas to just draw something a box in the center of the screen, but I can't seem to figure out exactly how to do that

#

I thought it was just create canvas -> renderTo() function containing a draw call with the image to render on the canvas

normal crest
gaunt thistle
normal crest
#

and localize is a balatro function so why would it depend on SMODS being loaded

gaunt thistle
#

a way that doesn't end up touching the function(s) that lovely hooks to do patching

paper zealot
gaunt thistle
#

members of the load* family of functions that don't end up calling lual_loadbuffer can't be patched in current lovely

normal crest
#

sorry if I'm misunderstanding the problem

paper zealot
#

I'm not stubborn about this approach, if anyone can think of a better way that doesn't require nativefs i'm keen to hear it. I don't like that importing each locale file through lovely means that the game won't launch if a localization file isn't found, so i'm not totally smitten by it

gaunt thistle
#

what about loading your localization file as a lovely module and then injecting it into the global table via patching the localization load function doodad thingie

#

I will clarify that I have only read up a little bit so I'm probably missing context

#

ah but no lovely

paper zealot
gaunt thistle
#

depends on how you implement it

#

but it shouldn't be that brittle, especially compared to your other options

iron iron
#

obv not just this but this is the json for the mod

plush cove
#

you need an id

iron iron
#

ic

rose dragon
plush cove
#

what if it added a number of chips equal to the frame that its currently on

minor furnace
#

how on earth do you animate a Joker like that

candid willow
minor furnace
#

and more imporantly, can you make a Joker run Doom

#

(seriously though the Bad Apple is awesome)

versed swan
rose dragon
# minor furnace how on earth do you animate a Joker like that

i made a program in rust that decreases the framerate of a chosen video and puts all of its frames on a spritesheet, and then i just copied the jimball code and changed it up a little
so i could just reuse the code and make roffles latest stream (or something, idk that was the first that came to mind) as a joker

minor furnace
versed swan
candid willow
#

starting on my first modded joker, it's a really basic one that's supposed to double the amount of cards you can apply Lucky to when using magician (from 2 to 4)
the way I'm thinking about it, it should be as easy as simply changing the max_highlighted from a 2 to a 4, but like...
i dont know how to do that as a joker effect
and this is the first lua project ive ever made (much less programming thing ive done in years)

chrome widget
#

Is there a way to manually suspend the ability to interact with things like how you can't do most actions when there are events still happening?

candid willow
#

you mean like

paper zealot
candid willow
#

directly modifying the game's lua file????

minor furnace
#

my naive approach would be to write a lovely patch for the code for using The Magician to check to see if you have that Joker

#

So yeah basically modifying the game's lua file, but writing a script to do it instead of editing the file directly

#

however, there may be a better way to do this interaction that I'm unaware of

candid willow
#

hmm

sturdy compass
#

I finally broke down my single lovely file into multiple Blissful

gaunt thistle
#

good god

plush cove
#

same, but currently I only have two jokers that really need lovely files

minor furnace
#

that's a lot of lovely patches

candid willow
#

that was all one file before?????

sturdy compass
minor furnace
#

I only have two Reverse Tarots that require tomls, and it's only one replacement each

plush cove
gaunt thistle
#

patching that much would make anyone go crazy

minor furnace
gaunt thistle
#

props, you're taking full advantage of the tools I've made

#

very proud

sturdy compass
#

There are admittedly a few things I could deprecate but most of it is very necessary lmao

plush cove
#

start over

gaunt thistle
#

deprecate lovely catHeyHello

plush cove
#

deprecate steamodded

gaunt thistle
#

thoughts on the development experience?

minor furnace
#

I'm doing something very silly

sturdy compass
gaunt thistle
#

:3

#

you're the one that made it happen

sturdy compass
#

Now I should probs do the same thing with my main.lua

rose dragon
plush cove
#

how do you people survive with putting everything in main.lua

minor furnace
sturdy compass
plush cove
normal crest
gaunt thistle
scarlet spire
sturdy compass
minor furnace
#

I should probably separate out my main into files by SMOD type

scarlet spire
#

and always collapse the code I'm not using so the file is super short until I need to actually modify something there

rose dragon
plush cove
gaunt thistle
#

LOC doesn't matter, it's all about how you use it

minor furnace
#

amen

gaunt thistle
minor furnace
#

I assume if I want to separate it out into files I just add whatever lua's version of an import statement is to my main?

normal crest
#

SMODS.load_file is your friend

plush cove
#

@normal crest is this better (right is in the only file that actually uses it)

sturdy compass
plush cove
#

srock when I release mistigris and there are a billion different global variables that could be made local

normal crest
gaunt thistle
#

namespace globals pls

normal crest
#

otherwise i'd stick into a global object that has your mod id or prefix in it

minor furnace
#

Is there a way to conditionally apply a different sprite for a single enhancement? Without having to define more than one enhancement

normal crest
gaunt thistle
#

honestly using locals is an antipattern

plush cove
rose dragon
sturdy compass
#

Like it's organized kinda but it's a LOTTTT

plush cove
#

maximus refers to Astra maximizing his line count

sturdy compass
#

what 76 jokers and a whole shit ton of other features does to a main.lua jimbo_spin

minor furnace
#

yeah that'd do it

sturdy compass
#

All one file sweaty

gaunt thistle
minor furnace
#

if my current 17 tarots is only 1600 lines, their corresponding jokers are going to add a decent bit as well

plush cove
#

remember kids, start organizing early so you don't have to refactor later on

rose dragon
plush cove
#

(18 Jokers, 1 Blind, 2 Decks that are both temporary)

minor furnace
#

let's be real though, how many lines in the code are literally a single curly brace

sturdy compass
gaunt thistle
#

daaaaaaaaang

#

close guess

sturdy compass
#

indeed

gaunt thistle
#

40 lines per kb, 104 kb in total

plush cove
#

Tired Programmer (Legendary)
Gains X0.1 Mult for every line of code that's in this mod's main.lua file

normal crest
sturdy compass
rose dragon
gaunt thistle
#

dang

#

I'm a fraud

minor furnace
normal crest
rose dragon
normal crest
#

mine has 1157...

#

at least they're very small files

sturdy compass
minor furnace
#

my lovely file is currently at 34 lines, but that's going to go up exponentially soon

plush cove
#

place your bets: will I be able to keep my mod files organized the more I add to mistigris?!

minor furnace
#

we're getting there

#

once I introduce my abomination that is 'The Lovers?' I'm going to have to do a lot

candid willow
sturdy compass
#

Is it worse that only recently it's starting to become unbearable for me?

rose dragon
minor furnace
#

this is going to let it count as any rank

rose dragon
sturdy compass
#

Oh trust me I do

gaunt thistle
#

Astra just has a really small font size

normal crest
#

and very good vision

#

and a gigantic monitor

minor furnace
#

I'd ctrl+f even if my file were only a few hundred lines long

#

it's faster

sturdy compass
gaunt thistle
#

astigmatic af hell yeah brother

sturdy compass
#

Astigmatism from the hit Balatro mod Maximus???? soyoh

gaunt thistle
#

astigmaximus

minor furnace
#

let me just G my way to the end of the file real quick

gaunt thistle
#

glad I'm not the only one who has one good eye and one massively fucked up eye

#

I'm like +0.5 -4.5

plush cove
sturdy compass
#

I'm blind as hell without my contact lenses

minor furnace
limpid halo
sturdy compass
limpid halo
#

not that that works in lua in IDEA 😭

plush cove
#

holy shit!!!

minor furnace
gaunt thistle
#

erhm why use IDEA when you can use kakoune plinkge

minor furnace
#

two vey different responses lmao

plush cove
rose dragon
gaunt thistle
#

you better watch it

plush cove
#

intelliJ supremacy

minor furnace
#

I'll use intelliJ for Java, sure

plush cove
#

I use Jetbrains Rider which isn't exactly the same thing as Idea but it's close enough

limpid halo
sturdy compass
gaunt thistle
#

why use intelliJ when you can use helix plinkge

sturdy compass
#

the tism!

rose dragon
limpid halo
#

i get it from work anyways so monkyippee

minor furnace
rose dragon
gaunt thistle
#

I use cli git unless I'm doing big rebases or merge conflicts

sturdy compass
limpid halo
rose dragon
minor furnace
#

speaking of git I should probably make a repo for my mod at some point

gaunt thistle
sturdy compass
sturdy compass
minor furnace
#

I have not been controlling my versions on this project

gaunt thistle
rose dragon
limpid halo
#

i decided to version my control because i was getting far enough along that if i lost anything i would want to commit Joker ( 2019)

gaunt thistle
#

ehrm why use github desktop when you can use github mobile plinkge

sturdy compass
#

oh god

rose dragon
limpid halo
#

GitHub for Apple TV

gaunt thistle
#

average github ps5 user

minor furnace
#

github for my smart fridge

edgy reef
#

I should probably use git cli more, I've basically only used it so far via desktop for repo and command line for installations.

candid willow
#

github gameboy

limpid halo
#

idk whenever i try to git add skill it says not found??

minor furnace
sturdy compass
#

Guys I'm a github Nook user, how long does it usually take to push again?

limpid halo
#

you have to manually push it like a car in neutral

minor furnace
paper zealot
#

So I've noticed that after using the Cartomancer mod, even when the mod is deleted and the config is removed, it still creates a cartomancer.jkr config file every launch. What's responsible for this happening and how can I avoid it from happening in my mod?

edgy reef
#

iirc turn off cloud saves for Balatro through steam.

frosty dock
#

that's steam cloud doing steam cloud things

#

you can delete it while the game is running iirc

paper zealot
#

Ah, that's no problem then. I was concerned that functions were being serialized in the profile or something

edgy reef
#

They can't.

candid willow
#

hey so just to make sure I have my understanding of lovely patches down right:
what they basically do is refer to a line of code within a specified lua file, and "overwrite" the content of that line with whatever is in the patch?

frosty dock
#

they can also insert code before or after a pattern

#

and then there's regex patches, which are a lot more powerful

candid willow
#

how so

gaunt thistle
#

they can let you select large amounts of text with a minimal amount of syntax, weave code into other code (like you wanted to replace an if statement's expression), etc. etc.

#

it's the pattern patch but on mondo steroids.

random sleet
#

oh god i need to learn how to do that

deft bane
random sleet
#

the one if statement in Card:draw that is my mortal nemesis.....

candid willow
gaunt thistle
candid willow
#

i feel so out of my depth

gaunt thistle
#

that's ok! It's a lot to take in

#

if you just want to make a mod then you probably don't need to mess around with lovely

#

if you do want to mess around with lovely then the best way is to learn by copying what other people have done

normal crest
#

ngl you do not need a lovely patch to do the effect you mentioned

#

unless you want to conditionally increase the max_highlighted amount

candid willow
minor furnace
#

I wonder what the utility of having a consumable that lets you scry the top few cards of the deck would be 🤔

candid willow
#

I actually wanted to turn that into its own joker too lol

minor furnace
#

Yeah misprint still tells you the top card

#

Scrying would let you rearrange them though, or push them to the bottom of the deck

candid willow
#

ah

#

i guess itd be really good for deck fixing that requires you to not remove certain cards from your deck

#

like say you have Ancient Joker right

#

you scry the top few (let's say 3 cards) and none of them are the suit being called for by ancient

chrome widget
#

how do you get the screen coordinates of a joker's sprite?

candid willow
#

send em to the end of the deck in hopes of getting the cards that ARE called for below them

plush cove
#

do you mean the position used for their sprite?

chrome widget
#

when getting the transform coordinates of say a card's front, I believe it's relative to the parent node/movable/whatever

minor furnace
#

I think scry could be a fun thing, but I’d hate to have to make an interface for it 💀

candid willow
#

you wouldn't have to, I think

minor furnace
#

I’d need a place to hold the cards, and a way for the player to choose where on the deck it goes

candid willow
#

oh you want to MANUALLY place cards within the deck

minor furnace
#

Well not within the deck. But on a per card basis you can choose to either put it on the bottom, or what order to put it back on top with the others

candid willow
#

ohhhhhhhhhh

minor furnace
#

Like how it works in MTG

random sleet
#

i can definitely tell you manipulating deck order is possible but yeah UI code is beans

candid willow
#

yeah that might require its own interface which would suck

minor furnace
#

That’s about what I figured

random sleet
#

but of course not impossible im just no ui wizard

minor furnace
#

This is future me’s problem after I finish my current ideas

random sleet
#

and most people arent

minor furnace
#

And I need sleep because it is 2:30 in the am

paper zealot
minor furnace
#

Average coder sleep schedule

candid willow
#

does anyone know if theres a mod somewhere that changes the effects of existing arcana cards?

#

if I have that I might be able to reverse engineer what I need for this joker

#

wait

#

i think I mightve found it?

frosty dock
#

yeah that's what you use for that

plush cove
#

cryptid fandom in shambles rn

candid willow
#

not so jolly now wendigos

plush cove
#

relax, liberals, it's called dark humour

rose dragon
limpid halo
candid willow
#

man im so mad i didn't find this earlier

#

ill have to look over it in full later tho, i have class in the morning 😭

icy coral
#

Is this linked anywhere?

limpid halo
chrome widget
candid willow
tepid crow
chrome widget
#

The screen cordinates of a card's center are somewhere in the 10-15 range it looks like. They're relative either to the parent node, or to the area they're in, or w/e

wintry solar
#

I’m pretty sure they’re just screen coordinates it’s just the unit is some weird jank

tepid crow
#

That yeah

#

I'm assuming Thunk didnt want to deal with different screensizes so he used some sort of fixed size