#đ»ă»modding-dev
1 messages · Page 34 of 1
Next: The Luger
so wait the function card:add_to_deck is inside the ref?
and one end instead of two?
you need to keep a reference from before your hook to call inside
oh i gotcha
else the function refers to itself and you get infinite recursion
looks good đ
debug:
wtf
i put G.E_MANAGER:add_event in set_blind and it goes mental and does the thing inside the event infinitely
okay this happened when i tried to buy a jimbo
you forgot to return true?
your code runs for every joker you add
lol I'm dumb, I should have seen that
I think it needs an if name == X then
oh i see
too used to 1.0 add_to_deck
or some cleaner version
self.config.center_key == X, ideally
This should be a FAQ somewhere because people do not know how to create events
like this yea
hmmm yeah I do the event but no matter what delay I set the event doesn't seem to be delayed
oh nvm
I just put the delay in the wrong place, everything's okay
what did you do
is that not how i establish the center key?
no it's done for you
oh so by center key it just means my j_whatever
mhmm
as soon as I understood that I can just not return true I made this
can I have delay inbetween those events that don't return true?
that sound is very satisfying
Oh that looks very good
I had a different animation for changing the Blind score requirement
Oh since it doesnât return true itâs executed repeatedly until it does, interesting
I wanted to have a repeating event but for a different reason
Since I had a Joker that changed the requirement, the event to change the UI could try to do it before the UI exists
trying different sound and it's too much now
So my idea is to have an event that would recreate itself until the UI existed
I donât know exactly how they work, so I canât say, but you could follow my idea and have the event recreate itself
I figured I can create a step/frame counter and do something each X steps
Thereâs a better way with Events actually
Thereâs an event type called ease for this kind of event
Ease events need a table and a key to a numerical value in the table, and you tell them how long they should take
You can also choose from three default easings
ooh, are there any examples?
Yes
the "every x step" method in action (sound)
cool joker
where can I see them?
You can search the gameâs code for ease
ah, events witth trigger = 'ease'?
I think so
I used it to move a Joker
But in hindsight thatâs not the right way to move cards
I liked the original sound better but Iâd make it lower volume
I think the new one fits a bit more
I think itâs too high pitched :<
I like the original because it sounds more like paper
And itâs not too hard on the ears
yeah but blinds aren't paper they're plastic
Whoâs to say theyâre not dealing banknotes
a bit less agressive pitch
Thatâs less painful but personally I still prefer the other one
So would this code ensure that ghost cola doesn't show up until I change the flag when diet cola is sold?
I am certain that I'm missing something exceptionally basic, because the game's crashing on startup.
line 161 is the line above the highlighted one in the first screenshot
don't return that
Has anything changed about the code for how to destroy a Joker in SMOD 1.0?
I'm copying the same code that exists in a 0.9.8 mod, but it's giving me an error that I think is related to the fact that it can't identify what self is inside the event.
G.E_MANAGER:add_event(Event({
func = function()
play_sound('tarot1')
self.T.r = -0.2
self:juice_up(0.3, 0.4)
self.states.drag.is = true
self.children.center.pinch.x = true
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false,
func = function()
G.jokers:remove_card(self)
self:remove()
self = nil
return true; end}))
return true
end
}))
Oops! The game crashed:
main.lua:5572: [SMODS XKCards "XKCards.lua"]:162: unexpected symbol near '='
It got me a different crash
self should be card
xk_chilidog.calculate = function(self, card, context)
-- when scoring cards
if context.individual and context.cardarea == G.play then
return {
chips = card.ability.extra.chips,
card = card
}
-- Is it the end of the round?
elseif context.cardarea == G.Jokers and context.after then
if card.ability.extra.rounds_remaining <= 0 then
func = function()
G.jokers:remove_card(card)
card:remove()
card = nil
return true;
end
elseif card.ability.extra.rounds_remaining > 0 then
card.ability.extra.rounds_remaining = card.ability.extra.rounds_remaining - 1,
card.ability.extra.chips = card.ability.extra.chips - card.ability.extra.chip_mod,
end
end
end```
I'm just trying to do a basic food joker type thing. That it keeps crashing in that elseif section that's meant to decay the effect makes me think that's what I'm screwing up, somehow
why are there still commas
Because I still have a very loose grasp of lua, at best. đ
Thank you.
Why are you creating the flag here? It should be created when you register the Joker AFAIK
SMODS.current_mod.custom = SMODS.current_mod.custom or {}
SMODS.current_mod.custom.joker_deck = SMODS.current_mod.custom.joker_deck or {}
SMODS.current_mod.custom.joker_deck.jokers = SMODS.current_mod.custom.joker_deck.jokers or {}
SMODS.current_mod.custom.joker_deck.jokers["Joker"] = {...}
Everything I create in custom get overwrite by nothing... Is it normal ? Should I set custom data in Game Class instead ?
PS : I'm not creating jokers here, it's configs for jokers playing cards and wanted to save them here so it's easy for anyone to add their
It was not the case around ~10 version earlier, so I was wondering what changed
That can probably work but I just wanted to know :
G.mjst_config = G.mjst_config or {}
G.mjst_config.joker_deck = G.mjst_config.joker_deck or {}
G.mjst_config.joker_deck.jokers = G.mjst_config.joker_deck.jokers or {}
are you sure it gets overwritten? it might just be that SMODS.current_mod isn't available after load
you need to keep a reference to it if you want to keep using it
Either that or set it with the mod ID directly (i.e. SMODS.Mods.<mod id>.config).
SMODS.Mods[mod_id].whatever
Yes thank you
Iâm pretty sure this will be fine if I remember the pool stuff Iâve done correctly, but like victim said you can throw the joker parts in their creation, and just have the pool flag be set to false in apply to run. Both ways work though
Setting the flag to false is unnecessary though? nil is also falsy
You still need to create it though otherwise itâll error when creating the pool
iirc
Thatâs why you set it to false or true while creating the Joker
It depends if youâre doing yes or no
No it needs to be when the run starts otherwise itâll be the changed value on any subsequent runs, right?
No, otherwise having the option to set the flag when the Joker is being registered would be pointless
I think weâre talking about different aspects of it
The yes_pool_flag should be in the joker registration, but the pool flags needs to be in apply to run
It didnât in 0.9.8
Unless there were shenanigans I didnât pay attention to
Which could be the case given I was testing it with a custom consumable type
You couldnât add it inside the function but you can add it into the config afterwards.
Hmmm I was sure it was in apply to run for cavendish
Maybe it was taken care of automatically
Which SMODS should do if it doesnât maybe đ€
how do I count the current amount of tags?
or what is the "cardarea" alternative of tags?
found it, #G.HUD_tags
đ
The Loss Blind when
what does it do
It makes you lose the Game
that doesn't have any effect
#G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit
thanks
Look at "Cartomancer" for a ref
somehow your G.GAME.bosses_used.bl_bunc_final_crown is true instead of a number
huhhh
okay I know why
it's because I didn't create a new run and tested in the old one instead
weird and also đ€Šââïž
hooray
day 2 of waiting for add_to_pool
what's your font ?
The bottom row of this card text is a string that says (Progress: #3#). #3# is a variable that starts as "_ _ _ _" and has each of the underscores swapped out with the letter of a suit as you make a flush of that suit.
I tried including the parts that change the color of a string inside that string itself, but they just get printed literally. It looks like the color changes happen before the loc vars get swapped in.
So, would there be a way to make that part of the string gray if it's an "_" and red or black if it's the letter of a suit?
you likely have to use colour variables for this, and use separate vars for each character
something like {V:1}#3#{V:2}#4#{V:3}#5#{V:4}#6#{}
then you can put your colors into a table at vars.colours
I haven't used vars.colors before, where would I make that table?
right alongside your other vars in loc_vars
return { vars = { 'this is var 1', 'this is var 2', colours = { G.C.UI.TEXT_INACTIVE, ... } } }
loc_vars = function(self, info_queue, center)
return {vars = {
center.ability.extra.multGain,
center.ability.extra.mult,
center.ability.extra.progressList.spades and "S" or "_",
center.ability.extra.progressList.hearts and "H" or "_",
center.ability.extra.progressList.clubs and "C" or "_",
center.ability.extra.progressList.diamonds and "D" or "_",
}, colors = {
center.ability.extra.progressList.spades and G.C.BLACK or G.C.UI.TEXT_INACTIVE,
center.ability.extra.progressList.hearts and G.C.RED or G.C.UI.TEXT_INACTIVE,
center.ability.extra.progressList.clubs and G.C.BLACK or G.C.UI.TEXT_INACTIVE,
center.ability.extra.progressList.diamonds and G.C.RED or G.C.UI.TEXT_INACTIVE,
}}
end,
Giving this a try, thank you!
what am I doing wrong?
it says J03_MiladyRef is a nil value
when I try to read the joker's text
colours needs to be inside vars
you're not defining these values in the same place you're accessing them...
G is not the same as G.GAME
did the same here and it worked out fine
yeah but here you're defining the values in G.GAME
the values you put in G directly go unused
so how can I access that table from the main file
đ
just use the same table in both places
G.GAME gets initialized in Game:init_game_object() if that's of use to you
wait no more
AWESOME, you're the best!
yw
trying to use it, am I doing it correctly? (should never appear, but it appears anyway now)
just to be sure, what's the exact version you have?
will try nil for now
try 0616b with false
have you fixed blinds loc_var params
nil seems to work, trying 0616b
oh wait params
nvm, I'm not sure what to do about that
I don't have access to an object of the Blind class in that context
yup false also seem to work now, ty!
aight nice
two blinds use it already, more to come
I just realized loc_txt.label on consumable types is completely redundant
uhhh
what should I return in add_to_pool to not replace the normal behaviour?
noticed that my blind now started appearing as a showdown/finisher despite not being it
or I can simply not return anything, maybe?
not returning is the same as returning nil iirc
what should I return then?
The game uses it for Castle IIRC
I could pass through whether we're polling for a showdown boss
just as a utility
maybe it's cleaner to just look at boss.showdown and ignore if it doesn't match what's requested
what's your code editor ?
I need to check if the current round wants/requests a finisher blind somehow
Iâm gonna guess Sublime
I can build that into the check
looks dope with the colors and the font
it's just that it would be restrictive of blinds that want to show up in place of either
I guess that's fine?
updated again, check if this works
yup, one sec
also updated docs
doesn't seem to hijack my finishers anymore, good!
oh, I see, I can make it so it spawns as both types anyways, that's cool
ty aure!
what are functions that are executed just once as soon as you boot up the game and never later?
I need just one
can't you just put the whatever code you need outside of everything?
i tried and it doesn't work
The J03 table is needed to load the Joker's text. The function resetGlobalVars() is called whenever a new run is started, so if I start the run I can see Joker's text without errors. But if I open Collection and then I hover my Joker without starting a run, the game crashes as J03 is nil
What do you need that for?
for this @zealous glen
if I start the game, start a run and see Joker's text, all is good.
if I start the game, open the collection and see Joker's text, game crashes
But what does the Joker do
You didnât answer the question
makes you earn money
and the amount of money changes depending on Joker's rank
rank starts at 1 and increments whenever you use a tarot
but I already coded that part
Is it retroactive or not?
each new run sets all ranks at 1
But is it retroactive or not?
what do you mean
remember english is not my first language
retroattivo is also an Italian word
point taken
Iâm asking if it only counts while you have the Joker or if it counts before you acquire it
oh ok
if you use 5 tarots, then acquire the joker, the joker is rank 6
it is retroactive
You can set the values when you start a run but you shouldnât need all those table entries, or at least itâs probably better to keep it into a subtable if your modâs table
Or as always you can check if it exists or create it
Using table.key or (table[âkeyâ] = val and val) or something similar
thanks
Still can't get my head around https://discord.com/channels/1116389027176787968/1251515004566372403
hm I think that's something I need to consider just supporting
you can still populate the corresponding loc entry manually though
how?
nvm
you can just put unlock in your loc_txt
like
loc_txt = {
name = 'Name',
text = { 'Text' },
unlock = { 'This is how', 'you can unlock', 'this card.' },
},
So in the Joker definition, would that be in the calculate function, or where would I put it?
are you 1.0 or 0.9.8?
0.9.8 compatibility has been merged into Steamodded's main branch
everyone please test the thing until it burns up in flames
also includes better enhancement api, edition api, palette api and shader objects
** don't use the enhancement api just yet please, it's not quite done
not me about to go to bed and gonna end up with 69 pings tmr
also ping @sly forge when you find bugs đđđ
ok adding morefluff and codex arcanum to my modpack
YES
I think this is because my 0.9.8 check for Aura is failing now
probably same for betmma vouchers then
although that's a different error to waht I was getting
mine was where it was looking for the pos.extra on everything
I'll remove betmma since it also does something similar
let's see if it still works
ok it's going...
registering feels slower for the 0.9.8 mods
yeah, there's quite a bit of logic. especially localization... it's a million proxies
oh no, palettes
oh god not this crap
ok I'm going to try a smaller test
codex, morefluff, cryptid
same crash
those and bugfixed aura are the only mods
ok, the palette API is bugged
attempted fix merged into Steamodded
you might need to delete your settings though now
or maybe not
the settings should be fine with the new version
testing now with the mega modpack
9.8 mods I'm trying are codex, morefluff, and cruel blinds
the game launched, huge
woah
I have so many blinds
let's see if starting a run crashes my game
no it works
ink and color is still bugged for me for no reason :(
ok all it took is selecting a blind
and it appears to be talisman incompat with... codex?
time to disable the big number then
yeah, unfortunately talisman is going to be a pain with other mods
lua metatables suck
well, it let me implement localization. so it's not all bad
I need a screenshot with jimball and something from codex arcanum
just for the purposes of showing how powerful this update is
got a crash when hovering over the deck
it said C1 is nil
oh btw, 0.9.8 mods don't seem to have mod badges on their items
hm. some 0.9.8 mods will not, but most should
yo I hit foil from this deck
neither of the two that should do (one just adds boss blinds, and they don't have badges)
which mod doesn't add badges correctly?
in my limited testing all mods did have badges
How do I upgrade the level of a played hand twice? I'm looking at the code for the Space Joker, and it looks like its level up code is just a boolean true or false.
if self.ability.name == 'Space Joker' and pseudorandom('space') < G.GAME.probabilities.normal/self.ability.extra then
return {
card = self,
level_up = true,
message = localize('k_level_up_ex')
}
end
opening deck view is what crashes the game btw
I also have six suits
like hovering over it in a round
yeah, no badges
actually I am not seeing badges now too, not sure what's going on
ok, I'll look at this later
I think it's how alchemical cards are created
the jokers have the badge
but the alchemicals themselves don't use base 0.9.8 features iirc
they're an entirely custom api
not for morefluff
yes
ok will misprint deck break the game?
no it's not affecting colour cards :(
it does affect the packs tho
colour cards are also useless rn
virtual joker's downside isn't working
so it's just free X3 Mult
it looks like incompatibilities with mods I don't use cryptid are way worse than I thought...?
ok, but cryptid I just gave up on, it was really messing with things
wait how are you getting cryptid to work with 0.9.8 mods
new 1.0 update that can load 0.9.8 mods
I mean I have like 25 mods loaded @sly forge
not just cryptid
I also have like 20, but they're mostly bugfixed 0.9.8 mods... I do use Bunco
I have way too many personal bugfixes in my mods. the good thing about being a programmer: you can fix your Balatro mods directly so you don't have to waste time complaining to the author
yep
ok but in all seriousness, I'm up to help out any authors who want help
so far none of the crashes happened directly because of cryptid so đ€·ââïž
ok playing a card is crashing now
I think because I didn't one-shot a blind
and yes I have a lot of mods on
ok no I think it's some weird interaction with the boss I was facing
The Mask from Cruel Blinds
Bunco has a blind named The Mask too, right?
wait it's from bunco
my bad
that's the issue with no badges lol
Bunco 1.0 port btw
ah, I see. I've been testing with Bunco 1.0
as 0.9.8 was too broken to continue on with...
it's another one I gave up on
ok let's try this challenge out
jimball challenge
hey deck view doesn't crash when it's all stone cards

sync catalyst tech
Math you can play with palettes now too
Nice, which mods are you using?
a lot
cruel blinds included
gaming
only jokers that actually matter are the first two
ok bye for now
âWhat mods are you using?â
MathIsFun: âYes.â
Shouldnt you put sync catalyst after the xmult?
It should be at the end
Need to make some unnecessarily cruel ones now.
To cancel out Cryptid
I get a lot of +chips first so this increases the boost of the XMult
This Boss Blind gives your a Dog Joker then sells it
Whatâs a dog joker?
Itâs just a joke but I do have a Dog Joker
Crushing Clan, activate every cruel blind at once (except The Sword)
[unwinnable, cuz The Tide + The Water]
I'm trying to make a joker that gives +1 hand size for every $10 you have. What would be the best trigger for making sure this joker updates whenever you gain or lose money?
Hooking to ease_dollars
Ok
It doesn't look like it's working for me
local Original_ease_dollars = ease_dollars
function ease_dollars(mod, instant)
Original_ease_dollars(mod, instant)
for k,v in pairs(G.jokers) do
if k.name == "oneStroke" then
G.hand:change_size(-k.ability.extra.handSize)
k.ability.extra.handSize = math.floor(G.GAME.dollars / k.ability.extra.perDollar)
G.hand:change_size(k.ability.extra.handSize)
end
end
end```
I've tried a few variations on this code and none of them seemed to do anything
Thereâs a function to find jokers although preferably youâd want to find by key instead which now might be supported thanks to Myst
also âit doesnât workâ isnât helpful or informative
1.0
By not working, I mean that doesn't have any effect, not on the hand size or the tooltip of the joker, but it doesn't crash or anything.
How do I find by key?
Just do G.jokers.oneStroke?
ah it was this I think
But also looking at that bit of code aure posted itâs clear your issue is not using G.jokers.cards instead of G.jokers
But do use SMODS.find_card
Ah, that would do it. Thank you!
Also, you don't need to ping me with every response. If I'm asking a question, I'm probably going to be checking back here for the answer often enough that the ping is unneeded.
pretty sure in your joker def you can add yes_pool_flag = 'diet_cola_sold' and then have the G.GAME.pool_flags.diet_cola_sold = false in the apply_to_run
I'll try that when I get home. Thanks
the pinging gets so bad that i had to make it the server nickname here
Ok!
I just like pinging people to make sure they see my responses v_v
It's not that bad an issue, it's just a bit annoying to see two or three pings in a row about the same subject before I even get a chance to check.
Pinging is fine for messages that are a page or two back in the history, but If it's within a few minutes or a few messages, assume I'm going to see your response.
To be fair Iâve responded to people after theyâve asked me something and theyâve just never seen the response
And sometimes I myself ask and by the time I look again the conversation has moved on and I didnât get a ping for a response 100+ replies back
Fair enough! I guess it depends on preference and the size of the channel. I'm usually good at looking, so I don't need the ping, but I can understand it being different in other cases.
help
if G.STAGE == G.STAGES.RUN then
if self.ability.name == 'Scalper' then
local sell_cost = 0
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] ~= self and (G.jokers.cards[i].area and G.jokers.cards[i].area == G.jokers) then
sell_cost = sell_cost + G.jokers.cards[i].sell_cost
end
end
self.ability.mult = sell_cost
end
SMODS.Joker {
key = 'scalper',
loc_txt = {
name = 'Scalper',
text = {'Adds {C:blue}+5 sell value of all other owned Jokers to Mult'}
},
rarity = 1,
pos = {
x = 0,
y = 0
},
cost = 5,
discovered = true,
calculate = function(self, info_queue, center)
if self.ability.bonus > 0 then
return {
message = localize{type='variable',key='a_chips',vars={self.ability.bonus}},
chip_mod = self.ability.bonus
}
end
}```
your update function is missing two ends
and your joker's calculate function is missing an end
Also what are these arguments
The ROOK
calculate(self, info_queue, center)??
moment
where
i got pinged
oh no
Im sorry for your loss
til set_badges existed
how do I port this over to 1.0.0?
you can look at this for a list of what's changed
https://github.com/Steamopollys/Steamodded/wiki/02.-Migration-guide
looking at 1.0.0 mods also helps
what should i do for SMODS.INIT?
remove it
ok
Aure, do you have any guidelines you follow when writing docs or am I free to just write them in my own style?
does anyone see anything wrong with this .toml, i can't tell why it's not working.
[manifest]
version = "1.0.0"
dump_lua = true
priority = 0
[[patches]]
[patches.pattern]
target = "functions/state_events.lua"
pattern = "G.FUNCS.discard_cards_from_highlighted = function(e, hook)"
match_indent = true
position = "after"
payload = '''
if G.GAME.blind and not G.GAME.blind.disabled then
local hands = evaluate_poker_hand(G.hand.highlighted)
if next(hands["Flush"]) then
G.E_MANAGER:add_event(Event({trigger = 'immediate',func = function()
G.GAME.blind:disable()
return true
end}))
end
end
'''
hm, was the patch at least applied?
i figured it out, now. still don't know what was wrong tho
Having them in the same style as the rest would be nice
making a joker that doubles seals is harder than i expected
should i even be trying to hook the card functions?
actually i think i got smth
ok i got all of them working but purple
afaik you cant patch that file
I figured it out
my point stands
Does it need triple quotes around your pattern? Iâve had issues with that before
is there a way to bold text?
what is the correct way to call the table of hands here?
found
this should be good
having a negative joker be debuffed, re-entering the game, and selling that negative joker does not properly remove a joker slot (unlike vanilla behaviour)
you on newest version?
no i'm stupid
oh so it's fine?
play on orange stake, find a perishable joker in shop, change its edition to negative and then buy it
wait until it gets debuffed, exit and re-enter the saved game, then sell the joker
if you want a more grounded test without edition changing, play on anaglyph orange stake with RTGAME as seed, skip for the negative tag in ante 2 using the double tag, the second negative joker will be perishable and you can reproduce from there
you can also replicate this by having a negative joker be debuffed by crimson heart, exiting and re-entering, and then selling the debuffed joker
will investigate
check if any mods mess with card:save, card:load and card:remove_from_deck
i think those are the only functions that affect negatives selling
this doesnt reset the score counter to 0 x 0 after it triggers
yes a certain mod messes with those functions
(steamodded)
removing edition.toml fixes the issue so it's something there
(obvious but whatever)
yeah I thought we'd caught all the debuff stuff
okay I've fixed it on my end, just need it merging with main dev branch now đ
gg
I just tested this joker, and I found that while it technically works, selling it while in the shop instantly removes the extra slot it grants, meaning you can't replace it with whatever was in that slot.
Is there a way to tie an effect to happen at a later time, like when the shop is rerolled or exited, even if the joker that created that effect has been sold?
Currently I just hook into the Card:add_to_deck and Card:remove_from_deck functions and increase/decrease the shop slots by 1 in there
i guess you could use an event and wait to resolve it until the shop is exited or rerolled by setting a flag in the corresponding functions
Where would I store the flag? I don't want to leave it open to the exploit of "Sell joker, save and quit before rerolling/exiting shop, reopen game and it's forgotten the flag and you permanently get +1 slot"
G.GAME
anything saved to G.GAME persists through reloads
G.FUNCS.reroll_shop in functions/button_callbacks.lua
I found end_round in state_events.lua, but the closest I can find for rerolls is calculate_reroll_cost in common_events.lua
Ah it was in button callbacks. Thank you!
how do I make the left text box?
in loc_vars, insert a table into info_queue e.g info_queue[#info_queue+1] = G.P_CENTERS.m_glass for Glass Card's description
you can find more examples in generate_card_ui of functions/common_events.lua
ok thanks
and another thing
is there a table with all the possibile {C:colors} I can use on this server?
I swear I saw it somewhere but I can't find it anymore
you're looking for the loc_colour function in functions/misc_functions.lua
what if I want to add another color?
either you patch that function to include it, or you use colour vars instead
use lovely patch
ELIF
{V:1}text{} and specify the color in loc_vars/loc_def (depending on steamodded version)
you can have your vars table look like this
{ 'some var', 'some other var', colours = { HEX('03F4A5') } }
I have to add here?
locked_loc_vars = function(self, info_queue)
return { vars = { colours = { HEX('03F4A5') } } }
end
you need a different function for unlock text
ok, at I use {V:1}text{} in the unlock text?
I don't think because the game crashes if I do
I don't understand what you said
Show your code
^^
I want the Evolve text to have color #DB2109
SMODS.Joker { -- Hereward
key = 'Hereward',
loc_txt = {
['it'] = {
name = '{C:red}Hereward',
text = {'Crea una copia {C:dark_edition}negativa','del tuo {C:purple}Tarot{} piĂč','usato alla fine del round'},
unlock = {'{}Evolvi{} il Jolly','precedente','per sbloccarlo'},
},
['default'] = {
name = '{C:red}Hereward',
text = {'Create a {C:dark_edition}negative{} copy','of your most used','{C:purple}Tarot{} at the end','of the round'},
unlock = {'{}Evolve{} the previous','Joker to unlock','this one'},
},
},
locked_loc_vars = function(self, info_queue)
return {vars = {colours = {HEX('DB2109')}}}
end,
config = {extra = {Rank = 10}},
rarity = 2,
pos = { x = 0 , y = 0 },
atlas = 'Hereward',
cost = 7,
unlocked = false,
discovered = false,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = true,
linked_tarot = 'c_justice',
calculate = function(self,card,context)
if context.setting_blind then
PT_ROBINHOOD.RoundStart(card,card.ability.extra.Rank)
end
if context.end_of_round and context.game_over == false then
PT_ROBINHOOD.RoundWon(card,card.ability.extra.Rank)
end
end
}
Wheres your VïŒïŒ
You literally said it yourself
I wrote {V:1}Evolve{} and it crashed whenever I hover it while locked
lock_txt -> default -> unlock
ïœïœ
ïœïœïœïœăïœïœïœïœïœ ăïœïœïœ ăïœ ïœïœïœïœăïœïœăïœïœïœ
of course
ffs japanese keyboard
give me a sec
Ok this game is funny, now it doesn't crash but also doesn't color the text
did you read this_
locked_loc_vars
nvm you have
dont mind me
hm that might actually be a bug
is there some example of somebody else doing it and not crashing the game?
I'm fairly sure it's a bug I need to fix
but try on the latest version of steamodded just to be sure
yours is outdated
0601a
how do i upload?
you're on a commit from June 1st
git pull
just download the source again and replace the files, or git pull if you used git
where do I do that?
which folder
remember I am an absolute idiot when it comes to doing things
don't, if you didn't use git to install
why is my deck preview pulling the atlas wrong?
Skill issue
i used git
alright
me when morning
you need to do it in Mods/Steamodded
yeah
done
yippee
Oops! The game crashed:
main.lua:7015: nativefs not loaded and lovely --mod-dir was not in the save directory!
save dir: C:/Users/cerlo/AppData/Roaming/Balatro, lovely mod dir: C:/Program Files (x86)/Steam/steamapps/common/Users/cerlo/AppData/Roaming/Balatro/Mods
cannot read lovely --mod-dir, exiting
Additional Context:
Balatro Version: 1.0.1f-FULL
Modded Version: 1.0.0-ALPHA-0617b-STEAMODDED
Love2D Version: 11.5.0
Lovely Version: 0.5.0-beta5
Stack Traceback
===============
(3) global C function 'assert'
(4) Lua global 'set_mods_dir' at file 'main.lua:7015'
Local variables:
save_dir = string: "C:/Users/cerlo/AppData/Roaming/Balatro"
(5) main chunk of file 'main.lua' at line 7020
(6) global C function 'require'
(7) Love2D function at file 'boot.lua:323' (best guess)
Local variables:
c = table: 0x2286e1a0 {identity:false, version:11.5, accelerometerjoystick:true, modules:table: 0x2286e1c8 (more...)}
openedconsole = boolean: false
confok = boolean: true
conferr = nil
(8) global C function 'xpcall'
(9) Love2D function at file 'boot.lua:362' (best guess)
Local variables:
result = boolean: true
(10) global C function 'xpcall'
(11) Love2D function at file 'boot.lua:377' (best guess)
Local variables:
func = Lua function '(Love2D Function)' (defined at line 355 of chunk [love "boot.lua"])
inerror = boolean: true
deferErrhand = Lua function '(Love2D Function)' (defined at line 348 of chunk [love "boot.lua"])
earlyinit = Lua function '(Love2D Function)' (defined at line 355 of chunk [love "boot.lua"])
boom! pipebomb
I knew it
verify files on steam
lol no
@frosty dock destroyed my game
do you have a custom --mod-dir at all?
a ha
maybe I didn't make myself clear
gonna change this to:
I'll have to yell at @ejwu for that one, I think
remember I am an absolute idiot when it comes to doing things and I have no idea what are you talking about
I just need to know from you if you have configured any launch arguments on steam
no, i don't think
ok
will try to get this fixed, in the meantime you can install nativefs to get around that bug
I'm sorry to have disturbed you
in your mods dir
now my mod doesn't load
Sending the mod so you can check it without me sending all the code
are you using sublime ?
my god I am big noob
oh shit it's horus
Beats by Clubs
I have to add everything in one file?
i'm gonna faint
it works without the require function.
Will you restore its functionality or do I have to not use it ever?
any UI wizards know how to get this selector to be in line with the tabs in the top right?
Probably put it in the same column object
Or create a fake one and hope it works
I can try, but not using require doesn't mean you have to put everything in one file
load works
do you think you could make suit pages using a similar thing?
Cerlo's questions
you mean if there are loads of suits you can page through them?
I wish I knew the existence of that command before making one file
yea
potentially, although I haven't figured out the dynamic updating of UI stuff yet
yall should check out https://discord.com/channels/1116389027176787968/1252651252853112936 if you are all interested in a co-op multigame randomizer for balatro and 60+ other games
what is soul_pos?
if you could figure it out, it would be really useful
the position on the atlas for floating sprites
is there some mod that uses it? so I can check it out
it's exactly the same as your normal pos but for a floating sprite in front of the card, like legendary jokers
how do I tell which sprite?
on your joker atlas
how?
the same way you tell which sprite the joker uses...
Vanilla does
so
atlas = 'Background Sprite',
atlas = 'SoulSprite',
like this?
can you give a complete answer please?
vanilla isn't really the simplest when it comes to new joker creation
put them in the same file like the base game does, individual image files isn't good practice really
Tested out my code on two different comps with no steam install and they both booted with the local save data. Success! Now to figure out how to distribute it :P
My goto is to compute some diffs and just write a python script to apply them, but idk how that would work out with antiviruses
by any chance does anyone know how to make +hand and +discard jokers
Examples are examples
Ultimately itâs all built upon vanilla
I think usually the best way to approach modding is to see what exists in vanilla and then what exists in Steamodded
Then other mods
i got all the website stuff done for another mod compactđ
very poorly, this is how the old steamodded injector worked
you're probably better off using lovely with nativefs for a custom mods dir that's next to the executable
Smh wrongly spelt the Joker Evoution mod name
Unless it is meant to be spelt like that
shhhhh
hello
btw I'm glad to see my no-steam patch is working
...
It means there's a syntax error somewhere in your code.
ok
Whats that?
the game is hardcoded to exit if steam is not running
however the steam lib is completely optional and the game otherwise doesn't care if it doesn't exist
Does anyone know how I would find the tag associated with the current blind? I'm trying to make this joker work (right now it's just hardcoded to return an Uncommon Tag no matter what)
key = 'blue_joker',
loc_txt = {
name = 'Blue Joker'
text = {'{C:hand}+1{} hand'}
},
rarity = 2
pos = {
x = 0,
y = 0
},
cost = 5,
discovered = true
calculate = function(self, card, context)
if context.cardarea == G.jokers and not context.before and not context.after then
local hand = G.GAME.current_round.hands_left + 1
return {
message = localize {
type = 'variable',
key = a_hands
vars = {hand}
},
hand_mod = hands,
colour = G.C.HANDS
}
end
end,
atlas = "blue_joker"
}
SMODS.Atlas {
key = "blue_joker",
path = "blue joker.png",
px = 71,
py = 95
} ```
I don't really understand
(btw I am a amateur)
Looks like you're missing a comma after the lines containing rarity and discovered
Anything inside curly braces { } is a table, and all values within tables have to be separated by commas
key = 'blue_joker',
loc_txt = {
name = 'Blue Joker',
text = {'{C:hand}+1{} hand'}
},
rarity = 2,
pos = {
x = 0,
y = 0
},
cost = 5,
discovered = true,
calculate = function(self, card, context)
if context.cardarea == G.jokers and not context.before and not context.after then
local hand = G.GAME.current_round.hands_left + 1
return {
message = localize {
type = 'variable',
key = 'a_hands',
vars = {hand}
},
hand_mod = hands,
colour = G.C.HANDS
}
end
end,
atlas = "blue_joker"
}
SMODS.Atlas {
key = "blue_joker",
path = "blue joker.png",
px = 71,
py = 95
}```
I added some commas but i'm getting the same error
Oh that's cool
So I just patched out the part where it quits the game
parchmentengineer?
I'm not sure, I'm working on my own code right now
ok
Oh yeah I commented out that line and just set G.STEAM to nil so it doesnt bother checking on computers with no steam install
Luasteam is quite simple luckily
Any tips on setting up lovely and nativefs? Does loading nativefs first let lovely use a custom dir or something? Im unfamiliar with the software and Love2d are pretty limited
Does anyone know how to fix this?
dont know what that means so no
how can i get the joke to score for only some ranks, i can't figure it out
that feeling when you really want to code a joker's effect, but you don't have an inspiration for the design...
and then it hits you
odd todd even steven yaoi
rational randy
context.other_card
not quite!
Name: The Climbers
Effect: If played hand contains hand of higher level, upgrade played hand once
so this?
so if you play three of a kind with a leveled-up pair, it will level up three of a kind.
so a 33344 would upgrade full house?
no
if you had a level 1 full house, but a level 4 two pair
the next three full houses would automatically upgrade as if you got a space joker proc
it did not work
and yes, this would make pluto into a quasi-black hole
because every hand contains high card.
Alright, send the link. And is it 1.0 or not? Cuz right now, I'm still on stable (0.9.8).
i changed the code to this but the card doesn't do anything
Does the mod have back compat. to 0.9.8, like the Vouchers mod? Otherwise, womp womp.
No but I'll check with betmma
Bettma said that the latest SMOD version seems to be able to support 0.9.8 mods
Imma sleep
how do I change soul_pos based on a function?
you can't return both mult and chips, and you can't have two messages in one
is there any way to change the weights of booster packs? if so, how?
Ok, so I was able to get ghost_cola to only show up after diet_cola is sold. But when Ghost Cola is sold, it can still show up again. However, if I just change the flag back, then Diet Cola can spawn again. How would I juggle two different flags to manage these separately but also together, so that when Ghost Cola is sold, neither can show up again?
--In my Ghost Cola joker definition
yes_pool_flag = "diet_cola_sold",
--Code for the diet cola flag
local BackApply_to_run_ref = Back.apply_to_run
function Back.apply_to_run(arg_56_0)
BackApply_to_run_ref(arg_56_0)
G.GAME.pool_flags.diet_cola_sold = false
G.P_CENTERS['j_diet_cola']['no_pool_flag'] = 'diet_cola_sold'
end
-- Modifies the `diet_cola_sold` flag
local calculate_joker_ref = Card.calculate_joker
function Card:calculate_joker(context)
local ret = calculate_joker_ref(self, context)
if self.ability.set == "Joker" and not self.debuff then
if context.selling_self then
if self.ability.name == 'Diet Cola' then
G.GAME.pool_flags.diet_cola_sold = true
end
end
end
return ret
end
G.GAME.round_resets.blind_tags['Small'] and G.GAME.round_resets.blind_tags['Big']
Thank you so much!
Pulling that joker out of the scrap bin and giving it another shot
you may need to make it a tag object? i'm looking at the create_UIBox_blind_tag function here
All right. I've been poking around the tag code for that and other jokers, so I think I see how that should work.
I'm gonna make an "Old Passport" joker but idk what it should do
hey, does anyone know why the game audio becomes weird when you play a big hand? in this save, try playing a full house at 1x speed and pressing Escape before the hand finishes scoring, the background music will be weird
okay, so where in alpha do you define a joker's compatibility with blueprint and brainstorm? mine works, but gives "incompatible."
blueprint_compat in the joker def
gotcha
Alright, good luck. đ
I'm interested in a potential Deck Jokers mod becoming reality. Maybe unlocked by beating Gold Stake on said Decks, who knows?
You could give diet cola itâs own pool flag that you control when itâs sold too
...jesus christ this is a powerful combo--
the modded joker upgrades a hand if it contains a hand type of higher level than the played hand type... and all hands played contain high card.
is there a way I can change soul_pos during the game?
I tried soul_pos = function() but it crashes
you can change the soul_pos table directly at any time, but it will apply to all instances of the sprite
otherwise you can mess with the sprite object
So discard a high card, then play anything else
I got these "ranks" I want to show up on top of the Jokers, depending on their card.ability.extra.Rank, how can I do it?
every time I try to include the word function at the right of soul_pos the game cries
YEP
and even if you have the perfect hand
not as broken as you'd think since Burnt Joker is a Rare
like blue seals are still faster imo
just a thing that i kinda like about a joker i made
it is a synergy yea but it's not that broken
well, i initially never said it was broken; just powerful. and i think even if it isn't broken, it's still powerful
a good core to build a run around
I did soul_pos = {x = PT_soulPos(card), y = 3}, and this happened
PT_soulPos(card) is a function that returns an integer based on card.ability.extra.Rank, which is the x pos in the sprite
you'll probably want to use an update function to track that dynamically
soul_pos is a table and not a function, that's just how it works
how do I write so that every istance of joker acts independently from each other?
I tried this but it does everything except changing the soul_pos
checking it now
if its the latter, i think its because you need to do something with the soul Sprite object associated with the card
soul_pos changes, image doesn't change
what exactly?
because the Sprite is only created once when the card is created, any updates to the cards won't reflect onto the Sprite unless you modify it
ok, how do I change the sprite?
remember
honestly i got no clue because ive never worked with the sprite stuff
try looking thru card:set_sprites() and see how base game sets sprites
then modify it from there
should be something like card.children.floatingSprite:set_sprite_pos(...)
I did this and now it works
but a new problem appeared
when a new RobinHood Joker shows up, it has the latest updated sprite instead of the first.
When I rank up that new Joker it goes back to normal, which means I just have to call PT_soulPos when it spawns to solve the bug
so now the question is
how do I call a function when a Joker spawns?
set_ability
First image is what appears in the shop.
That Joker is Rank 1, and when I hover it (I put PT_soulPos(card) inside loc_vars), it comes back to Rank 1.
But when it first appears it shows Rank 2
After I hover it, it is Rank 1
âïž
Itâs in the Steamodded docs
Just pass it when building the Joker
Itâs a function
I don't know what the function does, I tried to read the game docs and I didn't understand
Card:set_ability() is called when the card is created
Modified it, same problem occurs
that's not how that works
you put set_ability on the joker object itself, like loc_vars
also this
got it
Does anyone have the source code of a joker pack
I did fix it as:
chip_mod and mult_mod aren't used for cards, instead it's just chips and mult
The messages idk how to make them work
for messages, you can just have an extra card_eval_status_text before your return that does the message of the one that return doesnt do
How can I make a joker multiply chips :p
thanks :)

please don't
?
the question they asked was how to do it not if they should
the game crashed when i attempted to do the following:
red isnt a message typwe
well you are. returning it
also that
i put it in another function i remembered i call when the card gets destroyed
i got the message working but it triggers after the chips have been added instead of before
why this happens when I don't use tarots?
because you returned {}
thanks
also changed the code to this so i don't have to call a separate function
and is there a way I can substitute that part with a function?
like this
i think return true works but correct me if i'm wrong
instead of this try return true
i solved that problem by not using return, thanks
managed to get it working
also i like this circle joker i made
2 and 7 come from 22/7 which is a unreasonably good approximation of pi
3 comes from 3.14 per obvious reasons
Talisman with the 0.9.8 compat in the new SMOD update is still broken right?
cause Talisman does something that the other mods don't like
It depends on which 0.9.8 mods you select
I tested it before with Cryptid, Codex, and more fluff and it didnât break
If youâre talking about the save reloading bug I fixed that yesterday
I've been trying it currently with a mix
because Talisman just tends to crash Codex for me (i'm using the git version tho)
which is git cloned
at least I was testing with DX tarots
Unfortunately mod devs have to manually update certain parts of the code to work with Talisman
Itâs a restriction in Balatroâs programming language that I canât really make easier
If you donât plan on breaking e308 you can stop the crashes by disabling the score unlimiter in settings and just using the animation skipper
Ah cool
and I know Reverie doesn't work for sure
local function loadCursesModule()
local js_mod = SMODS.findModByID("JeffDeluxeConsumablesPack")
-- Load modules
assert(load(love.filesystem.read(js_mod.path .. "source/curse.lua")))()
-- Add curses
setup_curses()
end
And for some reason this code chunk with DX Tarots is causing a crash on load
Hastebin is a free web-based pastebin service for storing and sharing text and code snippets with anyone. Get started now.
I believe I can make a small patch if all the other code doesn't get fucked
guys how do i make a card pack
wdym
Uhh, oki, how do I do that with the pics?
I think you were supposed to make 1x before 2x
I just used the Fandom image of Joker to edit, mb. đ
I didn't have any issues with the Hermit for editing, as shown here: #âă»modding-general message
this passport card might be a bit op
can someone make art for my jokers
Keep trying
I can but you have to wait 1 and a half weeks
You can use placeholder art for now
the steamodded documentation has a section on it I believe
is there a way to add seals and enhancements to the debug menu coding in controller.lua like you can use Q to go between editions of foil through negative. i tried but i dont actually know coding just work off what i see in the files and such
try the DebugPlus mod
well thats pretty much exactly what i was looking for, when i searched for debug i didnt see it i guess it wasnt relevant enough for the search in the modding channel
There's not really any way we can know how to fix that unless you provide some code or output logs
are you overwriting Card:update here?
Yeah it doesn't look like you use a hook there
what hook?
To create a hook you create a reference to a function then overwrite it but include the reference inside
you overwrite the Card:update function from the base game
If you overwrite the existing function, everything that assumed it worked as it did breaks
Which in this case is the entire game
Rather, you want to add to it
but if it's just for individual jokers you can add them as arguments when you create it
can you some me the fix? (im still rather new at being a mod dev)
So first you save a reference to the original function in a variable
Then you overwrite the original but include the reference inside
just define it the same way you define calculate functions
For example, in your above code:
local card_update_ref = Card.update
Card.update = function(self, card, context)
--code here
return card_update_ref(self, card, context)
Something like that. Whether you return the ref or not depends on what you want to do
Sometimes you call the ref first then edit the output, and return that
in fact
ok i'll test it now
what are your update functions even doing
I don't think you want to use update for that
then what?
add_to_deck(self, card, from_debuff) this would be better, right?
so i replace card.update with that
@solid salmon do you know how to access the balatro source code for reference?
no
No
you define it in your joker like the calculate function
do you have the source code?
Well, i'm not gonna distribute it, but I can send a link to a guide
I always find it fascinating seeing some of the people who decide to try and makes mods
Maybe one day thunk will release steam workshop support, or official modding support, something like that
It's been said before about so many skills, but the best way to learn how to make mods is to make mods
My first mods with my first games weren't that good at all, and I don't think I ever made anything worth publishing
But my experience there allowed me to do better the next time I tried modding a game, and that experience helped me for the next time, and so on
Card.update = function(self, card, context)
return card_update_ref(self, card, context)
if self.ability.name == 'Blue joker' and not (context.blueprint_card or self).getting_sliced then
G.E_MANAGER:add_event(Event({func = function()
ease_hands_played(self.ability.extra)
card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_hands', vars = {self.ability.extra}}})
return true end }))
end
end```
so how do make this have give +1 hand
and make it for discards
Is that for Steamodded 0.9.8 or 1.0?
1.0.0
Do you want this to happen whenever you play a hand, or just passively increase the number of hands like the Grabber voucher does?
like grabber
Okay. So, to make it work like that, the easiest way to do that is to modify the value of G.GAME.round_resets.hands
Instead of making something that changes when the joker is updated or calculated, you'll want two functions - one that gives you +1 hand when you buy the joker, and one that gives you -1 hand when you sell the joker
Wait hold up. You might be in luck
add_to_deck(self, card, from_debuff) oh look a handy function
take a look at the docs for the functions you can add to your joker
So, there's two ways to do this. There's the way that Ermel is suggesting right now, which is the correct way.
Alternatively, it looks like the game is set up so that if you have a joker that has a value of self.ability.h_size, it will automatically adjust the hand size for you.
This will work for literally just this specific effect you're trying to create here and no other effects, but it'll work.
i need to see an example from Eremel
Here, I can also share an example
ok
Okay I was wrong my way wouldn't have worked
h_size refers to how many cards you draw into your hand, not how many hands you have to play
You have to do this with the add_to_deck function, which I'll get an example for you in a second
zam
All right here we are
table.insert(stuffToAdd, {
object_type = "Joker",
name = "blueJoker",
key = "blueJoker",
config = {extra = {}},
pos = {x = 0, y = 0},
loc_txt = {
name = 'Blue Joker',
text = {
"+1 Hand"
}
},
rarity = 1,
cost = 5,
discovered = true,
blueprint_compat = true,
atlas = "jokers",
-- All the stuff above the line is just the standard joker setup, use whatever your mod has already
-- The stuff below this line are the relevant functions
add_to_deck = function(self, card, from_debuff)
G.GAME.round_resets.hands = G.GAME.round_resets.hands + 1
ease_hands_played(1)
end,
remove_from_deck = function(self, card, from_debuff)
G.GAME.round_resets.hands = G.GAME.round_resets.hands - 1
ease_hands_played(-1)
end
})```
add_to_deck = function(self, card, from_debuff)
-- function here
end,
I actually have to run now so I can't help you but theoretically you should be able to figure it out yourself from here
ok
yeah parchment got you
wait so do i just remove calculate?
well does your joker do any sort of calculation?
key = 'red_joker',
loc_txt = {
name = 'Red Joker',
text = {'{C:red}+1{} discard'}
},
rarity = 2,
pos = {
x = 0,
y = 0
},
cost = 5,
discovered = true,
add_to_deck = function(self, card, from_debuff)
G.GAME.round_resets.discards = G.GAME.round_resets.discards + 1
ease_hands_played(1)
end,
remove_from_deck = function(self, card, from_debuff)
G.GAME.round_resets.discards = G.GAME.round_resets.discards - 1
ease_hands_played(-1)
end
}```
the cards ae invisible
show all your code
yeah im just trying to make a chip version of swashbuckler
sure but the way you are doing it is wrong
and you're overwriting the base update function which I think is why you have no cards
we literally just went through this
oh the ref
no put it in your joker
oh
key = 'scalper',
loc_txt = {
name = 'Scalper',
text = {'Adds {C:blue}+5 sell value of all other owned Jokers to Mult'}
},
rarity = 1,
pos = {
x = 0,
y = 0
},
cost = 5,
discovered = true,
calculate = function(self, card, context)
if G.STAGE == G.STAGES.RUN then
if self.ability.name == 'Scalper' then
local sell_cost = 0
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] ~= self and (G.jokers.cards[i].area and G.jokers.cards[i].area == G.jokers) then
sell_cost = sell_cost + G.jokers.cards[i].sell_cost
end
end
self.ability.mult = sell_cost
end
end
end
}```
but i'm going the right way
yes
hopefully your cards are back now though
look at the docs and figure it out
it'll be better for you to work it out yourself and understand it rather than just copy what you're told
it'll be sort of functional in calculate but it's not the right place for it
[I was planning for Blue Joker to be +2 hands and -1 Discards, to make it a bit more dynamic than just the decks, but it's fine.]
Hi all, new to modding here. I'm working on a simple mod that just replaces the planets, and I had the mod working fine in Steammodded 0.9.8, but now I'm trying to understand if in 1.0.0 if there's a way to take ownership of a consumable and only replace its name in loc_txt without also having to replace its text since I'm not altering the text value. I tried naively just setting text equal to the object within G.localization.descriptions like below, and that got me an error message of "functions/misc_functions.lua:1866: attempt to index field 'colours' (a nil value)"
SMODS.Consumable:take_ownership('c_mercury', {
atlas = "Tarot",
loc_txt = {
name = "New Planet name",
text = G.localization.descriptions.Planet.c_mercury.text
}
})
I'm doing that
i've done that
Guys i forgot how to add releases to github
you cannot do loc_txt directly, you have to use a localization file or SMODS.process_loc_txt
i don't have an example on hand but try looking at some 1.0.0 mods
i do this and it works
tyvm Myst, I just found a good example in the SixSuits mod of how to override process_loc_txt in setting up a Planet that's working for me
i forgot how to add mods to github
At least part of the problem I was having (I think, very new, don't know what I'm doing) is that the planet text definitions use some maybe variables like {S:0.8,V:1} in the text. Removing those stopped the game from crashing for me, my guess is that I needed to return some correct values in loc_def, but I also didn't get that to work because, again, no idea what I'm doing. Taking what I need from here works though https://github.com/Aurelius7309/SixSuits/blob/master/SixSuits.lua#L263-L288 (thank you person who wrote this) which seems to overwrite process_loc_text successfully for me, and that generate_ui = 0 part is also vital
add_to_deck and remove_from_deck are 1.0.0 steamodded?
I believe those are 1.0.0 only, yeah
great