#💻・modding-dev
1 messages · Page 423 of 1
cant you just hook into create_tag
what's the crash
i don't know what i would do in that hook
whats the crash message
i've hooked something before but i still don't have a good understanding of it
does the joker do anything?
also a lot of paramaters are missing
like atlas
rarity
cost
yeah but im trying to see if the joker even appears in collection
I'm trying to make it have a X3 mult when you do a flush of diamonds
it should have a sprite
i think you need a comma at the end of line 25 but i could be wrong
plus you don't have any vars defined for the description
finish coding it and then see if it crashes?
maybe
take everything i say with shaker of salt
the only required parts of a joker are its key and localization
oh yeah
yea i was thinking of that cause as far as i know if it doesn't have an atlas its just regular joker
I've always defined "text" in the "loc_text" like so:
['text'] = { [1] = "Line 1", [2] = "LIne 2" }
May be your crash?
is this main.lua
yuh
this is how i did mine and it works
?
you dont need a comma on the last line
noted
oohhh
that's part of localization
if you want it to just display X3 then it would be {X:mult,C:white}X3{}
although i reccomend using variables(which requires a config i believe) so the value can change
hold up let me try
still crashing with the same error
ok but it's definitely something with the text i think
bumping this
yeah idk
Typed it out myself and doesn't crash. Anything else in the file?
man ive been trying for so long my brain isnt working apparently
i see the problem
first off
foo and bar are not pools
foobar is a placeholder word
also
uh
there's a lot wrong with that
i am aware i was just trying to get that working first
why is that and blueprint_compat indented
well you need to define foo and bar
in main.lua usually
because i use spaggetti code that i barely can read
im just trying to put all the jokers from my mod into one pool
i got confused because it had a colon on the steammods docs
which defines the pool as an object type
that's not part of the code block
so if you define your pool basically like i did then put it in your joker it should work
thank you ^_^
this is the entire code
maybe its the json file idk
chat my brain has completely shut off what do i do here (trying to add cards to the deck)
idk if im even on the right track
what
?
that's like the broadest thing ever though
ok uh
SMODS.add_card
see that's what i wanna say but
what if they want an edge case
the 1/10 in a 9/10 situation if you will
this might be a very stupid question but where is that in the docs
solved it
What was it, because I'm perplexed
it was maining a different main.lua for some stupid reason idk what even happend
why did you have 2 😭
that would do it
im new on ts dude 💔
🥀
🪫
ts?
"this shit"
i think set is like a pool/object type
like if you have a pool defined you can put it in set
i think
that worked for me anyway
i think area is what you need
the "e.g" staring you in the face
oh nvm
ok got it why's the mult thing completely black now 💔
can you send the loc_txt
There is.
loc_txt = {
name = 'Starrushers',
text = {
'Gives {X:Mult,C:White}X3{} Mult',
'if hand contains a',
'{C:attention}Flush{} of {C:diamonds}Diamonds{}'
},
},
you need to make Mult and White lowercase
OH
{X:mult,C:white}X0.5{}
0.5 is crazy
why'd you nerf it 🥀
SMODS.add_card({set = "Playing Card", rank = rank, suit = suit, seal = seal, edition = edition})
HELL YEAH WE GOT IT
congrats expect more like this in the future
i've only been modding for 2 weeks and my game has crashed so many times
and it
*it's always something stupid i did
bumping
bumpnado
petition to add a "Times Crashed" stat to the stats screen
that should be a part of debugplus
You would do if G.P_CENTER_POOLS["Poolname"][context.other_joker.config.center.key]
a mod (i forgot i think aikoyori's shenanigans) has a joker which gives mult depending on how many crash logs you have
No.
looks like flip does both a flip over and back
okay time to see how do i even make the joker mechanic work
yeah that's why i'm asking
did they change flip()
because before flipping would flip it over once
and then flip it up after calling it again
I would assume not.
ok but it didnt do this before
that's why i had flip twice
because i needed to call flip again to flip it face up
ok, so it looks like the flip() function is a toggle, according to lovely dump
Having problems making a Joker for my Balatro mod, cant be bothered resending the message so.. #💻・modding-dev message
Code?
keeps saying there's an unexpected symbol near '=' when thjeres nothing there
You already asked me, and unfortunately, your solutions dont work
sorry
so you do still have to call it twice?
why is it doing two rotations instead of flipping facedown then faceup?
does context.end_of_round exist for boss blinds?
maybe something about the nested events?
why is your atlas the filename
you killed a man
bro is flabbergasted
I have no idea
they're nested???
You need to remove all the extra }s and add in the missing ,s.
The bracket on line 19 like Somethingcom said does appear to be a problem.
something's right. the SMODS.Joker definition ends at line 19 because you have that final brace. you also wrote co0t instead of cost
how do i unnest them then?
no wait ,they're not
I saw the indentation and thought they were lol
oh ok
Yeah I realized the spelling mistake and fixed that already
do any of the other functions you use flip over the card by default?
maybe you're effectively doing flip -> flip -> do effect -> unflip -> unflip or something
when returning a func from an SMODS calculate function, where can you access that function again? i cant find it on the wiki
also, you're calling card.ability.extra instead of card.config.extra
well
I'm getting a new error now
"items/jokers.lua"]:20: '}' expected (to close '{' at line 8) near 'atlas'
Please install the lua extension.
the what
I think you need a return true after the event is over
I'm very new to this wdym Lua Extension
could be wrong, but that's what my code uses and I copied a lot of my code from other mods
install the lua LSP from here
ohhhhhhhh
after each?
is the one by sumneko better than the one by tencent?
it's 3 events as you can see
yes
Yes.
yes
does anyone know what these colors are called and if theres a hexcode converter
Finally got back into modding after 3 months of neglecting my mods
How do I quick restart my game again
HEX("HEXSTRING')
cool beans
if that don't work, I'm sorry 😔
yes
I'm still confused
by?
Did you install the lua extension?
ok, probably remove the first one then lol
but hover over it and see what it says. If it says something about return type, that probably means you don't need it unless you're trying to return something specific
from stack overflow
ok funny guy
ok yeah, probably just remove the return true's then
Yes, thanks for helping me, that actually worked, it shows me all the problems with my code
while you're at it, create a .luarc.json file in your mod directory with this in it
{
"workspace.library": [
"C:\\Users\\[PUT YOUR USER NAME HERE]\\AppData\\Roaming\\Balatro\\Mods\\Steamodded\\lsp_def\\folder",
],
"diagnostics.disable": [
"undefined-global",
"lowercase-global",
"need-check-nil",
"duplicate-set-field",
"inject-field",
"undefined-field"
],
"runtime.version": "LuaJIT",
"type.weakUnionCheck": true,
"type.weakNilCheck": true
}
this will give you much better autofill, and also stops all those unhelpful warnings from appearing
ohh ok cool
so maybe it's a return true after the last event only, then?
we'll see?
No.
Events don't require you to return outside of them.
New problem now:
[SMODS _ "src/game_object.lua"]:364: Failed to collect file data for Atlas rref_Jokers
damn 😔
that sounds like a file structure problem. do you have seperate 1x and 2x folders for your assets
ran this in (0.5x speed) to see what happens
it flips face down, juices up, flips face up
then does it again
then stays face up
yes
[though I didnt do the x2 assets yet for some reason)
if you didn't do them yet then that's why it's failing to find the file data
do you mind sending your code in a copyable format?
asking again since this got lost in the sauce
this channel really needs to use threads
yes
bet
I'm trying to convert my create_playing_card calls to SMODS.add_card calls I haven't a clue why this is crashing lol
do you mind sending your code in a
What do you mean access that function again?
i have a context.before that does a bunch of math to figure out what to do with the hand later, i want it to return a function that can look up a card to figure out what to do with it during scoring
well the crash is about emplace
maybe emplace the card?
i cut off the line numbers gdi
...SMODS.add_card does that automatically
ik
I think the problem is due to the card not being created correctly but idk why with the arguments I'm passing in
I did some digging into SMODS.create_card and it doesn't look like I need to define a suit
why are you changing them off of cpc anyway? isnt cpc better in this case?
How do you target a specific Joker's config values, or even target a specific Joker in general again
for _, joker in ipairs(G.jokers.cards) do
if joker.key == "fm_ward_of_dawn" or joker.key == "fm_shadowshot" then
G.E_MANAGER:add_event(Event({
func = function()
joker.ability.extra.charge = (joker.ability.extra.charge or 0) + extra_charges
return true
end
}))
end
end
fm_... is my mod's prefix
joker.config.center.key is the key.
dont you need a . after CENTERS
Oh yeahhhh gotcha
No?
somebody told me not to
or i guess yeah not here
I just like using SMODS functions for readability 
I tried using it, it didn't crash but it seemed to be ignoring the rank and suit I was giving it?
returning func from context.before calculate
Is it joker.ability.extra.xxxxxx or joker.config.extra.xxxxxxx to access a Joker's custom config values
or wait did you try the key format
wdym
like
{ key = blabla, set = 'Edition', config = if needed? i know perkeo does {extra = 1}}
i mean like this is the full code
SMODS.Tag {
key = "four-dimensional_tag",
atlas = "crp_tags",
pos = { x = 3, y = 3 },
name = "Four-Dimensional Tag",
config = { type = "store_joker_modify", edition = "crp_four-dimensional" },
min_ante = 8,
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = G.P_CENTERS["e_crp_four-dimensional"]
return { vars = {} }
end,
apply = function(self, tag, context)
if context.type == "store_joker_modify" then
local _applied = nil
if Cryptid.forced_edition() then
tag:nope()
end
if not context.card.edition and not context.card.temp_edition and context.card.ability.set == "Joker" then
local lock = tag.ID
G.CONTROLLER.locks[lock] = true
context.card.temp_edition = true
tag:yep("+", G.C.DARK_EDITION, function()
context.card:set_edition({
["crp_four-dimensional"] = true
}, true)
context.card.ability.couponed = true
context.card:set_cost()
context.card.temp_edition = nil
G.CONTROLLER.locks[lock] = nil
return true
end)
_applied = true
tag.triggered = true
end
end
end,
crp_credits = {
idea = { "Glitchkat10" },
art = { "Glitchkat10" },
code = { "Glitchkat10" }
}
}
er
wait do you mean the edition
yes
uhhh
yeah that's why i asked
here
SMODS.Edition {
key = "overloaded",
weight = 0.03,
shader = "overloaded",
sound = {
sound = "crp_e_overloaded",
per = 1,
vol = 0.5,
},
in_shop = true,
extra_cost = 0,
get_weight = function(self)
return G.GAME.edition_rate * self.weight
end,
config = { eee_chips = 1.03, eee_mult = 1.03, trigger = nil },
loc_vars = function(self, info_queue)
return { vars = { lenient_bignum(self.config.eee_chips), lenient_bignum(self.config.eee_mult) } }
end,
calculate = function(self, card, context)
if
(
context.edition -- for when on jokers
and context.cardarea == G.jokers -- checks if should trigger
and card.config.trigger -- fixes double trigger
) or (
context.main_scoring -- for when on playing cards
and context.cardarea == G.play
)
then
return { eee_chips = lenient_bignum(self.config.eee_chips), eee_mult = lenient_bignum(self.config.eee_mult) }
end
if context.joker_main then
card.config.trigger = true -- context.edition triggers twice, this makes it only trigger once (only for jokers)
end
if context.after then
card.config.trigger = nil
end
end,
crp_credits = {
idea = { "Glitchkat10" },
art = { "Glitchkat10" },
code = { "Glitchkat10" },
},
}
wAIT
wrong edition 😭
it is
SMODS.Edition {
disable_base_shader = true,
disable_shadow = true,
key = "fourdimensional",
weight = 0.2,
shader = "fourdimensional",
in_shop = true,
extra_cost = 5,
sound = {
sound = "crp_e_fourdimensional",
per = 1,
vol = 0.5,
},
get_weight = function(self)
return G.GAME.edition_rate * self.weight
end,
config = { retrigger_chance = 4, retriggers = 24 },
loc_vars = function(self, info_queue, center)
local chance = center and center.edition and center.edition.retrigger_chance or lenient_bignum(self.config.retrigger_chance)
local retriggers = center and center.edition and center.edition.retriggers or lenient_bignum(self.config.retriggers)
return { vars = { G.GAME.probabilities.normal, chance, retriggers } }
end,
calculate = function(self, card, context)
if
context.other_card == card
and (
(context.repetition and context.cardarea == G.play)
or (context.retrigger_joker_check and not context.retrigger_joker)
)
then
local should_retrigger = pseudorandom("crp_fourdimensional") <= G.GAME.probabilities.normal / lenient_bignum(self.config.retrigger_chance)
return {
message = localize("k_again_ex"),
repetitions = should_retrigger and lenient_bignum(self.config.retriggers) or 0,
card = card,
}
end
end,
crp_credits = {
idea = { "Glitchkat10" },
art = { "Glitchkat10" },
code = { "Glitchkat10" },
},
}
ahhhhh
oops
js realized
okay now i'm really confused
SMODS.Tag {
key = "four-dimensional_tag",
atlas = "crp_tags",
pos = { x = 3, y = 3 },
name = "Four-Dimensional Tag",
config = { type = "store_joker_modify", edition = "crp_four-dimensional" },
min_ante = 8,
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = G.P_CENTERS["e_crp_four-dimensional"]
return { vars = {} }
end,
apply = function(self, tag, context)
if context.type == "store_joker_modify" then
local _applied = nil
if Cryptid.forced_edition() then
tag:nope()
end
if not context.card.edition and not context.card.temp_edition and context.card.ability.set == "Joker" then
local lock = tag.ID
G.CONTROLLER.locks[lock] = true
context.card.temp_edition = true
tag:yep("+", G.C.DARK_EDITION, function()
context.card:set_edition({
["crp_four-dimensional"] = true
}, true)
context.card.ability.couponed = true
context.card:set_cost()
context.card.temp_edition = nil
G.CONTROLLER.locks[lock] = nil
return true
end)
_applied = true
tag.triggered = true
end
end
end,
crp_credits = {
idea = { "Glitchkat10" },
art = { "Glitchkat10" },
code = { "Glitchkat10" }
}
}
SMODS.Edition {
disable_base_shader = true,
disable_shadow = true,
key = "four-dimensional",
weight = 0.2,
shader = "fourdimensional",
in_shop = true,
extra_cost = 5,
sound = {
sound = "crp_e_fourdimensional",
per = 1,
vol = 0.5,
},
get_weight = function(self)
return G.GAME.edition_rate * self.weight
end,
config = { retrigger_chance = 4, retriggers = 24 },
loc_vars = function(self, info_queue, center)
local chance = center and center.edition and center.edition.retrigger_chance or lenient_bignum(self.config.retrigger_chance)
local retriggers = center and center.edition and center.edition.retriggers or lenient_bignum(self.config.retriggers)
return { vars = { G.GAME.probabilities.normal, chance, retriggers } }
end,
calculate = function(self, card, context)
if
context.other_card == card
and (
(context.repetition and context.cardarea == G.play)
or (context.retrigger_joker_check and not context.retrigger_joker)
)
then
local should_retrigger = pseudorandom("crp_fourdimensional") <= G.GAME.probabilities.normal / lenient_bignum(self.config.retrigger_chance)
return {
message = localize("k_again_ex"),
repetitions = should_retrigger and lenient_bignum(self.config.retriggers) or 0,
card = card,
}
end
end,
crp_credits = {
idea = { "Glitchkat10" },
art = { "Glitchkat10" },
code = { "Glitchkat10" },
},
}
Remove #
your edition key doesnt match the key in the tag
wdym
it's four-dimensional in both codeblocks
the latter
wrong thing mb
why havent you fixed the infoqueue
ignore the image
How would I make this only copied cards that aren't negative and make the copied card negative?
if context.using_consumeable and context.consumeable and context.consumeable.ability.set == 'Spectral' then
local copied = copy_card(context.consumeable)
copied:add_to_deck()
G.consumeables:emplace(copied)
end
?? i want the key to be four-dimensional, not fourdimensional
@daring fern "latter" generally means "the second"
yeah but it still applies; i'm not blind
I'm aware.
your infoqueue is still the centers
is this not right?
i'm not really sure what you mean by centers
then why did you question mark react lol
oh
i'm sorry y'all, i don't know lua 😭
wait how did I do that lol
I even looked at my code and still said the wrong thing
ITS ON THE SCREEN 😭
G.P_CENTERS
for _, joker in ipairs(G.jokers.cards) do
if joker.config.center.key == "fm_ward_of_dawn" or joker.config.center.key == "fm_shadowshot" then
print("Ward of Dawn or Shadowshot found")
G.E_MANAGER:add_event(Event({
func = function()
joker.config.extra.charge = (joker.config.extra.charge or 0) + extra_charges
return true
end
}))
end
end
In my snippet of code above, is it the right way to check for specific modded Jokers? For some reason it still didn't reach the print message
it JUST says G.P_CENTERS i have no idea what that means 😭
i thought i changed my edition's key to match the infoqueue
youre still using the infoqueue that uses centers
is that not the case??
you didnt change the infoqueue
yeah, i changed the edition key
do you remember this
i don't want to change the infoqueue from four-dimensional to fourdimensional, i want it to stay as four-dimensional. so, i changed the edition key to four-dimensional
am i stupid because a ton of this is just making me more and more confused
instead of this
use this
the key wasnt the issue
i didn't even know that was a thing
it's your formatting of the infoqueue
weirdd i've never seen that before
so like this?
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = { key = four-dimensional, set = 'Edition'}
return { vars = {} }
end,
How would I check if a consumeable is negative? context.consumeable.edition.negative gives me a crash telling me that edition is a nil value.
consumeable.edition.negative maybe?
i know you can do it like that for jokers
when you posted[ this message](#💻・modding-dev message), i thought you were referring to the beginning of the code for four-dimensional because it looked similar, so i changed four-dimensional's key thinking that's what you wanted
😭
NOOO IT WAS FOR THE INFOQUEUE 😭
That tells me that edition is a nil value, tried it already.
this just crashes btw
hrmm
your key isnt a string
anyway i think i'm done
...nope
it wants to index config
ohhh
right
eh?
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = { key = "four-dimensional", set = "Edition", config = {retrigger_chance = 4, retriggers = 24 } }
return { vars = {} }
end,
bump
did you forget the e_
it's an edition remember
card.edition and card.edition.negative
it needs the class tag
this joker is only spposed to aply to jokers in the "yip" pool but its working with all of them
You're supposed to check G.P_CENTER_POOLS["yip"][context.other_joker.config.center.key]
didnt we just do this
yeah but i didnt type the code right
oh lmao
also this causes a crash
Code?
G.P_CENTER_POOLS["yip"][context.other_joker.config.center.key]
i have no idea how that s got there
my bad
nnope still broken
"attempted to index field "other_joker" a nil value"
You still need to check for context.other_joker
ohhhhh
im dumb sorry
it doesnt work :(
i have this udner very joker i want it to apply to
is it possible to modify a joker's rarity on the fly?
actually, could i just use G.P_CENTERS?
Did you define the ObjectType?
Likely no, but probably yes.
i put it in the main.lua and not jokers.lua
hm, how would i go about targeting a random joker with G.P_CENTERS
like, a random joker in the collection
not a random joker owned
pseudorandom_element in G.P_CENTER_POOLS.Joker
is there any issue with this?
could you elaborate?
pseudorandom_element(G.P_CENTER_POOLS.Joker, pseudoseed("seed"))
alright, so this is probably not how i'm supposed to do it, right?
hm i can see many issues with this
this is complicated
Remove the G.P_CENTERS[] parts.
Many aspects of this are things ive never used before, so forgive my incompetence
I notice in vanilla remade, all things that use context.before, then use context.main_eval, I've made jokers without, and it works perfectly. what's the purpose?
Also the game would break with a modded rarity.
i plan on accounting for that later
i just want to get this working for now
i also just realized i have no easy way of testing if it actually works once i DO get it working
does anyone know why the joker isn't working?
does something like this look alright?
No, because you are overwriting a joker in the pool.
how do you add custom tooltips to a joker
You mean an info_queue?
yes
i want to credit someone
like other mods with lile artist tooltip
You would do info_queue[#info_queue+1] = {key = "key", set = "set"}
And put the thing you want at key in set in your localization.
noted, but i was having a problem with localization yesterday
it doesn't output what i want
ok wierd crash now
game.lua:2763: bad argument #1 to 'push' (boolean, number, string, love type, or table expected)
Stack Traceback
===============
(1) Lua upvalue 'orig' at file 'main.lua:612'
Local variables:
msg = string: "game.lua:2763: bad argument #1 to 'push' (boolean, number, string, love type, or table expected)"
(*temporary) = Lua function '?' (defined at line 31 of chunk [SMODS _ "src/logging.lua"])
(*temporary) = string: "Oops! The game crashed\
"
(2) Lua local 'handler' at file 'debugplus/console.lua:576' (from lovely module debugplus.console)
Local variables:
msg = string: "game.lua:2763: bad argument #1 to 'push' (boolean, number, string, love type, or table expected)"
(3) LÖVE function at file 'boot.lua:352' (best guess)
Local variables:
errhand = Lua function '(LÖVE Function)' (defined at line 575 of chunk [lovely debugplus.console "debugplus/console.lua"])
handler = Lua function '(LÖVE Function)' (defined at line 575 of chunk [lovely debugplus.console "debugplus/console.lua"])
(4) method C function 'push'
(5) Lua upvalue 'gameUpdateRef' at file 'game.lua:2763'
Local variables:
self = table: 0x0753d120 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x081386d8, F_ENGLISH_ONLY:false, viewed_stake:1, HUD:table: 0x080c31f8 (more...)}
dt = number: 0.0069605
(6) Lua upvalue 'update_ref' at Steamodded file 'src/ui.lua:84'
Local variables:
self = table: 0x0753d120 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x081386d8, F_ENGLISH_ONLY:false, viewed_stake:1, HUD:table: 0x080c31f8 (more...)}
dt = number: 0.0069605
(7) Lua method 'update' at file 'main.lua:1470'
Local variables:
self = table: 0x0753d120 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x081386d8, F_ENGLISH_ONLY:false, viewed_stake:1, HUD:table: 0x080c31f8 (more...)}
dt = number: 0.0069605
(8) Lua field 'update' at file 'main.lua:999'
Local variables:
dt = number: 0.0069605
(9) Lua function '?' at file 'main.lua:938' (best guess)
(10) global C function 'xpcall'
(11) LÖVE function at file 'boot.lua:377' (best guess)
Local variables:
func = Lua function '?' (defined at line 909 of chunk main.lua)
inerror = boolean: true
deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"])
earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])```
the stack trace doesnt touch my code. this crash happens about 1-2 seconds after the "cash out" button appears and this started happening when i manually added a function to the card.ability.extra table during the calculate function. (notably my desired functionality works now) any idea what it means?
alright, did some organization and switched around the = statement, is there anything wrong with this?
Yes, remove G.P_CENTERS[] on all of them.
guess you could call this one a crash out
bump
i'm lost, i'm trying to check for the rarity specifically on a random joker, unless i'm mistaken, the code i have here is setting card.ability.extra.current to the key of a random joker, and the if statements are checking for the rarity of the joker specified in card.ability.extra.current and subtracting the rarity by one, is that not correct?
whats your atlas definition
its just not triggering
its at least not crashing but its not triggering on the cards'
im not sure if its an issue with the joker or the pool
ok
then how isnt it just crashing?
is it using the base game enhancements file?
why?
No, because the atlas key would be modprefix_Enhancements.png
is the base game a mod?
No?
then why would it have a modprefix
They atlas that they are trying to use?
The button on the bottom updates the value which the cycle_option at the top adjusts (through its function). When I click the button, in the background the value updates, but not the cycle_option page. How can I change this through a function that is not the function associated with the cycle_option?
(Notably if I refresh the menu which this ui exists in, it does change the page, but that's because on creation the current_option is linked to the value which it sets with its function)
so its not even using a base game file
your game should be crashing right now
but somehow isnt
weird
base game's file is Enhancers.png
not Enhancements
but out of curiousity
why aren't you just using an Atlas?
yea no
you need to use an atlas
SMODS.Atlas{
key = "pick a name",
path = "fileName.png",
px = 71
py = 95
}
key is what you put as atlas in your enhancement
Acrobat should be a common tbh
so with this atlas, you would put atlas = "pick a name"
I just saw the effect, you shouldn't be using a pool for this.
what should i be using?
context.other_joker and context.other_joker.config.center.mod and context.other_joker.config.center.mod.id == "modid"
No desire to go to game discussion. I'm saying it in the context of looking through Vanilla rarities to make sure how to balance my own cards
Justifying commons is hard sometimes lmao
Also it is SMODS.Enhancement
atlas, not Atlas
what does your mod folder look like?
also do you have a localization file or what?
cause your enhancement wont have a name OR description
okay so apparently hotswapping rarities IS possible
what does your Enhancements.png look like?
ok
could you send me your mod in DMs so i can just see everything to do with your mod rq
you can remove any jokers or wtv
but atp i really dont get it
it WORKS oh my god
bro lost all aura in a matter of seconds
LMAO
is it gonna apply to ignoramus or was this just testing purposes
i just KNOW this fucking code is gonna get messy as hell when its done
its gonna apply to any random joker in the collection, i had it apply to just ignominiosa for testing purposes
thought so
How does this work if Cryptid isn't installed
cryptid is a dependency of my mod
You also need to move them in the pools.
Ah okay
how?
You would have to remove it from the previous rarity pool and insert it into the new one I think.
You would have to find it in the old pool then do table.remove(oldpool, index) then you would do table.insert(newpool, center) I think.
oh that sounds easy enough
for oldpool and newpool, are those the same number/name as the rarities?
like 4 for legendary or 'cry_exotic' for exotic?
Those would be G.P_JOKER_RARITY_POOLS[rarity], yes.
so something like this then?
or is there more
You forgot G.P_JOKER_RARITY_POOLS[]
oh okay, so this then?
No, you need to loop over G.P_JOKER_RARITY_POOLS[rarity] until you find the center and use that index.
what is the extra context.other_joker.mod doing here
if i donty have it the game crashes
ah
My mistake I meant context.other_joker and context.other_joker.config.center.mod and context.other_joker.config.center.mod.id == "modid"
for i, v in ipairs(G.P_JOKER_RARITY_POOLS[rarity]) do if v == center then table.remove(G.P_JOKER_RARITY_POOLS[rarity], i) break end end?
IT WORKS OMG THANKS
so both of the instances of rarity here are the pool i'm trying to remove from?
Yes.
awesome, can i do the same thing for the adding to the other pool as well? (for i, v in ipairs(G.P_JOKER_RARITY_POOLS[rarity]) do if v == center then table.insert(G.P_JOKER_RARITY_POOLS[rarity], i) break end end)
No, you don't need the loop, you would just do table.insert(G.P_JOKER_RARITY_POOLS[rarity], center)
so like this?
Actually no, it would be G.P_JOKER_RARITY_POOLS[rarity][key] = center
Also center needs to be the center of the joker.
alright, i think i'm getting closer
what exactly do you mean by this?
Just do local center = G.P_CENTERS[card.ability.extra.current]somewhere.
I think so.
alright, thank you so much for your patience
I know i can be a tad dumb when it comes to modding
sometimes
can someone help me with a tarot card real quick
im gonna go to bed after this one but i know im not gonna let myself sleep until then
now, time for the pseudoseed stuff
What is the effect?
whats the issue here
creates a negative copy of a consumable held in hand
its a tarot if that wasnt clear
If i do card.ability.extra.current = pseudorandom_element(G.P_CENTER_POOLS.Joker, pseudoseed("seed")), that'll set card.ability.extra.current to the key of a random joker in the collection, right?
whats the issue
Take reference from here: https://github.com/nh6574/VanillaRemade/blob/main/src/jokers.lua#L4846
i took reference from perthro
Yes, you need copy_card
the issue is that joker code and consumable code are different
G.E_MANAGER:add_event(Event({
func = function()
local copied_card = copy_card(pseudorandom_element(G.consumeables.cards, pseudoseed('vremade_perkeo')))
copied_card:set_edition("e_negative", true)
copied_card:add_to_deck()
G.consumeables:emplace(copied_card)
return true
end
}))
bump
No, you would want to do card.ability.extra.current = pseudorandom_element(G.P_CENTER_POOLS.Joker, pseudoseed("seed")).key
alright, cool
i love crash
Code?
and how would i make the key specified in card.ability.extra.current be wrapped in quotation marks? ('')
SMODS.Consumable {
key = 'fool',
atlas = 'reverse',
set = 'reversetarot', pos = { x = 0, y = 0 },
loc_vars = function(self, info_queue, card)
end,
use = function(self, card, area, copier)
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.4,
func = function()
local copied_card = copy_card(pseudorandom_element(G.consumeables.cards, pseudoseed('vremade_perkeo')))
copied_card:add_to_deck()
G.consumeables:emplace(copied_card)
return true
end
}))
delay(0.6)
end,
can_use = function(self, card)
return 1 < #G.consumeables.cards
end
}```
The key would already be a string.
It seems that it was overlooked in VanillaRemade that pseudorandom_element returns 2 values.
what shall i do then?
G.E_MANAGER:add_event(Event({
func = function()
local copied_card = copy_card(pseudorandom_element(G.consumeables.cards, pseudoseed('vremade_perkeo')), nil)
copied_card:set_edition("e_negative", true)
copied_card:add_to_deck()
G.consumeables:emplace(copied_card)
return true
end
}))
``` Perhaps?
it duplicates the card but it doesnt make it negative
Did you add copied_card:set_edition("e_negative", true)?
hm, what broke here?
do you not have lua extension??
Remove table.insert()
click run and debug and it should say you need an extension
i personally use the tencent one
most use the sumneko one (including me)
okay it just turned an exotic into a common instead of a legendary
Common Iterum 
this is the code that is supposed to make it a legenary
oh wait
i think it's somehow running recursively
how the fuck did that happen
whats the whole code
insanely cursed
config = { extra = {xmult = 1, min = 5, max = 20, tempxmult = 0, shapecount = 0}},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {key = 'batrocity_craig', set = 'Other', vars = {center.ability.extra.xmult, ((center.ability.extra.min + center.ability.extra.shapecount)/10), center.ability.extra.max, center.ability.extra.tempxmult, center.ability.extra.shapecount}}
return { vars = {center.ability.extra.xmult, ((center.ability.extra.min + center.ability.extra.shapecount)/10), center.ability.extra.max, center.ability.extra.tempxmult, center.ability.extra.shapecount} }
end,
calculate = function(self, card, context)
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].config.center.pools and G.jokers.cards[i].config.center.pools.Shape then
card.ability.extra.shapecount = card.ability.extra.shapecount + 1
end
end
if context.setting_blind then
card.ability.extra.tempxmult = (pseudorandom("Craig", (card.ability.extra.min + card.ability.extra.shapecount), card.ability.extra.max)/10)
card.ability.extra.xmult = card.ability.extra.tempxmult
elseif context.joker_main then
return {
xmult = card.ability.extra.xmult
}
end
end,
}
for some reason the xmult just continues growing which is not what I want,
how this code works is per shape joker, min mult is added by 1 but it just keeps growing and i dont know why
alright
of course that will become common 😭
thats because card.ability.extra.shapecount increases whenever possible
-# or, at any context if you understand 👍
i wouldnt advise doing this
what can i do to not do this or is it just inevitable
config = { extra = {xmult = 1, min = 5, max = 20, tempxmult = 0, shapecount = 0}},
loc_vars = function(self, info_queue, center)
local shape_count = 0
if G.jokers and G.jokers.cards then
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].config.center.pools and G.jokers.cards[i].config.center.pools.Shape then
shape_count = shape_count + 1
end
end
end
info_queue[#info_queue+1] = {key = 'batrocity_craig', set = 'Other', vars = {center.ability.extra.xmult, ((center.ability.extra.min + shape_count)/10), center.ability.extra.max, center.ability.extra.tempxmult, shape_count}}
return { vars = {center.ability.extra.xmult, ((center.ability.extra.min + shape_count)/10), center.ability.extra.max, center.ability.extra.tempxmult, shape_count} }
end,
calculate = function(self, card, context)
if context.setting_blind then
local shape_count = 0
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].config.center.pools and G.jokers.cards[i].config.center.pools.Shape then
shape_count = shape_count + 1
end
card.ability.extra.tempxmult = (pseudorandom("Craig", (card.ability.extra.min + shape_count), card.ability.extra.max)/10)
card.ability.extra.xmult = card.ability.extra.tempxmult
elseif context.joker_main then
return {
xmult = card.ability.extra.xmult
}
end
end,
}
you should do smt like this instead
-# i typed on discord so the indentation is fked, fix it on your end thanks :3
Lobotomy
where do i find my crash logs
ok thanks
wat
like, the rarity goes back to exotic after reentering the run?
can_use is set up wrong
game crashes when i use my consumable
no i mean if you start a new run the modified rarity persists
change center in loc_vars to card
-# not that it affects anything
it says "tried to compare to nil"
i mean, yeah
you are changing the pool itself
i’m just curious, where did you figure out all of this stuff?
who
is there any way to reset it when you start a new game?
yeahhpiehh
just dont change anything in the pool at all
i kinda have to, it's apart of the joker's effect
id suggest comparing your code to stuff in here, most of it is set up wrong
what is it
decreases the rarity of a random joker in the collection by 1 per reroll
with that out of the way
this doesnt exist (jokers.ability.extra.jokers)
so you are comparing with nil here
stuff in config extra will be in your jokers.ability.extra, basically, but im assuming you wanted to refer to jokers.ability.extra.cards here
-# god jokers in place of card is so cursed
how do i check if a modded card is part of a pool?
like i wanna give 1.35 per specific joker of this certain pool, which code is that?
Bump
if G.P_CENTER_POOLS["poolkey"]["moddedcardkey"]
ok thanks
:3 i cant tell if my reading comprehension is just horribly fked up or this is very confusing to understand
Probably the latter, I am very tired
yeah i understand
itd be easier if you can provide a clearer explanation of your problem though :p
I am trying to change the page that the option_cycle is on via another ui element (the button below it)
But I cannot figure out how to access the value which controls which page it is on
wait what would i put for "moddedcardkey"
The key of the card you're checking.
oh ok
would it be possible to have a joker whose functionality is handled entirely by other cards? (related question, what would the parameter be for checking if the player doesnt have the joker)
im new to modding so idk
your loc_txt needs to have a second } for the end of it
oh
can you show me your create_option_cycle code rq
download lua extension!!!!
local t = create_option_cycle({
id = 'ante_cycle_page',
label = "Ante",
w = 4,
options = antes,
no_pips = true,
opt_callback = "change_search_ante",
func = 'change_search_func',
colour = G.C.PURPLE,
current_option = Showman.config.SEEK.search_ante or 1
})
one sec
like this right
The func was an attempt to solve this, it isn't helping though sdaly.
there
realized how stupid i am
have you tried changing Showman.config.SEEK.search_ante to see if that cycle changes?
just an idea 🤔
make sure you also have a comma so that the code actually continues reading past that point
If I back out of the menu and go back in though, it does update to that.
how bout if i just wanted to make them to give xmult similar to baseball?
i see
context.other_joker
thx bro it fixed
yeah so i guess it doesnt update until manually made to do so, so you have two approaches here:
- make the code reopen the ui
- have func check its current_option, if its changed then call e:recalculate(), probably
np
Would changing Showman.config.SEEK.search_ante count as changing the current_option? Or is there some other way I am supposed to be able to edit that node's current_option value?
based asf tag bepis
local t = create_option_cycle({
id = 'ante_cycle_page',
label = "Ante",
w = 4,
options = antes,
no_pips = true,
opt_callback = "change_search_ante",
func = 'check_co_change',
colour = G.C.PURPLE,
current_option = Showman.config.SEEK.search_ante or 1
check = Showman.config.SEEK.search_ante or 1
})
...
G.FUNC.check_co_change = function(e)
if e.check ~= Showman.config.SEEK.search_ante then
print("work please??")
e.current_option = Showman.config.SEEK.search_ante
e.check = Showman.config.SEEK.search_ante
e:recalculate()
end
end
probably smt like this?
thank
what would I add to check if the pool is my modded pool?
It would be the same?
where do i put my textures for my seals
Doing something like this yields no good result, it seems that recalculate is never called, leading me to think that the func isn't getting called at all.
yeah but it checks all jokers, and gives 1.35 even for regular jokers
Mmm, still no.
Code?
If it matters this is an options ui element, not something within the main game screen.
No
huh
config = { extra = {xmult = 1.35} },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.xmult } }
end,
calculate = function(self, card, context)
if context.other_joker then
if G.P_CENTER_POOLS['Shape'] then
return {
xmult = card.ability.extra.xmult
}
end
end
end,
}
changed again again, try 
:3
You need to check if G.P_CENTER_POOLS['Shape'][context.other_joker.config.center.key]
ah ok thanks
Nope
(sidenote, change FUNC to FUNCS)
G.FUNCS.change_search_func = function(e)
if e.current_option ~= Showman.config.SEEK.search_ante then
e.current_option = Showman.config.SEEK.search_ante
e:recalculate()
sendDebugMessage("recalculated!")
end
sendDebugMessage("## test!")
end
It won't even print "## test"
sob
(that's the one you made, I just didn't change the name)
i guess func just doesnt work the same in create_option_cycle, somehow
uhhhh
err, UIBox_Buttons
my last approach would probably be to add a func to the G.UIT.C/R containing that node to change it instead
How would I access the option_cycle's current_option from the G.UIT.R though? Is there a get_child_by_id (or something) function, and that would let me do it?
oh wait
can you try changing func to opt_callback in the create_option_cycle, just to check smt 🤔
How could i discard all the cards held in hand? any idea?
Definitely doesn't work
I get a crash on recalculate
Well that makes sense because opt_callback is called on the button press of the option_cycle
I just doubt func was ever getting called and thus why it wouldn't try anything
But this is the error, so I am not sure it is a great sign.
ngl at this point probably just run the function that opens the ui 😭
i have no idea
change the :recalculate() part with the function that opens your ui
That's disappointing that there isn't a better way to do it. That just feels wrong.
config = { extra = {xmult = 1.35} },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.xmult } }
end,
calculate = function(self, card, context)
if context.other_joker then
if G.P_CENTER_POOLS['Shape'][context.other_joker.config.center.key == "Shape"] then
return {
xmult = card.ability.extra.xmult
}
end
end
end,
}
I dont think i did my code right because it just doesnt work? can anyone help?
dont think anyone is gonna help us
womp womp
why r u saying womp womp literally no one is gonna help you or me right now probably
give the code
the place where the error is
so if another joker is in a certain pool, give 1.35X mult?
alr hold on
yes
yea so
your atlas is wrong
what in the atlas is wrong
copy the key from the SMODS.Atlas over to the atlas part of the config in your seal
those have to be the same
ooooooooohhhhhhh
the atlas config in an object literally is "what key do i use?"
should be if G.P_CENTER_POOLS["poolName"][context.other_joker.config.center.key] then
i think
no idea what that means
lua doesnt know wtf youre on about
syntax errors are gibberish to a coding language
so where do i go to fix it
fix the big red line
i dont see it
This particular one is about the rule that every { needs a } to close it. Just like every ( needs a ), and [ with ]
You need to have Lua extention downloaded to see errors (red underline)
where do i find lua extention
ok
where do i find that
im using microsoft visual studio
whats vscode
extentions has its own menu in vs studio
the poolname is Shape but still dont work
Visual studio code
see if anything has the joker that triggered's key
Yes
ok
I'm off to bed, good luck
ok
Just remember a programmer's best friend is Google/any search engine
until you find specific documentation or forums
then those become your best friend
and NOT chatgpt
(stares at three specific people)
which command do i use for that?
you dont know lua do you
a complex for loop
for i,v in ipairs(table) do
end
i mean i know for loops but how do i check if the joker is part of the pool
iterates through table (in order in ipairs, whatever the hell it feels like if pairs) and you can run code for each item in it
tbh idk how pools store their info
so idk on that
Can chatgpt even manage to do anything aside from a very basic joker lol
idk but still not good practice
not at all
dang ok ill just try reading other codes thanks
i still dont see the syntax error
when in doubt, plagiarise cryptid /j
that it doesnt think exists
I'm sure after feeding it vanilla remade jokers, it could do something simple with some strong direction. But at that point you probably can just do it yourself if you have enough prompt engineering skills to start chatgpt to making a joker
I'm not using smods in any of my work 😅
Then again I'm not making jokers so
what are you making
The Soul but in game
the soul is in the game
Everything works in just ironing out the fine details
ah
did you not get the lua extension
i did
then there should be
the big ass red underline
this right
yes
oh i see the red lines
managed to iron out some of them
but idk how to fix the others
????
uhhh dude
the comma after end line 206
I can't help with the rest partly because Idk shit abt events, and mainly bc i can't understand the formatting for the life of me
what am i doing wrong?
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = { key = "e_crp_four-dimensional", set = "Edition", config = { retrigger_chance = 4, retriggers = 24 } }
return { vars = {} }
end,
SMODS.Edition {
disable_base_shader = true,
disable_shadow = true,
key = "four-dimensional",
weight = 0.2,
shader = "fourdimensional",
in_shop = true,
extra_cost = 5,
sound = {
sound = "crp_e_fourdimensional",
per = 1,
vol = 0.5,
},
get_weight = function(self)
return G.GAME.edition_rate * self.weight
end,
config = { retrigger_chance = 4, retriggers = 24 },
loc_vars = function(self, info_queue, center)
local chance = center and center.edition and center.edition.retrigger_chance or lenient_bignum(self.config.retrigger_chance)
local retriggers = center and center.edition and center.edition.retriggers or lenient_bignum(self.config.retriggers)
return { vars = { G.GAME.probabilities.normal, chance, retriggers } }
end,
calculate = function(self, card, context)
if
context.other_card == card
and (
(context.repetition and context.cardarea == G.play)
or (context.retrigger_joker_check and not context.retrigger_joker)
)
then
local should_retrigger = pseudorandom("crp_fourdimensional") <= G.GAME.probabilities.normal / lenient_bignum(self.config.retrigger_chance)
return {
message = localize("k_again_ex"),
repetitions = should_retrigger and lenient_bignum(self.config.retriggers) or 0,
card = card,
}
end
end,
crp_credits = {
idea = { "Glitchkat10" },
art = { "Glitchkat10" },
code = { "Glitchkat10" },
},
}
how do I create a negative consumable using SMODS.add_card {}?
add edition = "e_negative" to the end of the params
bump (and extra related question, would taking ownership and pasting in vanillaremade code be a good way to try and see what works when messing around with stuff like that)
tried it before, doesn't work
what would the parameter be for checking if the player doesnt have the joker
you'll want to useSMODS.find_card(). I used it to check if the player had any of three "brother" jokers in my mod (the # checks for the number of those cards instead of looking for a t/f statement)
in your case, you'll want an if not SMODS.find_card(j_id_name) then
well you need more than just the set and edition
key is missing
full key doesnt need to be a string here?
yeah I know, idk why removed it
pretty sure it does, but I could be wrong
I was told it should be
oh ok
still doesn't work
should it be brackets rather than parenthesis there
random question but why is your closing brace on a separate line to your closing parenthesis
byump
are you creating a joker or a different card?
could it possibly be because you arent returning any variables in your loc_vars below the info_queue?
I thought you need a comma after the edition parameter, too
morning
a consumable
morning
want this to give copy of last used consumable
use create_card not add_card
if its a table the last line typically doesnt need a comma since the table is expected to end if a comma isnt used
returning funcs
huh, the more you know
also it seems like Dex is filling in for N' rn lol
trying a bit haha
I don't know everything, but I know enough to help with jokers and atlas stuff
yeah its an interesting quirk i learned, though i suppose i learned it due to any creation of objects requiring commas up until the last line (since the object creations are also tables)
taking a stab at this again, anyone know what's wrong here?
what part of this isnt working exactly
what does the extra = {} in the soul_pos do?
third layer
There’s no such thing as an init function on a smods object
very cool
like that? still creates normal, not negative consumables
hey eremel
thank god, i thought i was going insane and nobody was gonna bring it up
ive seen it in cryptid?
exponentia utilizes it
"cryptid is dark magic"
Cryptid has a weird loading system it’s probably for that
what should i use instead?
in truth cryptid is spaghetti
would calculate work
yes
assuming you want init to happen as soon as the card appears
if you want it when it enters your slots, there's a context for that
i was simply overthinking it i think
happens
They’re just normal hooks, put them outside the joker entirely
i was forgotten lol
this
Though the hooks are pretty scuffed tbh
oh right i was here bc i had an issue:
I have an enhancement that counts every time it's played. The third time it's played, it self-destructs but provides 3x mult. The issue is that no matter what i try, I can't seem to get a joker to increase every scored timer by 1 whenever a timer hits 3. The image is my most recent attempt
want this to give copy of last used
you should also have a thing inside the if ignis then check that turns ignis back to false. Otherwise, it'll stay true forever
why would the first two hooks that i had before not crash while the last two do crash?
four mluff.....
That can't be isn't the only issue, but that was definitely a big one, ty
What is congruentia supposed to do?
why this one isn't working ( a deck that destroy played card if the played card have multiple suits)?
set mult to chips when chips exceed mult and vice versa basically
does G.hand.highlighted only exist prior to playing cards?
That could be the reason (I've used .highlighted literally once lol)
you can just do a min function for that
wdym
Afaik it's the selected cards, I've used it before but I could probably just use context.scoring_hand
That is absolutely not what that description says 😂
I misspoke-- a max func. Just put
chips,mult = math.max(chips,mult)
``` wherever you need the code to go
if you have 100 chips and then mult goes to 200, chips instantly jumps to 200 as well
yes
if you use this correctly, it will make the lower of the two values jump to the higher of the two values
i'm trying to do it with mod_mult and mod_chips because they constantly update instead of just doing it after scoring or something
oh, interesting
Give me a few minutes to get off my phone and I can type up a rough structure for you
is tehre a way to make a message from card_eval_status_effect last longer onscreen
taking this for example (something i know works perfectly) is a boss blind that makes mult always equal to 1
also howdy riley funny seeing you here
updating during scoring, it simply keeps mult at 1 no matter what you do
whats the key for specific spectral cards?
is it just their names or do i put spectral_ before them?
and yet the EXACT SAME THING, using hand_chips instead of 1, doesn't work
hiya!
all consumables are just c_modid_key
that includes spectrals
the vanilla ones
then just c_key
"Omg, all of them actually triggered properly this time, maybe-"
crash
"FUCK-"
I made progress, but it still gives an error
i only see delay but that seems to be something else
this probably won't matter, but you should indent the return to be inside the function def
nvm delay was just so low i didnt notice the difference lmao
yeah no difference with fixed indentation
It seems to be tripping this line of code in another mod i have installed, and i cant figure out why
its just so weird to me because theres like
almost no difference in the hooks
yet one crashes and not the other
again, im trying to make it work like this
where it updates during scoring, rather than after
which SHOULD work fine, assuming mod_mult and mod_chips dont completely break
local congruentia_mult = mod_mult
mod_mult = function(mult_change)
local result = congruentia_mult(mult_change)
if next(SMODS.find_card('j_ast_congruentia')) then
if mult + result > hand_chips then
hand_chips = (mult+result)-hand_chips
end
end
return result
end
I think this should do what you need
oh hang on no
that's better
I still think you could use a max function
can you make a custom one instead of the vanilla tooltips?
Yes, my mod has custom ones if you need refs
Tho im on phone so I cant pinpoint where its localized
checking it out
and thans
ks
Check for "set ="Other""
wait this is tags
okay ive never seen a crash like that in my life
No
assuming congruentia_mult() returns the higher value of the two, mult + result will always be bigger than hand_chips
Thats for tooltip desc
You want to make a joker tooltip?
But a custom one right?
yes
Or like referencing smt
Then check this https://github.com/SDM0/SDM_0-s-Stuff/blob/3f2a119366faeb1a3171d90cc9a0200d4c08d7f6/data/jokers.lua#L115
nah custom
And find the key in the loc/default.lua
sick
hold on
no it won't, congruentia_mult just returns the value you're changing mult by respecting any modifications done by other mods
do you know what happened here? i cannot tell what crashed here but it might be talisman?
Ye
oh it might need to_big jank if you're a filthy talisman user
You should check vscode definitionsnor whatever theyre called
I cant seem to escape this error on this joker, which annoys me bc of how close it is to being done


