#💻・modding-dev

1 messages · Page 10 of 1

short surge
#

shit i need to record in mp4 to make this play eh

silent sinew
#

are you saying you want me to send my whole mod file

royal ether
#

if you used obs, you can 'remux recordings' to change it to mp4

unkempt thicket
#

i use overwatch

#

wait no

royal ether
#

what the flip is overwatch

unkempt thicket
#

outplayed

royal ether
#

oh

short surge
#

how can i make this not a continum of a previous act?

edgy reef
#

I can't do that much from a glance other than suggest trying a different loop for checking suits.

short surge
#

i.e. make it happen before the draws and stuff

silent sinew
#

what do you mean by a different loop

short surge
#

like for example, is there a way for me to clear added events queue before adding more?

#

feels like i could have just make all the accumulated event happen like once

royal ether
#

i think context.setting_blind happens before first hand drawn

#

( imight be misinterpreting the question)

short surge
#

currently what i did is basically wrapped G.FUNCS.play_cards_from_highlighted before G.FUNCS.draw_from_play_to_discard

#

but that somehow makes the draw at the same time as play cards i think

#

instead of sequentially

#

let me try to be a little more specific

#

this is what it is doing

unkempt thicket
#

you just want to remove from the list, right?

short surge
#

basically, before G.FUNCS.draw_from_play_to_discard, I check if this joker is there, if so, put all the highlighted cards back to hand, highlight them, and play them

#

(I'm doing this because the events I added happens AFTER your cards are tossed)

unkempt thicket
#

and what do you want it to do?

short surge
#

after you play your hand, play it again

#

but not like retrigger, it should count as two hands

#

I think that was the tricky parts

#

the problem with this currently is that the game would fill your hand before the second play is done

silent sinew
#

i believe sixsuits is interfering with this somehow

short surge
#

I can't figure out a way to actually make the event happen in the right time/sequence

silent sinew
#

because it says i have a spectrum when i only have 2 suits

short surge
#

even though i think it tried all i could

silent sinew
edgy reef
#

huh

silent sinew
#

for some reason spectrum overrides flush

#

this wouldn't be a problem if it didn't i think

#

oh it's because they hook into the end of eval poker hand

#

i have no idea what to do about this

#

i think get_spectrum is also the reason why is_suit is called SO many times

rough furnace
#

Guys I have done it

#

I have created the most cursed way to install steamodded

silent sinew
#

this is really annoying

#

i know exactly why it thinks everything is a spectrum with smeared too

slow ocean
#

chat i have a quandry

#

in context.using_consumable how would i get the name/slug of the consumable in question

rough furnace
edgy reef
slow ocean
#

any fool proof way of checking like a slug or something compared to name?

silent sinew
#

i think i might just get rid of the smeared changes i don't have the energy to troubleshoot this in the slightest

silent sinew
#

even with the smeared bullshit off the table i still have the problem where blackboard only shows 1 color tooltip

#

what am i doing wrong

#

are you not allowed to run loops in tooltip or something

edgy reef
#

Wouldn't adding #info_queue+k result in skipping positions in info_queue?

silent sinew
#

doesn't k just increase by 1 every loop or do i have it wrong

edgy reef
#

#info_queue already increases once per loop because it's always increasing it's own size

#

You should be able to just do #info_queue+1

silent sinew
#

i see

#

well i guess the mod is good to release then

short surge
#

F

rough furnace
#

Score at least 0

hallow forge
#

Is that two blinds at the same time?

edgy reef
#

How would you even pull that off

#

Wait

#

Does destroying_card only work for scoring cards?

#

bruh

silent sinew
#

blackboardapi is out

slow ocean
#
            if context.using_consumeable then
                for i, v in ipairs(self.ability.extra.tapestry_list) do
                    if v == context.consumable.name then
                        return nil
                    end
                end
                self.ability.extra.mult = self.ability.extra.mult + 4
                G.E_MANAGER:add_event(Event({
                    func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_upgrade_ex')}); return true
                    end}))
                return
                table.insert(self.ability.extra.tapestry_list, context.consumable.name)
            end```
#

am i stupid?

#

(im trying to check for duplicate consumable usage)

worthy depot
slow ocean
#

yeah i have it pulled up right now

#

i see it references G.GAME.consumeable_usage

#

(though i havent updated my version yet clueless

#

yeah im

#

stumped

#

gonna sleep for tonight, too frustrated to code

short surge
#

can someone tell me about before, immediate and after for events? They are all performing in the same way for me...

edgy reef
#

I don't think anyone has ever looked into how G.E_MANAGER works

unkempt thicket
short surge
unkempt thicket
#

um, its increasing.

short surge
#

it is working at least

#

unlike mine

unkempt thicket
edgy reef
mellow crag
edgy reef
#

Gonna also do in hand as well

short surge
#

wait you made unscored card destroyable??

edgy reef
#

With the power of Lovely yea

short surge
#

that's lovely balatroheart

edgy reef
#

I'm thinking of making a joker context extension API

short surge
#

api soon?

#

nice bro

edgy reef
#

Only thing stopping it is that there's not that much we can add

#

As almost everything already has a specific context

short surge
#

me trying to figure out how time works

edgy reef
#

Only other thing I can think of is on draw

#

For stuff like "If you draw a King, gain .5X Mult"

short surge
#

on the end of discard

#

if you discard more than one

#

so post_discard

#

right now i use a hack to do it

crisp coral
#

oh yeah i can use lovely to send the chips score through context now

edgy reef
#

Just like how Faceless Joker does

short surge
#

well not really

#

i counted highlighted card and see if the discard happens for that amount of times

short surge
edgy reef
#

Yea

short surge
#

well this felt somewhat shady tbh

edgy reef
#

Then it is hooked up into a G.E_MANAGER event so it's technically not immediate (I think)

still jacinth
#

how do i make a joker gain x1 mult if the played hand has a specific card

short surge
crisp coral
#

idk about before events

#

immediate events make it so that everything won't run on the same frame

#

after events add a delay

short surge
#

but they still happen in the order of which is accumulated right?

edgy reef
#

Quick question about syntax, which one would be prefered? Making a new one with a different name or using the already existing context and specifying if the card is scoring or in hand?
Former is easier to implement exclusions for already existing modded jokers using this context, but the other one is more in-line with how the game handles context.

short surge
#

fuck, just discovered that for some reason every events added in play_cards_from_highlighted is after events added in draw_from_deck_to_hand?? why the hell

short surge
#

i probably won't touch it personally unless it's live on steamodded one day

crisp coral
short surge
#

draw cards always happen first

#

fuck

silent sinew
unkempt thicket
silent sinew
#

i need to figure out how to exclude dark fountain from appearing literally anywhere except the collection and knight spawning

unkempt thicket
#

never call it anywhere, problem solved

short surge
#

I also want to do this

unkempt thicket
#

i think its common, you can call it to make it start appearing when something happens. but i don't call it so it only appears when set to be added by something else in the code(in my case its a deck)

#

only place it appears

short surge
#

well how about excluding jokers from shop?

#

i guess these are not that similar right

unkempt thicket
#

yea thats what it does

edgy reef
#

pool flags already exclude them from shops

#

It's what controls Gros Michel and Cavendish

short surge
#

oh so for a joker to not appear in shop, we just do SMODS.Jokers.j_joker_name.yes_pool_flag = 'whatever' and that's it?

unkempt thicket
#

yep

short surge
#

that's neat

#

do we know if this is the same for legendaries as well?

unkempt thicket
#

just make sure to not call the whatever in the code otherwise it'll start appearing

#

i think thats what they do

short surge
#

aaaaaaawesome

unkempt thicket
#

just uncallable tags

short surge
#

gonna make all xplaying jokers exclusive then

edgy reef
short surge
#

right now it basically corrupts legendary pools which is kind of annoying

short surge
edgy reef
#

oh

#

uhh

unkempt thicket
#

i'd have to check

edgy reef
#

lemme see

#

Looks like it might?

#

hmm

unkempt thicket
#

i think it does prevent soul spawn

edgy reef
#

It would go through the pool flag checks yea

short surge
#

lmao i was hacking this before

#

so basically i made my mod's default joker to manually remove every jokers from my mod from the pool

#

guess i was the caveman

#

time to fix that

#

oh btw do you just do it when you set sprite for your joker?

unkempt thicket
#

I just kind of stick it in between sprite and loc_def.

short surge
#

thumbsup lovely

unkempt thicket
#

It does prevent soul spawn.

#

(if it didn't i would have a dawn deck card on top of these ones)

#

moved rarity to 4 to check

short surge
#

nice

#

but i was a little confused for how you throw a deck on joker bar

unkempt thicket
#

i don't understand the question

#

oh i understand now

#

its the deck's sprite on a joker designed for the deck

short surge
#

a flipped joker?

unkempt thicket
#

then when deck is played i just add a negative eternal version of the joker

unkempt thicket
silent sinew
#

you have no idea how tempted i am to keep this placeholder art

unkempt thicket
#

it would look like the deck sprite when flipped but it can only be found in the deck and negative

#

so no art problems

unkempt thicket
short surge
#

you must play his music while he's on the board

#

otherwise not allowed

unkempt thicket
#

blind with sans music

silent sinew
#

i might make jokers for undyne and undyne the undying that are like gros michel and cavendish

#

oh my god

#

what if the undyne the undying one

#

whenever it got destroyed it came back stronger

#

that could be so interesting but also scary

queen scroll
#

does anyone know if you can add a card with steammodded without adding it to the pools/collection?

silent sinew
#

snow just talked about it a bit ago

silent sinew
queen scroll
#

thanks, but it still appears in the collection

unkempt thicket
#

it may be harder removing it from collection.

queen scroll
#

guess i'll go with not using smods api then

edgy reef
#

<@&1133519078540185692> GET THEM

unkempt thicket
#

<@&1133519078540185692>

odd dock
#

smods

still jacinth
edgy reef
#

Bot account pulled up

unkempt thicket
#

its better to have missed

still jacinth
#

oooh

silent sinew
#

oh yeah...

#

i need to figure out how to make it not trigger if it's sold

unkempt thicket
#

ahh

odd dock
unkempt thicket
odd dock
#

hex gaming, ghost deck gaming

silent sinew
#

madness gaming

unkempt thicket
#
  • is cursed
silent sinew
#

i'll maybe make it a chance to come back instead of guaranteed

silent sinew
#

i couldn't find any other way to tell when a card is destroyed

unkempt thicket
#

just add at the end not context.selling _self

silent sinew
#

i did and it was nil

unkempt thicket
#

ah

#

you could use a boolien and the if statement

silent sinew
#

context.selling_self is clearly just not set during that event

queen scroll
silent sinew
#

i see

#

that's clever

#

ok yah im definitely giving her a chance to die permanently shes way too strong LMAO

#

it fits anyway

still jacinth
#

why does it say "attempt to index field "atlas" [a nil value]" when i go into my collection and try to see my joker

edgy reef
#

Animation is a little scuffed but I'm not sure exactly what I can do about that, either way, new context just dropped

silent sinew
#

for some reason when undying is first created she has X1 mult even though i put x_mult = 2 in the config

still jacinth
#

crap im dumb as heck

silent sinew
frosty dock
still jacinth
#

yeah

#

how did it take me like 30 minutes to realize that

queen scroll
# silent sinew

i think with the nerf, starting at 2x and coming back with twice the mult is balanced

edgy reef
# silent sinew

Probably because the game uses self.ability.x_mult for stuff which might be screwing with it

#

Swap it to self.ability.extra.x_mult and it probably wouldn't be an issue

odd dock
# silent sinew

can you make it gain the xMult regardless of if the probability hits so if it returns through another method its still buffed?

silent sinew
#

i dont think so because it creates the new card while it's being destroyed and sets its x_mult based on its own

edgy reef
still jacinth
#

how do i give myself a joker easily, i need to test it

odd dock
#

debug mode

#

debugplus if you use lovely

still jacinth
#

alr

silent sinew
#

she's died on the second destruction twice in a row for me 😭

#

...i need to have her use G.GAME.probabilities.normal

#

oh god

#

this is so scary

#

its not consistent because oops all 6s could just get destroyed but still wow

queen scroll
still jacinth
#

so how do i get the scored cards? is it just G.play.cards?

queen scroll
silent sinew
#

why

silk scaffold
#

hey guys sorry to pop by but i notice this is where people active rn, does the update fuck with mods?

queen scroll
# silent sinew why

at anything below a 1 in 2 chance it's just stupid to try destroy it again

silent sinew
#

yeah true ig

#

then again

#

you could literally make her immortal with oops all 6s if she was just a 1 in 2

#

unless it was 1 in 2 chance to die but thatd feel dumb

queen scroll
#

my solution to it was kind of... non-standard

silent sinew
#

i think i'll stick to the chance decrease for now

queen scroll
#

ok, but maybe start at 3 in 5 and increase the denominator by one each time

silent sinew
#

yeah i guess 3 in 5 is more fair

queen scroll
#

remember that still means in 40% of runs the joker will do nothing

silent sinew
#

i could also do something like 3 in 3 to give her 1 guaranteed revival

queen scroll
#

oh yeah, that's a good idea

#

maybe 2 in 2 to not be too powerful

silent sinew
#

...oh god imagine her with lucky break from balatrostuck

silent sinew
queen scroll
silent sinew
#

3 in 3 with all 6s would be... 4 guaranteed revivals

silent sinew
queen scroll
#

you can't destroy jokers during scoring though

silent sinew
#

i'm not sure if it's during scoring or when you have 1 left hand in general that's probably a question for akai

queen scroll
silent sinew
#

yeah fair

queen scroll
#

just think about photograph chad, vampire midas, etc.

still jacinth
#

how do i check if the scored hand contains a certain rank of card

silent sinew
#

i'd suggest referencing the original code for stuff like this

#

it'll usually have the answer to your question

still jacinth
#

im trying to use context.other_card:get_id() but its not working

#

attempt to index field "other_card" (a nil value)

worthy depot
still jacinth
#

yea

#

kinda

#

just a sec

worthy depot
#

I'm trying to think of other Jokers that care about a certain rank to look at

still jacinth
#

i feel like im just dumb

frosty dock
#

why do i need to have these in reverse order of nominals basically everywhere? i only just realized this makes sorting by suit vs. view deck UI hella inconsistent

#

do i just loop in reverse, adding new suits at the top of view deck instead of at the bottom?

still jacinth
#

which is progress

#

i need it to count cards that arent scored

#

its only wanting to count the cards that are scored i think

queen scroll
still jacinth
#

i want it to only activate if played hand contains all those A, 9, 8, and 4

queen scroll
#

yeah, but it's going through each card and checking "is this an ace, a 9, an 8 and a 4" and unsurprisingly saying no each time

queen scroll
# worthy depot

this is new 8 ball, which has a different effect to what i think you need

edgy reef
#

Also would you need to specify if this is context.before or context.after?

#

Or neither if I’m understanding this code right

still jacinth
#

i want it to activate after all the cards are scored but only if played hand contains aforementioned ranks

queen scroll
#

oh ok, then you need context.joker_main

#

then you can loop through context.full_hand

still jacinth
#

that seems simpler than i was imagining it

#

lol

queen scroll
#

yeah, often times there's already code right there for what you want to do

zealous glen
# silent sinew

I had a similar idea but for a Joker that only revives once. Interesting

still jacinth
#

now it works but it immediately crashes after

#

bad argument #1 to 'ipairs' (table expected, got nil)

maiden phoenix
#

What did you put in the ipairs? And under what context is it?

still jacinth
#

the weird thing is it works and detects all of them and does the if statement below that, and then gives the error

maiden phoenix
#

Maybe that context is called somewhere else where there's no context.full_hand

#

Also fun tip if you want to check if a boolean is true you can simply write if ace and nine and eight and four then

still jacinth
#

woah

maiden phoenix
#

Try adding and context.full_hand to the first if line

still jacinth
#

if context.cardarea == G.joker_main and context.full_hand then?

maiden phoenix
#

Yup

zealous glen
still jacinth
zealous glen
still jacinth
maiden phoenix
zealous glen
#

(arguably aradia music)

queen scroll
#

so the event manager keeps a queue of all of the events that are ready to take place

#

it also keeps a series of delays in this queue

#

for example:

  • delay(0.5)
  • eval_status_text gros michel
  • delay(0.2)
  • destroy gros michel
still jacinth
queen scroll
#

if you add an event with immediate, it will add it directly to the front of the queue, but behind any delay that's already in progress

worthy depot
queen scroll
#

if you add an event with before and pass in a delay of x, it will add your action to the back of the queue and then put a delay(x) behind it

still jacinth
# worthy depot Try it.

it.. kinda works? like it looks like it activates twice but it only does anything the second time, but it makes a little red particle both times

queen scroll
#

whereas if you use after, it will still your event at the back of the queue, but even after the delay

#

i'm not completely certain of this, this is just what's worked for me so far

zealous glen
#

@queen scroll Do you know why some events speed up when there are a lot of them?

queen scroll
#

no i don't

#

i assume it's something hardcoded into the event manager, but idk exactly how it works

zealous glen
queen scroll
queen scroll
#

you'll have to look into it yourself

zealous glen
short surge
#

thx for the explanation

zealous glen
#

percent is for sound

#

delay is for delay

#

The rest seem irrelevant

short surge
#

got something new while trying

#

smarteyes just as I thought i figured this out

queen scroll
#

it's lame that lua doesn't allow that

zealous glen
queen scroll
#

you will probably have to figure it out yourself

zealous glen
queen scroll
#

sometimes you just have to move on and think of another way

still jacinth
zealous glen
queen scroll
zealous glen
#

Also how do localization works

#

Or maybe the issue is when trying to add the tooltip badge for something else

queen scroll
#

depends on whether you're dealing with ui descriptions/tooltips or not

#

if you're not, then it just looks up a code in a lookup table

#

if you are, then it looks up the code, then does some funky stuff to turn it into ui objects

#

yknow, like these ones

#

the god awful annoying ones

zealous glen
#

But it gives me an error when I use a custom one

queen scroll
#

if you're using steamodded i think they have an api for that

zealous glen
zealous glen
#

Besides I don't want a new edition, I just want a new tooltip

queen scroll
#

ok, well idk sorry

#

i'm working on my own thing rn

narrow pollen
#

i think you could probably hack it out by making a print_table function (or stealing the one i put in enhanceAPI, idm)

#

that's how i've dipped my toe into

#

nodes

short surge
#

holy moly pepperoni

#

I got it somewhat working

#

although still flawed kinda

zealous glen
zealous glen
short surge
#

although that extra draw cards is kinda annoying ngl

still jacinth
#

how the heck do i make it so it adds x1 mult to the joker each time i do a specific thing

#

cause i know that if you do #1# in the loc_txt it will access the loc_def or something but i have no idea where to start with that

bold osprey
#

that's so cool

bold osprey
# still jacinth

why do you check if they are true ? do "if ace and nice and..." (mb it was already recommended)
I would also put them in local.

rugged void
bold osprey
worthy depot
bold osprey
# still jacinth

I would also do "if contect and context.cardarea == G.joker_main and context.full_hand" at the beginning

#

If it still bugs after all that

still jacinth
rugged void
bold osprey
#

ace = ace or name:get_id() == 14 (would maybe work)

still jacinth
#

is this valid or am i doing something wrong

rugged void
#

yeah, nevermind. didn't look at it completely

zealous glen
zealous glen
#

You want xmult to be in ability. Also, there’s a native name for this which works with existing code do you might want to check that

#

I did it’s Xmult

#

Actually nevermind

still jacinth
#

where is ability

zealous glen
#

I added it to extra

zealous glen
# still jacinth where is ability
local joker = {
    slug = "the_one",
    name = "The One",--name used by the joker
    config = {extra={Xmult = 6, type = 'High Card',  rank = 'Ace', suit = 'Spades'}}, --variables used for abilities and effects.
    pos = { x = 0, y = 0 }, --pos in spirtesheet 0,0 for single sprites or the first sprite in the spritesheet
    rarity = 3, --rarity 1=common, 2=uncommon, 3=rare, 4=legendary
    cost = 8, --cost to buy the joker in shops
    blueprint_compat=true, --does joker work with blueprint
    eternal_compat=true, --can joker be eternal
    unlocked=true, --joker is unlocked by default
    discovered=true, --joker is discovered by default
    effect=nil, --you can specify an effect here eg. 'Mult'
    atlas=nil, --defines the atlas that you want to use for the sprite sheet. atlas=nil if you want to use single sprites
    soul_pos=nil, --pos of a soul sprite.
}

joker.calculate = function(self, context)
    if context.cardarea == G.jokers and (not (context.before or context.after)) and self.ability.name == 'The One' and context.scoring_name and context.scoring_name == self.ability.extra.type and context.poker_hands and next(context.poker_hands[self.ability.extra.type]) then
        local the_one = false
        for i = 1, #context.scoring_hand do
            if context.scoring_hand[i]:get_id() == 14 and context.scoring_hand[i]:is_suit('Spades') then the_one = true end
        end
        if the_one then
            return {
                message = localize{type='variable',key='a_xmult',vars={self.ability.extra.Xmult}},
                colour = G.C.RED,
                Xmult_mod = self.ability.extra.Xmult
            }
        end
    end
end

joker.loc_def = function(self)
    return {self.ability.extra.Xmult, localize(self.ability.extra.type, 'poker_hands'), localize(self.ability.extra.rank, 'ranks'), localize(self.ability.extra.suit, 'suits_plural')}
end

return joker
bold osprey
#

did you do the modification we told you ?
And did you try returning { mult_mod = 1} ? if false

zealous glen
#

This Joker gives xmult when played hand is High Card with a scoring Ace of Spades

#

I could add a break to make it slightly faster

bold osprey
zealous glen
#

Anyways, if you want to increase Xmult, just have an Xmult_mod (or hardcode the increase) and increment Xmult when it's not context.blueprint

bold osprey
#

Even my sound API I have 2 loops that do almost the same thing but I just didn't bother to combine the 2 of them

zealous glen
bold osprey
#

for i = 1, #context.scoring_hand do
if context.scoring_hand[i]:get_id() == 14 and context.scoring_hand[i]:is_suit('Spades') then return {
message = localize{type='variable',key='a_xmult',vars={self.ability.extra.Xmult}},
colour = G.C.RED,
Xmult_mod = self.ability.extra.Xmult
} end
end

zealous glen
rugged void
zealous glen
#

and generate ui

bold osprey
#

no

#

it exists the current loop

zealous glen
bold osprey
#

return exits everything inside the function

rugged void
#

isn't that what's supposed to happen?

#

just exit the loop

zealous glen
#

But it's different

zealous glen
#

Instead I can return immediately when I find it

#

I don't even need the boolean

rugged void
#

oh, now i get what you mean

#
for i = 1, #context.scoring_hand do
            if context.scoring_hand[i]:get_id() == 14 and context.scoring_hand[i]:is_suit('Spades') then 
              return {
                message = localize{type='variable',key='a_xmult',vars={self.ability.extra.Xmult}},
                colour = G.C.RED,
                Xmult_mod = self.ability.extra.Xmult
              }
            end
        end
#

like this?

still jacinth
#

I did it (I think) and it says ']' expected [to close '[' at line 12] near '='

bold osprey
rugged void
bold osprey
#

oh okay x)

rugged void
bold osprey
#

we thought you were generalizing XD but in our case yes it would have done the same thing

rugged void
# still jacinth
local j_george = SMODS.Joker:new(
  "George Orwell",
  "george",

etc.

still jacinth
#

k

zealous glen
still jacinth
#

attempt to index global 'self' (a nil value)

zealous glen
still jacinth
#

i tried replacing them with card but it still didnt work

rugged void
#

card should work

still jacinth
#

when i did that they activated but just did nothing

rugged void
#

it's xmult, not x_mult

#

i believe

#

in your return

zealous glen
still jacinth
#

lmao

#

discord moment

zealous glen
still jacinth
#

I really should get visual studio code on my pc

#

my laptop is pretty slow lmao

zealous glen
#

See

zealous glen
still jacinth
#

alr

#

also the thing works

zealous glen
#

Yay

#

Literally 1984

still jacinth
#

should it be rare or legendary

zealous glen
#

I’d nerf it and make it rare

still jacinth
#

x0.5 instead of X1?

zealous glen
#

I’d consider a different effect for flavor but I have no idea what so this works

zealous glen
#

It needs all four cards

still jacinth
#

Ya

zealous glen
#

Then x1 is fine, maybe even weak

still jacinth
#

True

zealous glen
#

It could work as a legendary but they’re hard to get and being hyper specific means they’d get ignored

still jacinth
#

true

zealous glen
#

I think the reward could be different but Idk what

still jacinth
#

im so bad at pixel art

worthy depot
#

Well you can't get worse so that's always a plus.

golden lake
#

morning chat

#

balatrostuck is nearly done cooking in terms of jokers

#

soon we will move onto things like

#

Aspects

worthy depot
frosty dock
#

(would just need to replace (...) with {...})

still jacinth
#

the slug on it is george, why isnt it going for george.png when loadin

rugged void
#

it's j_george

still jacinth
#

oh right

#

i swear im going insane

#

why is it not doing the thing

maiden phoenix
#

?

still jacinth
#

its loading jimbo pic instead of the custom thing i made

maiden phoenix
#

Whats your sprite loading line looks like?

still jacinth
#

what sprite loading line

#

i just have the slug

maiden phoenix
#

The SMODS.Sprite line

#

You need one if you want to load a sprite

still jacinth
#

idk how to make that

maiden phoenix
#

Check the steamodded github wiki section

proud pier
#

how do i find the slugs of vanilla objects?

royal ether
#

theyre all defined in game.lua

fringe junco
golden lake
#

ew mixels

gaunt thistle
#

sus

frosty dock
#

no u

zealous glen
#

Guess what happened here

shell timber
#

mixel joker
+X mult to the next multiple of 10

frosty dock
#

guess what's left for me to deal with >_<

crisp coral
#

oh shit challenges

frosty dock
#

but gosh, it's ugly UI code

crisp coral
#

oh

#

dies

frosty dock
#

i first need to figure out what the things I changed even are, and maybe then I can make it use lovely and get rid of redundant code

ruby geyser
#

Hey all, I'm completely new to modding and LUA, just trying to make some simple jokers to get my bearings and I'm kinda having trouble knowing where to start lol, I'm following the steammodded wiki page but unsure of how the atlases and sprites work. I think that's causing me to get this error

#

My code (copy + pasted from the wiki basically)

frosty dock
#

i believe its name is 'Joker', but the game knows better haha

ruby geyser
#

Ok I removed that text but now instead of opening and crashing on Collection screen it's simply crashing on load. Error message seems to be suggesting an unclosed bracket but I can't see one?

ruby geyser
#

Exact same error message

final hinge
#

missing comma mult = 10} and y=0} 3 line under Joker:new

#

@ruby geyser

ruby geyser
#

Ah, I see they got caught when trying to beautify the code. Thanks!

zealous glen
#

Finally, my first Joker idea (though not in the way I wanted to implement it, but in an easier way)

ruby geyser
zealous glen
#

Lemme test it

ruby geyser
#

Sorry to keep spamming this chat with noob errors but I've managed to get past where it would crash before, it now shows up in collection but as soon as that page is loaded it now gives me this error and I cannot for the life of me figure out what nil value I have created

final hinge
#

can you send me your file ?

ruby geyser
#

Lua or save?

final hinge
#

LUA

#

to compare declaration

#

oh I know

#

SMODS.Joker:new is outside of your SMODS.INIT

final hinge
#

you will understand what I mean by outside of SMODS.INIT 😉

ruby geyser
#

The joys of only having Python coding experience I suppose lol, not used to all of this declaration

zealous glen
#

Python has __main__ though

ruby geyser
#

True, but I mostly write scripts to do quick and dirty data analysis rather than anything too serious haha

final hinge
#

Check existing working mods, adapt xD

ruby geyser
final hinge
zealous glen
ruby geyser
frosty dock
ruby geyser
frosty dock
#

you'll need a loc_def function, putting variables in your description doesn't work out of the box

zealous glen
# zealous glen Now it works

The only remaining issue is that if the card is added while the Goad is active it’s not debuffed. But otherwise my code is identical to Grim, which does has its Aces debuffed, so I don’t know what’s the difference here

frosty dock
#

are you not calling Blind:debuff_card anywhere?

final hinge
#

from #1221916334372290620

function CodexArcanum.Alchemicals.c_alchemy_oil.use(card, area, copier)
        G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function()
            for k, v in ipairs(G.hand.cards) do
                delay(0.05)
                v:juice_up(1, 0.5)
                v:set_debuff(false)
                v.ability.extra = v.ability.extra or {}
                v.ability.extra.oil = true
                if v.facing == 'back' then
                    v:flip()
                end
            end
        return true end }))
    end```

If it can help
zealous glen
frosty dock
#

create_playing_card calls the Card constructor, which in turn calls Card:set_base(), which calls G.GAME.blind:debuff_card()

frosty dock
#

hm that's odd then

#

just so you know you don't need to check ability name

zealous glen
#

Certificate works fine

frosty dock
#

certificate manually calls G.GAME.blind:debuff_card(_card)

zealous glen
#

Where

frosty dock
#

i think there was an issue with it previously where it didn't debuff its cards

zealous glen
#

I'm using the old version as reference

#

That should fix it

frosty dock
#
  • Fixed bug where the card generated by 'Certificate' was not being debuffed by the boss
#

it's in the patch notes

ruby geyser
#

Getting an error even though it's literally copy + pasted from the wiki? Error seems to be on the line info_queue[#info_queue+1] = { set = 'Other', key = 'my_key', vars = {card.ability.mult} } -- Custom tooltips

frosty dock
#

but there isn't actually a Card being passed to the tooltip function, just a proto center object

#

card.config.mult should do

zealous glen
#

What does everyone think?

#

It was first idea I ever had for a Balatro Joker. It's not exactly what I first envisioned because that's hard to implement, but the result is the same. Also this has neat synergies

ruby geyser
#

Looking at other mods in the value section of the SMODS.Joker they have {extra = {}} instead of just values, is this something seperate?

zealous glen
#

So it's custom made for Jokers

#

Other entries in the dictionary that contains extra are more widespread

zealous glen
silent sinew
#

i never asked do you guys think this is good for a legendary

zealous glen
silent sinew
#

eh i thought it was nice and straightforward

frosty dock
#

what does dark fountain do?

zealous glen
frosty dock
#

oh I missed that

limber kraken
#

This is a minor thing but it may sound better "Create a negative Dark Fountain when boss blind is defeated"

frosty dock
#

seems strong, I like it

zealous glen
zealous glen
#

I prefer trigger condition -> effect

fair inlet
#

so basically 2^x

zealous glen
#

Even something minor would make it more interesting

silent sinew
#

i could have it trigger when it's defeated with no light suits or smth

zealous glen
silent sinew
#

maybe idk

still jacinth
#

What does this error mean: Could not decode PNG image (custom zlib or inflate decompression failed)

still jacinth
#

ok, it just... started working

#

nvm its still not showing the correct sprite for my joker

frosty dock
still jacinth
#

how?

frosty dock
#

by closing whatever programs you have running and don't need to be

still jacinth
#

oh

#

i still dont get why its not showing the sprite though

#

it just shows jimbo

#

oops, i was just being DUMB

halcyon swift
#

Sorry if this isn't the best place to ask, but does anyone know how I could get just a blank white card with the foil/holo/poly shader on? I just need a clean image of each edition to work with. But I'm clueless on how to work with shaders like this.

ebon tide
halcyon swift
#

Just get a nice clean image of the foil/holo/poly patterns to use in photoshop for various things

ebon tide
#

Without help from anybody else - probably the easiest way would be the Deck Creator to create a specific deck and then to "erase" the printed text/suits from the texture for the playing cards.

*"\resources\textures\1x\8BitDeck.png" *
*"\resources\textures\2x\8BitDeck.png" *

narrow pollen
#

yeah, it's either that, or commandeering the editions ui box

#

and telling it to draw the "centers" atlas at {x=1, y=0} instead of the "jokers" atlas, at jimbo's sprite position

frosty dock
#

I'd go for something like creating a tarot that changes a card to the blank card (set_base(nil) or something should do), then cycling through editions by pressing q with debug mode enabled

#

or yeah, using the collections page and changing the sprite

halcyon swift
#

ok thanks for the advice! 👍

still jacinth
#

why does this cause issues

frosty dock
#

what issues does it cause?

still jacinth
#

something about expecting a }

wintry swallow
#

wait how would i make a card give an effect already in the game, like steel or wild

zealous glen
#

They’re stored separately from the base so I imagine if you replaced the texture atlas with a transparent one temporarily you can get a blank card

silent sinew
#

i wonder if it's possible to make a consumable buff your next hand

silent sinew
#

does codex do that?

zealous glen
#

Idk

river fern
#

sorta? cobalt upgrades your current held hand

still jacinth
silent sinew
#

my idea for a weird hacky way to do it is have the consumable create a joker that just destroys itself after one hand

zealous glen
still jacinth
#

oops forgot == instead of =

tulip scroll
silent sinew
zealous glen
silent sinew
#

yeah i guess i could just hook into calculate_joker and use a variable

zealous glen
#

It’s not clear to me how main_joker works exactly, but that Voucher that ensures you always get your most played hand planet uses it, and AFAIK it’s the only thing that does

silent sinew
#

i do want it to be visual in some way though

zealous glen
still jacinth
silent sinew
#

oh yeah true cause you could just not have any jokers

still jacinth
zealous glen
ruby geyser
#

Just curious, I want to make 2 jokers with effects very similar to currently existing jokers - What's the best way of replicating the behaviours (The jokers in question are Invisible and Ride the Bus)

zealous glen
#

Of the game

#

Or mods that work similarly

ruby geyser
#

Is it decompiled somewhere?

silent sinew
#

open the exe as an archive with 7zip

ruby geyser
#

Cool cool

zealous glen
ruby geyser
#

That is me.

#

I am wide Candace.

zealous glen
#

Is there a wise Candace?

silent sinew
#

there are some jokers (like the ones that give mult when you play a specific suit/hand) that are coded differently to most other jokers, but depending on the effect it shouldn't be too hard to get what you're looking for

ruby geyser
ruby geyser
#

I'm pretty good at maths

zealous glen
tulip scroll
ruby geyser
zealous glen
#

It’s like thunk is trying to get math people into statistics gambling

ruby geyser
#

Just nobody wants to play with them

zealous glen
#

Not really

ruby geyser
#

because they keep talking about probabilities and shit

#

Takes the fun out of it

tulip scroll
#

i think thats how i won a game of five crowns with 24 points

golden lake
#

Balatro isn't really about math or statistics and statistics don't really factor in all that much

tulip scroll
#

except it is

golden lake
#

The closest Balatro gets to conventional math is through mental arithmetics the game makes you perform every time you hit play

zealous glen
#

I think there’s a lot of math in it

zealous glen
#

Because then I might agree lol

ruby geyser
#

Technically you can optimise your discards and throwaway hands through doing hypergeometric calcs

zealous glen
#

People think math is arithmetic

ruby geyser
#

TRUE

zealous glen
#

Maybe trigonometry

zealous glen
#

But it seems too large for classical dynamic programming

golden lake
#

Most math in like, a mathematician sense is closely related to calculus, statistics are more of a data analyst field

#

Sure, they require arithmetics and graphing, but that's more like tools

#

Rather than the actual devices

ruby geyser
#

Calculus is much more related to data science than pure mathematics (source: I am a pure mathematician)

golden lake
#

That too

tulip scroll
#

they teach you statistics in math class, therefore, statistics are math

ruby geyser
ruby geyser
#

I did some crossover but I meant more as two disticnt subjects (My dissertation was on Topological groups though)

#

I did a lot of topology and my best subject was Galois theory

zealous glen
#

I’m an applied mathematician so I look at algebraists like normal humans look at mathematicians

#

Some of my best friends are algebraists—

zealous glen
#

;P

frosty dock
#

lmao

golden lake
#

I went to university and then realized that it's a scam that does nothing to progress my development and that a focus on academia is detrimental to my growth as an artist and as a programmer so I dropped out thumbsupG

ruby geyser
#

Or even worse, an econ student

zealous glen
ruby geyser
zealous glen
#

“Economy math was too simple.”

#

Paraphrasing

golden lake
ruby geyser
#

Fair

#

Can someone explain why my test joker is not scoring anything at all btw?

zealous glen
#

I took design classes in high school, including game design, but ultimately I decided I’d better follow a stem path

golden lake
#

That might be because you're not specifying the right context

ruby geyser
#

What's the correct context?

tulip scroll
golden lake
#

Just saying that the cardarea should be G.jokers means nothing to the large if else tower of doom of Balatro

zealous glen
golden lake
tulip scroll
#

oh ok

#

you can do it whenever in the SMODS.INIT function?

golden lake
#

The easiest hack to get thing to work and then shoot yourself in the foot later down the line is

if context.cardarea == G.jokers and context.joker_main
zealous glen
golden lake
#

joker_main is a very weird context

tulip scroll
golden lake
#

It only shows up one time in the source code

#

For Observatory voucher

#

Which isn't even a Joker

tulip scroll
#

what

golden lake
#

this is because ability is a reserved table in Balatro that exists because it automates the execution of a lot of jokers

#

ability.extra is not reserved

ruby geyser
short surge
golden lake
#

so you have to wrap your ability/config table in an extra{} table

golden lake
#

you want it wrapped in an extra

#

right now you have two issues

#

a) wrong context spec
b) wrong config spec

zealous glen
zealous glen
short surge
#

no it just got faster and faster

zealous glen
short surge
#

as if it's one hand played

#

i think it's how vanilla game deal with longer and longer executions

zealous glen
#

Because it doesn’t work in the shop

short surge
#

but what kind of execution happens in shop?

zealous glen
#

Also it doesn’t work when you draw individual cards

zealous glen
short surge
#

oh i see what you mean

#

probably a state event

#

check if anything in STATES.HAND_PLAYED would differ from, say STATES.SHOP

zealous glen
#

Ooh I found something

#

G.ACC… acceleration?

golden lake
#

ACC is conventional for storage

zealous glen
golden lake
#

yes

#

In a computer's central processing unit (CPU), the accumulator is a register in which intermediate arithmetic logic unit results are stored.
Without a register like an accumulator, it would be necessary to write the result of each calculation (addition, multiplication, shift, etc.) to cache or main memory, perhaps only to be read right back aga...

#

It's short for an Accumulator

zealous glen
#

Ah, accumulator

#

could've said that ^^

#

But it shows up in ```lua
G.ACC = math.min((G.ACC or 0) + dt0.2self.SETTINGS.GAMESPEED, 16)

golden lake
#

then that might be acceleration

#

this is why you should never abbreviate

#

abbreviation is the work of the devil

short surge
#

i use acc for accumulator in my code LOL

zealous glen
#

ok wh. T. abb.

short surge
#

i would have used spd for speed personally LOL

slow ocean
#

chat when I get home I have a coding quandry

zealous glen
#

Is that a pantry with four sides

slow ocean
#

Mostly because I can't parse what fields are returned in context consumable

golden lake
slow ocean
#

It's nothing too complicater

#

I just want to record when a consumable is used and check it against a list to see if it's been used before

ruby geyser
golden lake
#

oh you can probably look at Cruxite Dowel code then

zealous glen
golden lake
#

the var here has to be card.ability.extra.mult

slow ocean
#

I'm pretty sure it does but I'm not sure what field is recorded

golden lake
#

also Lyman I'm gonna send you the Cruxite Dowel

slow ocean
#

Or rather what I would check context.consumable.blah

golden lake
#
    SMODS.Jokers.j_cruxitedowel.calculate = function(self, context)
        if context.using_consumeable then
            if #self.ability.extra.consumables_orders < 3 and not context.blueprint then
                table.insert(self.ability.extra.consumables_orders, context.consumeable.ability.order)
            end

            if #self.ability.extra.consumables_orders == 3 then
                local table = self.ability.extra.consumables_orders
                local alch_idx = ((bitoper(bitoper(table[1], table[2], AND), table[3], OR) - 1)) % #G.P_CENTER_POOLS["Alchemical"] + 1
                local alch_name = G.P_CENTER_POOLS["Alchemical"][alch_idx].key

                if #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then
                    G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1
                    G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
                        play_sound('timpani')
                        local card = create_card('Alchemical', G.consumables, nil, nil, nil, nil, alch_name, 'crux')
                        card:add_to_deck()
                        if G.GAME.used_vouchers.v_cauldron and pseudorandom('cauldron') > 0.5 then
                            card:set_edition({negative = true}, true)
                        end
                        G.consumeables:emplace(card)
                        G.GAME.consumeable_buffer = 0
                    return true end }))
                end

                if not context.blueprint then
                    self.ability.extra.consumables_orders = {}
                end
            end
        end
    end
#

this is how Cruxite Dowel gets consumable IDs

#

its context.using_consumeable for the clause itself

#

and context.consumeable for getting the exact details of it

ruby geyser
golden lake
#

if you want to just know the unique detail of each I'd just like

#

make a table and each table would contain Order + Set

slow ocean
#

Oh bless up I'll have to look at that when I'm not on mobile

#

I just need the name is all

golden lake
#

yeah I told you

#

context.using_consumeable for the clause itself

#

context.consumeable for getting the exact details

slow ocean
#

Yeee

golden lake
#

So you'd have sth like

if context.using_consumeable then
  if table doesnt have this thing specifically then
    local result = {
      id = context.consumeable.ability.order
      set = context.consumeable.ability.set
    }
    table.insert(self.ability.extra.consumeables, result)
  end
end
#

because if you want to check if a consumable of any kind has been used then you just need 2 values

#

the order and the set

#

because order duplicates between sets

#

because the order refers to the position in the center pools

slow ocean
#

This was basically my code that I had earlier

#

The order and set explanation makes sense though

#

I wasn't doing either

golden lake
#

yee

silent sinew
ruby geyser
#

I'm assuming something in these context calls are wrong (I want it to gain +1 whenever a non-straight hand is played and reset when one is played)

broken vine
# short surge It works!

this is wacky and i wonder if manually replaying a hand twice could be used for some other fringe cases

maiden phoenix
#

Names of upcoming jokers for my mods

zealous glen
#

Was it you?

ruby geyser
maiden phoenix
#

Oh shit has it been done before?

zealous glen
#

I don't think so

ruby geyser
#

What's the proposed effect

zealous glen
maiden phoenix
#

If you play TBOI it's something similar to an item of the same name

maiden phoenix
silent sinew
#

i dont know how alchemical cards work programming wise but i just realized

#

if borax affects the actual deck then it'll be really good with integrity

wintry solar
#

any glsl shader whizz kids here?

ruby geyser
#

I have figured it out!

golden lake
#

good

gaunt thistle
#

is lovely behaving a ok? haven't been keeping track of things

ruby geyser
#

Ew wait I just realised Lua starts idexing at 1

river fern
maiden phoenix
ruby geyser
#

Actually I think I fixed it, it's to do with the elseif being linked to the context.cardarea if and not the context.before if

ruby geyser
#

Okay one last question (for now) How do I make the text of the card update after an upgrade?

silent sinew
#

use loc_def

#

example

#

just put any variable(s) in the table and in the card's description add #1# #2# etc for each one

ruby geyser
#

Great, cheers!

zealous glen
gaunt thistle
#

eg. it works on an older version but not a newer one?

frosty dock
zealous glen
frosty dock
#

I've had some stupid errors or things not getting parsed, but that more my incompetence to write regex than lovely

#

(i keep needing to remind myself to escape every bracket)

#

but no issues specific to 1.0.1e or 1.0.1f

zealous glen
#
version = "1.0.0"
dump_lua = true
priority = 0

[[patches]]
[patches.pattern]
target = "game.lua"
pattern = "if (G.STATE == G.STATES.HAND_PLAYED) or (G.STATE == G.STATES.NEW_ROUND) then "
position = "at"
payload = '''if (G.STATE == G.STATES.HAND_PLAYED) or (G.STATE == G.STATES.NEW_ROUND) or true then'''
match_indent = true
overwrite = true

This is what I tried (in an attempt to debug) but had no effect

frosty dock
#

are you sure the space at the end of your pattern exists?

#

these are extremely inconsistent and I feel bad for relying on something having or not having a space because it may well be changed at any moment

zealous glen
#

One shows up here but I guess I can try without it

zealous glen
gaunt thistle
#

hmm

frosty dock
#

i guess the pattern patch trims trailing whitespace?

gaunt thistle
#

leading

#

uhh maybe trailing too

#

I can't remember lol

frosty dock
#

leading, I was aware of

#

trailing, I've only really used in regex patches to find a unique anchor that would have otherwise required more text

#

dunno about pattern, but i guess that's how that works

gaunt thistle
#

I can't remember if I'm calling trim or trim_start on the line

#

yeah, trim, so it removes leading and trailing whitespace

frosty dock
#

hm yeah idk how i feel about that

zealous glen
#

This might be because I change the variable inside an event, but I’m not sure

silent sinew
zealous glen
silent sinew
#

whenever he talks the text doesn't show up and i'm not really sure why

#

i basically copied the card_character code

zealous glen
still jacinth
#

is there a way to make it so the game only has modded jokers?

night pagoda
#

how do you attach the text?

silent sinew
#

g.localization.misc.quips

night pagoda
#

yeah how do you insert the text into it

silent sinew
night pagoda
#
local additional_quips = { table_with = your quips }

for k, v in pairs(additional_quips) do
            G.localization.misc.quips[k] = v
            G.localization.quips_parsed[k] = {multi_line = true}
            for kk, vv in ipairs(v) do
                G.localization.quips_parsed[k][kk] = loc_parse_string(vv)
            end
        end

I have this loop to add text to the localiziation

#

(me when I was making talking card and then someone else makes the same thing 🥲)

silent sinew
#

ohh they need to be parsed?

still jacinth
#

im so confused
how would i make a joker that makes all of one rank act as every suit

silent sinew
#

damn that fixed it

#

thank you saluteCat

zealous glen
#

I think maybe Autumn or someone else had a Joker talk

rough furnace
#

What if I removed naneinf?

zealous glen
frosty dock
zealous glen
edgy reef
#

wait noooo

#

I forgot to have OBS mute my youtube playlist

#

bruh

still jacinth
#

this should work, right?

#

the joker is listed under "joat"

zealous glen
still jacinth
#

oh

frosty dock
#

yep you still need to call the original

still jacinth
#

so like this then?

frosty dock
#

uh not quite

#
local card_is_suit_ref = Card.is_suit
function Card:is_suit(suit, bypass_debuff, flush_calc)
  -- your code here
  return card_is_suit_ref(self, suit, bypass_debuff, flush_calc)
end
zealous glen
#

A better comparison of the speeds. If anyone else has dabbled in this any information would be helpful ^^

still jacinth
#

it still doesnt work?

#

im probably just rly dumb

#

lmao

zealous glen
#

Try moving it outside of init

still jacinth
#

still doesnt work

#

im trying to play a flush with 4 of one suit and a joker of another suit

#

jack* not joker

short surge
still jacinth
#

changed it to be "Jack of All Trades" instead of "joat" and now it works

rough furnace
#

bruh what is this check

#

why not just if G.GAME.chips >= G.GAME.blind.chips then?

frosty dock
#

lmao

royal ether
rough furnace
#

inf-inf = -nan for some reason

#

so then you can't win if the requirment is inf

quasi kettle
#

is there a mod reload button?

rough furnace
#

no

quasi kettle
#

darn

frosty dock
#

would inf >= inf not also be false?

rough furnace
#

inf == inf

#

so it should be true

#

yeah it is

frosty dock
#

oh mb i forgot it's not that weird

rough furnace
#

yeah just nan is that weird

#

lovely my beloved

frosty dock
rough furnace
#

Now we can go truely infinite

zealous glen
gaunt thistle
rough furnace
#

Well I mean my mod is litteraly just adding inf to this so if it does, it just straight conflicts with my mod

rough furnace
silent sinew
zealous glen
# silent sinew

Now I’d like to see mod interaction when you have both this and Balatrostuck

broken vine
#

oh god there's like 3 talking jokers in progress

zealous glen
broken vine
#

first the regular named joker yaoi scene has gotta grow

still jacinth
#

how do i define loc_def for #1# and #2#

nimble sequoia
#

Return an object with two elements in loc_def

still jacinth
#

oh ig that makes sense

golden lake
#

guys is this joker good

maiden phoenix
#

Joker gaming

gaunt thistle
#

society

still jacinth
#

can you do (card).ability.whatever, or can you only do (card).ability.extra

golden lake
#

ok so I'll explain this once here

#

card.ability is used by Balatro vanilla Jokers - it contains predetermined variables that are used to automate generic scoring abilities

#

card.ability.extra is whatever it needs to be - it can also be a table, and that's what we use in mods because it allows us to create our own extra variables that we have full control over

still jacinth
#

so i could do card.ability.extra.whatever

golden lake
#

yes

#

if you define that whatever

still jacinth
#

its giving me error: attempt to concatenate a table value

golden lake
#

i'm not engaging this further

#

read balatro source code

still jacinth
#

ok

#

i just

#

ok

#

theres just not really any way to fix it if i have no idea whats wrong

slow ocean
#

aaaaaaaaaAAAAAAAAAAA

#

why does it not like me using consumable

crisp coral
#

because it's consumeable

#

legally

slow ocean
#

oh my god

#

oh i never even changed my table insert

#

ok it works now but now im confused

#

ok am i dumb

#
                local result = {
                    order = context.consumeable.ability.order,
                    set = context.consumeable.ability.set,
                }
                for _, item in ipairs(tapestry_list) do
                    if item.id == result.id and item.set == result.set then
                        return nil
                    end
                end```
#

its working on checking for sets but not the specific card

crisp coral
slow ocean
#

oh thats

#

right

crisp coral
#

you're storing order and set

slow ocean
#

i changed my code again

#

factory melted my brain

#

we're so back

wild gyro
golden lake
#

lyman

#

do you love the trickster jimbo

mellow sable
#

new speedrun timer UI looks really clean

rough furnace
#

oh yeah wasn't that mod obuscated?

#

or was it changed?