#💻・modding-dev
1 messages · Page 21 of 1
i have no idea
as far as i can tell my code does all the same things Photograph does but it is clearly unaffected
(this happens upon reloading a run)
That’s super odd
LETS GO
legendary oddity moment
this is awesome
Is it time to add tiny blind and large blind as variants of small and large blinds?
large blind as variant of large blind...
Oh wait big blind
this was because of leftover stuff from nonconsumable oddities mb mb
is this due to set ability
damn this is a good pack XD
yes maybe?? i hook set ability tho
seal stuff is borked
cooking
this is so pog champ
I'm adding codex/morefluff/fusion jokers compat
youre gonna have to add Con Air for Balatrostuck when we release
actually wait
Con Heir
I've never read homestuck actually but for sure
Compats are always fun
i think you should read homestuck..
We should really do compat with Reverie on our end @quasi jetty
what if i crank up those numbers
<- still doesnt know what reverie does
does anyone have a link to github page or something im on mobile so i cant find it
thank
akai we should collab
Balatrostuck sadly has no space in either Aspects or Zodiacs for compat because we're working with preset things
Neat
what if i make balatro of isaac put in more aspects"
what if i hack ur code
and make more aspects
did u ever think about that
huh
theres only 12 aspects
what if i unaspect your aspects
13 if you count Piss
Piss
theres unlimited aspects if you just make shit up
there is a canonical Homestuck character whose classpect is Gent of Piss
this is not a joke
this is real
also autumn here's the thing i did for the loc_txt on blind selection
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = "local loc_target = localize{type = 'raw_descriptions', key = blind_choice.config.key, set = 'Blind', vars = {localize(G.GAME.current_round.most_played_poker_hand, 'poker_hands')}}"
position = "after"
payload = '''
if blind_choice.config.key == 'bl_myst_ancestor' then
loc_target = localize{type = 'raw_descriptions', key = blind_choice.config.key, set = 'Blind', vars = {math.ceil((G.GAME.round + 1) * 1.5)}}
end
'''
match_indent = true
overwrite = false
it sucks
but it works
myst is it possible to do multiline patterns
iirc no
you can with regex
yeah regex
oh god
i know everyone loves regex
shoutout that one website that lets you test regex
i think its called regex101 or something
it's https://rustexp.lpil.uk/ for the regex library being used iirc
A Rust regular expression editor & tester.
there are different flavours of regex?? hell naw
they are NOT aspects
reverie website is very cool epic
what if i do it anyway
same but too bad i suck ass at and hate front end

i havent read nor learned anything about homestuck outside of this discord server so anything is an aspect to me
Everything is an aspect if you believe hard enough
exactly
Aspect Of Arachnei
aspect of aspect
@quasi jetty how do you handle frontend without going insane
From my experience backend has been the worst to me
aspect of homestuck
Aspect of Autumn
i wish i started on frontend because that shit is so easy to find a easy job for
relatively
lol imagine using your technical expertise in the workplace hahahahahaha
man i hate being a factory worker
im unemployed rn... 😔
Imagine having technical expertise but job offer says "nice driver licence you got there.... not"
me when i have two college degrees but no high school diploma or GED...
Did you do a two-in-one cursus?
no more vouchers
o7
huzzah

NO!!
vouchless
Itay do you think its a bad idea if I add fusions to my mod before Steamodded 1.0.0 comes out?
it's okay to add them, i will do some porting work on fusion today as well
Neat
faded voucher (legendary oddity) - redeems a random voucher
thoughts?
can it redeem vouchers without dependencies?
no
autumn can you make a big chunugs oddity
wtf lucky voucher
why
pleaseee
why dont you make a big chungus oddity
i can make the art for it..
you can make the Meme Mod
you should add it tho
why
Autumn can you add the Big Pooper Shit 1000 as an oddity too?
no
Worst mod
true
that was fast
what the hell would it even do
be big
be chungus
If Autumn doesn't add it I'll put it in mine 👍
no
:((
its for autumn only
this is so sad
Make "Aspect of Chungus" then
you think new modders come in here, see us talking about big chungus oddity/aspect and immediately leave
i dont think
oh true mb
Imagine Jokers?
Is there any released mod on 1.0.0 yet ?
cryptid
It just shows how talented and deranged we are
What’s radioactive even do?
i'll try to make mystblinds work on 1.0.0 tonight, no work on graveyard tho
might also discontinue mystjokers in favor of graveyard
😭
Hmmm alchemical that progresses exchange coupon? 🤔
tiny chungus
like the one for morefluff colors! I like it
Try svelte, it made my life easier and happier
what element would it be?
okay but does svelte have this
https://react.dev/?uwu=true
i saw some post somewhere saying react uwu mode uses some like cutting edge thing to load faster or something
real
LETS GOOOI
it's not staying
NOOOO
i'm not adding literal trash that does nothing to the pool
did aure change something with atlases in the last day
oh my fucking god how did i write this wrong
steamo by steamodded
ok i genuinely have no idea what beyond the "Loader improvements" is breaking my atlas
I forgor 💀
aure you keep forgerting
two hours of gbj this time
steamodded 1.0.0 is getting delayed again 💀
you just shouldn't use the mod prefix anywhere
Isn't it that in GameObject.Sprite :
if not self.raw_key and self.mod then
self.key = ('%s_%s'):format(self.mod.prefix, self.key)
end
When I create something it's duplicated by pref_pref_item and pref_item
Very cool
qhar
the pipe fusion in the shop is crazy
is prefix added to sprites now
yeah you're not supposed to use it in your code
yeah, except for playing cards
it's scuffed for playing cards
oh my fucking god
Uhh I looked through the list of elements but didn't really find one goes well with movie
nvm it still crashed LMAO
Tbh I'm not familiar with alchemical thing
make sure you don't call register on the sprite
it's done on call now
okay so register is removed everywhere?
for sprites I manipulate the key in register apparently, so double calling it is a problem
yep
Yes I'm stupid I totally did that
lol
early film was treated with nitric acid
i should call her
(i dont know how reliable this is as a source)
o-3
???????/
in response t othis
okay if i do this
SMODS.Sprite({ key = "MystBlinds", atlas = "ANIMATION_ATLAS", path = "MystBlinds.png", px = 34, py = 34, frames = 21 })
the atlas should be myst_MystBlinds right
assuming my prefix is myst
yeah, but unless you put raw_atlas_key = true on a blind you then register, myst_ also gets prep ended onto your specified atlas
So you should also just give it 'MystBlinds'
i think blinds are just borked cuz i tried to do em too but it didnt work :(
im not gonna touch 1.0 until it's finalised
I'll investigate then, it's probably my fault
Also, uh... requires on vouchers, there's no good way not to have you specify the prefix
since it's a point of interaction between mods and also the base game
because of people like you smods will take way longer to develop
aure can you also check whether cards' set_ability function gets called
I’m waiting until it’s finalized and/or I can reference other mods to port
shore
oh it's one of those...
the new pattern patch trims trailing whitespace
death
the space is what makes the line I'm using there unique...
regex patch it is
now lemme see what tf is wrong with blinds
uh
it doesn't crash for me, but it's still wonky
wtf
nvm I'm not using an atlas
LMAO
Sprite and AnimatedSprite are ever so slightly infuriatingly different
Ummm... the new 1.0 patch kinda broke my sprites XD
aureeeee
@frosty dock get over here
i tried doing it without register, it didn't fix the problem it seems
you also must not use the prefix
'alchemical_atlas' here, 'alchemical_atlas' there and nothing else, the prefix getting prepended should just be internal
oh there's mod prefix for sprites now?
where is it placed, at the start or at the end?
key = 'key' will turn into 'prefix_key' internally, but prefix is also prepended to the atlas of other objects you create
so what value will i need to put for it to work?
the same as the value you input for the Sprite's key
then im not sure what the issue is with the sprites
since it seems like all of the sprits in the mod are broken
are your cards' atlases the same as the sprite's key
hmst
i have no idea what's going on Xd
it should work with not calling register...
same issue
latest
SMODS.Sprite{key = "ca_icon", path = "ca_icon.png", px = 34, py = 34, atlas = "ASSET_ATLAS"}
this is the example of me trying to load the icon sprite
it does not load it
and how are you using it?
bold of you to assume I'll bother finding that
wdym?
--- STEAMODDED HEADER
--- MOD_NAME: Codex Arcanum
--- MOD_ID: CodexArcanum
--- MOD_AUTHOR: [itayfeder, Lyman]
--- MOD_DESCRIPTION: Adds a new set of cards: Alchemy!
--- BADGE_COLOUR: C09D75
--- DISPLAY_NAME: Codex Arcanum
--- ICON_ATLAS: ca_icon
--- PREFIX: codexa
----------------------------------------------
------------MOD CODE -------------------------
SMODS.Sprite{key = "ca_icon", path = "ca_icon.png", px = 34, py = 34, atlas = "ASSET_ATLAS"}
ah no
this is the entire thing that uses this sprite
oh the mod icon thingy
perhaps there's an issue with the sprite location?
that got changed because it was causing issues
it's an issue with sprite loading in general
it needs to be called modicon now
idts
yeah it loaded the icon sprite correctly
but that's so odd
since it should also load the other sprites
but it doesn't
wdym
every time i try to look at a card from the mod, the game outputs this crash
this one?
yes
can you show me the code for registering one such card
SMODS.Alchemical = SMODS.Consumable:extend {
set = "Alchemical",
prefix = "c_alchemy",
cost = 3,
atlas = "alchemical_atlas",
loc_def = function(self, info_queue)
info_queue[#info_queue+1] = {key = "alchemical_card", set = "Other"}
end
}
function CodexArcanum.REG.c_alchemy_ignis()
SMODS.Alchemical{
name = "Ignis",
key = "ignis",
config = {extra = 1},
pos = { x = 0, y = 0 },
loc_txt = {
name = "Ignis",
text = {
"Gain {C:attention}+1{} discard"
}
},
can_use = function(card)
if G.STATE == G.STATES.SELECTING_HAND then card.config.in_booster = false return true end
return false;
end,
use = function(card, area, copier)
G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function()
ease_discard(card.ability.extra)
return true end }))
end
}:register()
end
can you not use SMODS.ConsumableType
oh?
why not?
oh wait i do use it
but i have some uniform data for all of my alchemicals
so putting their data like that is better
but it also gives me this error with vouchers and booster packs
you can still provide defaults in the consumable type's inject_card function
it's better for compat since it also provides collection UI and whatnot
i will change it then
the issue with this one is that default atlases don't get prepended
base SMODS uses these to refer to the vanilla spritesheets
how do i make it prepended?
by providing it to the constructor of the object instead
like, for each object
SMODS.Alchemical { atlas = 'blah', key = ... }
or enter the default with the prefix
then why does the problem appear with vouchers as well?
function CodexArcanum.REG.v_mortar_and_pestle()
SMODS.Voucher{
name = "Mortar and Pestle",
key = "mortar_and_pestle",
loc_txt = {
name = "Mortar and Pestle",
text = {
"{C:attention}+1{} consumable slot",
}
},
config = {extra = 1},
pos = { x = 0, y = 2 },
atlas = "ca_others_atlas",
redeem = function(center)
G.E_MANAGER:add_event(Event({func = function()
G.consumeables.config.card_limit = G.consumeables.config.card_limit + 1
return true end }))
end
}:register()
end
this causes the exact same crash?
yes
try without register
it is without register
your snippet isn't
the voucher without register?
nothing needs register
is the sprite "ca_others_atlas" or "ca_ca_others_atlas"
...
i am very very sorry for wasting your time like this XD
oh wait it didn't fix it
removed it from everything now, still causes issues with the alchemicals and boosters
boosters are your thing, not mine
the problem is a sprite registry issue
the booster's atlases will need to be wary of the mod prefix
still no
check how mine are set up feder
it's an issue of atlas values set as default on a class not getting prepended by a mod prefix because they don't belong to a mod, usually
i see
okay all is fixed now
thanks a bunch!
and again
very sorry for the problems
congrats on delaying the 1.0 release just a bit more
apples
aure i think youre the one delaying it by making blunders /j
so true
delayed
gonna have to schedule a release for 2025 at this rate
it will be so good
And aspects too?
we will add ADS and MICROTRANSACTIONS to Balatro
50$ for vouchers
Steamodded 1.0 feature request: A Pay to Play mode where you have to register your credit card and buy all the jokers by charging your card to Aure's account
gambling with real stakes
where does the money go
to aure
yes i have, I'm not looking at lovely dumps
we don't encourage gambling around here
but poker
think about all the money youd make aure
currently I'm more so thinking about how that _front.atlas got there
tempted to make a cross mod challenge mod
i had that thought like two weeks ago lmao
integrated challenges
could go into jestobiology tbh?
ok thank god it works
it took way too long for me to realize I didn't allow suit colors to just be passed as a string
aure can you throw me the six suits
no, don't have it ported
I'm just using a test mod that I added stars to
got this working again without a version being specified
can you throw me the stars
i need to throw the fix first
oug
💀
autumn has 1500
new commit is upstream
SMODS.Sprite {
atlas = 'ASSET_ATLAS',
path = '8BitDeck.png',
key = 'lc_cards',
px = 71,
py = 95,
}
SMODS.Sprite {
atlas = 'ASSET_ATLAS',
path = '8BitDeck_opt2.png',
key = 'hc_cards',
px = 71,
py = 95,
}
SMODS.Sprite {
atlas = 'ASSET_ATLAS',
path = 'ui_assets.png',
key = 'lc_ui',
px = 18,
py = 18,
}
SMODS.Sprite {
atlas = 'ASSET_ATLAS',
path = 'ui_assets_opt2.png',
key = 'hc_ui',
px = 18,
py = 18,
}
SMODS.Suit {
key = 'Stars',
card_key = 'R',
hc_atlas = 'hc_cards',
lc_atlas = 'lc_cards',
hc_ui_atlas = 'hc_ui',
lc_ui_atlas = 'lc_ui',
loc_txt = {
singular = 'Star',
plural = 'Stars',
},
hc_colour = HEX'DF509F',
lc_colour = HEX'DF509F',
pos = { y = 0 },
ui_pos = { x = 0, y = 0 },
}
tablecalls look so wrong
and the sprites
😔
actually nevermind, just hmu when you're done porting six suits
or someone ports a suits mod
these are up on six suits github
okay
i'll just throw stars inside graveyrad
sweet
self.ability.extra seems to be returning nil in jokers' loc_def
and config.extra is defined?
can you throw me the code for that joker
it works because i can throw it ingame
local joker = {
name = "Spectres", slug = "spectres",
config = {extra = 1}, rarity = 1, cost = 4,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = true,
loc_txt = {
name = "Spectres",
text = {
"{C:mult}+#2#{} Mult for every",
"card in the {C:attention}Graveyard{}",
"{C:inactive}(Currently {C:mult}+#1#{C:inactive} Mult){}"
}
},
}
joker.calculate = function(self, context)
if SMODS.end_calculate_context(context) and G.graveyard and #G.graveyard > 0 then
return {
message = localize{type = 'variable', key = 'a_mult', vars = {#G.graveyard}},
mult_mod = #G.graveyard
}
end
end
joker.loc_def = function(self)
if not G.graveyard then return { 0, self.config.extra } end
return { #G.graveyard, self.config.extra }
end
oh wait
self.config.extra isn't used in the calculate
it should be ability.extra for jokers
no self?
This is an anti-Wheel of Fortune server
it seems i get my first mod working, good
lovely
Rock and roll
you can choose one from three identical stone card from the standard pack
wrong
if you unstone them they will have different suit and rank
so clearly they are different stones
but i banned every way of unstone a card, so they are the same
the certificate gives 0/15 blue seal

been digging about in the base code
anyone know where the code for the splash joker is found?
state_events.lua
thank you
g.funcs.evaluate_play
Quick question, how does the legendary system in 1.0 actually work?
like, i know there is a way to define a "legendary" consumable, but how do I define one?
you need to set hidden = true
the card can then show up when pack cards of a set are generated that either matches that of the legendary, or another specified one in soul_set
you can also set the rate at which they show up (soul_rate, defaults to 0.3%)
oh so i set the soul_set as Alchemical (for my type)?
yeah
that's a static field, it keeps track of legendary consumables defined this way
How can I use the original stone sprite as my custom deck back?
there's also can_repeat_soul which will allow multiple such cards to show up in the same pack, this one doesn't really matter unless it has a high rate
so something like this:
yeah
cool
opinions on making The Monster also obliterate Cine cards
yes
should also obliterate the boons or whatever they're called
boons are not consumables though
also DONT MAKE IT OBLITERATE CROPS PLEASE
the monster would destroy all of the crops
oh no
for centers (not tags), i also implement a delete function
SMODS.Joker:take_ownership('joker', {}):delete() totally won't cause the game to kill itself
can there be localization when using steamodded?
on 0.9.8? no
on 1.0.0? yes
I don't quite understand the sprite API by steamodded, is this possible?
I meant at worst you could copy the original, but I think you can use the original atlas name and the correct position to make it work
cool, it worked by setting position
i can't fix the loc_def not working :|
i searched alot
and i still can't find it
What does it look like right now
What does the loc_def look like
idk how to create one for this :(
The Steamodded wiki should have an example
You just want a function that returns an array with the relevant extra variables
So no royals or flush fives/houses
its a flush only card
for the flush enthusiasts
Flush Exclusive
btw, i want to make the upgrade message appear before the mult
its appearing after
lol
chat
which one
colon allows this default function to exist
i saw that reaction
interesting
colon
I remember it working
how do i make this show the upgrade message before the mult is added?
Yea I did make a set_shader function for stickers
i seeee
smth like that for centers would be based
it
uh
put that in Card:calculate_seal() and Card:use_consumeable() as well
WHA
Porting for 1.0 is so fun
colon everywhere
It should be consistent with how Jokers are calculated but with the addition of card just in case you need card info
yeah until you have to disable like 65% of your mod because the relevant api is borked or just not quite documented enough
XD for me it’s just disabling the locked alchemical mechanic and that’s it
(it'll be fine eventuallyyyyyy)
well i did fix quite a few borks today
oh true
Btw autumn do you want me to maybe try and see if I can make a stamp thingy with a special display and stuff?
how do we like this (create_card)
Yes
Kinda
Not really
It will extend the seal stuff
ohhhh like separate collection menu
I like this better
Yesssssss
i mean if you wanna do it go ahead
also compat_exceptions values are always true and just negate the default
that way there's no need to loop all centers
im eepy tho 😴
based
Go to sleep!
im gettting thereeeee
yeah go sleep
thac currently has poker hands, suits, blinds, and joker stamps disabled pending confirmation of api functionality
Poker hands has api
there that's what i was trying to say
yea i just need to figure out how to use the new api
cuz afaik its doing the same thing the original copy of handapi you sent me was doing
where it wasnt scoring any cards even if the hand registers properly
and also idk how the composite system works
I fix that
Fixed
I don't understand why the mult message is colored like a chips, does chip_mod override mult_mod's color? (0.9.8)
I think
ik you did but i couldnt get it working on the version in smods
but i havent tried again since last night so
Just swapped it and it works fine now nvm
iirc didn't someone made a func that makes an temp eval or something?
is there a way i can make the upgrade message appear before the mult is applied?
you should be able to do so by not wrapping card_eval_status_text in an event
i copied from campfire iic
it makes an event already so you're delaying it by a lot
i did not know about that
campfire works off selling cards, so it might be needed for correct timing in that context
is someone making new stakes?
mathisfun is, for cryptid
hm, now how do i actually make the mult trigger
ohhhhhhh i see
what do i do now?
do i put a else in there
nvm
i got it working
does it even work without a return value
i'm making an enhancement (a negative one so not really an "enhancement") and i want it to divide the mult by 2 but i can't figure out how
here's what i put in config but it doesn't work
Unfortunately no, you'll need to do the mult part yourself.
should we have extra contexts then
or what does myself mean here
I don't like it to be a hacky solution if I have to write docs for it
do you have an example?
I remember people showing a eval_this function, but I'm not sure how it works.
function eval_this(_card, effects)
if effects then
local extras = {mult = false, hand_chips = false}
if effects.mult_mod then mult = mod_mult(mult + effects.mult_mod);extras.mult = true end
if effects.chip_mod then hand_chips = mod_chips(hand_chips + effects.chip_mod);extras.hand_chips = true end
if effects.Xmult_mod then mult = mod_mult(mult*effects.Xmult_mod);extras.mult = true end
update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult})
if effects.message then
card_eval_status_text(_card, 'jokers', nil, nil, nil, effects)
end
end
end
this?
Yea
yay
oooo
I think Steamodded could
Can anyone see why this wouldn't work? It seems like alignment doesn't get elements added to it
local joker = {
slug = "syzygy",
name = "Syzygy",
config = {extra={alignment = {}, syzygy = false}},
pos = { x = 0, y = 0 },
rarity = 1,
cost = 1,
blueprint_compat=false,
eternal_compat=true,
unlocked=true,
discovered=true,
effect=nil,
atlas=nil,
soul_pos=nil,
}
joker.calculate = function(self, context)
if context.using_consumeable and not context.blueprint and not self.ability.extra.syzygy and context.consumeable.ability.set == 'Planet' then
self.ability.extra.alignment = self.ability.extra.alignment or {}
self.ability.extra.alignment[#self.ability.extra.alignment + 1] = tostring(#self.ability.extra.alignment)--context.consumeable.name
if #self.ability.extra.alignment == 3 then self.ability.extra.syzygy = true end
G.E_MANAGER:add_event(Event({
func = function()
card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type='variable', vars={#self.ability.extra.alignment}}, colour = G.C.RED})
return true
end
}))
end
if context.end_of_round and not context.individual and not context.repetition and not context.blueprint and G.GAME.blind.boss then
self.ability.extra.alignment = {}
self.ability.extra.syzygy = false
G.E_MANAGER:add_event(Event({
func = function()
card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_reset')})
return true
end
}))
end
end
Yes
are you making sure this calculate function gets copied to the joker object in SMODS.Jokers after you register it?
(i hate troubleshooting 0.9.8)
I think it should work without the key, but that's not the issue
huh
The alignment itself doesn't seem to contain the variables, or at least not indexed by 1, 2, and 3
I didn't paste it here but I have some code defining main_end that's supposed to use the entries of alignment
But it also errors there
how does it error?
Uhhh, I don't have the crash message right now, but the actual effect doesn't even work
Lemme get it
Mods/BuySellPack/modules/jokers/syzygy.lua:31: attempt to index a nil value
struggling with this, my count of cards in G.your_collection[j] isn't increasing as I loop through the editions
Line 31 is closing the curly brackets after content[#content + 1].nodes=
local _generate_main_end = function(self)
local content = {}
if #self.ability.extra.alignment == 0 then
content[1] = {n=G.UIT.R,config={align = "tm"},nodes={}}
content[1].nodes={
{n=G.UIT.T, config={text = "(None yet this Ante.)", colour = G.C.UI.TEXT_INACTIVE, scale = 0.32}},
}
else
for i=1,#self.ability.extra.alignment do
content[#content + 1] = {n=G.UIT.R,config={align = "cm"},nodes={}}
content[#content + 1].nodes={
{n=G.UIT.T, config={text = self.ability.extra.alignment[i], colour = G.C.SECONDARY_SET.Planet, scale = 0.32}},
}
end
end
return {{n=G.UIT.C, config={align = "bm", minh = 0.4}, nodes=content}}
end
am I missing something?
When #self.ability.extra.alignment == 0 this code works, so I think the issue is in text = self.ability.extra.alignment[i]
oh I see...
the second time you're doing content[#content+1], you already created the previous next entry
so if content had no entries, you create content[1] and then try to access content[2], which doesn't exist
-_-
why not put the nodes table in place of the empty table in the first definition though
I might add punctuation, I'm not sure yet
For now three separate lines work
One line might be too wide
still no need to separate it out like that
but content[#content] the second time will do
It doesn't crash, but it doesn't work either
hm idk
But it doesn't work because apparently consumeable.name is (presumably) nil
that's because that isn't a thing
it's consumeable.ability.name you're looking for
I think that was nil but I can try again
Yeah it seems to be nil because consumeable.ability.name or string return string
huh that's odd
Nevermind, found an issue between the chair and the keyboard
lmao
hey there, can someone point me in the direction of a mod that destroys a specific socred card or give me a hand with how to do it, i feel like ive looked everywhere, but im probably missing something obvious asf LMAO
What's your issue specifically?
i want to destroy a played queen, however ive got no fkn clue how to do that since i cant find documentation on how to do it, and i also cant find any alr existing mods that destroys a specific scored card that i can look at the source code for to get an idea of how to do it
usually vanilla code is a good place to start
if you ask yourself, what vanilla joker destroys played cards, the answer would be sixth sense
wait there is a vanilla code source out there??
Sixth Sense does it
and you extract it with 7-zip
np
i want to make an enhancement that divide your mult by 2 but i don't know how (the enhancement is already done i just can't set the mult divided by 2) can someone help me please ?
it works 🎉
amazing
does this have API potential?
fluorescent looks like he's gonna chase me in my dreams but looks kinda cool
I'm planning to try and make it that way yeah
I don't really know what I'm doing but we'll figure it out
I'd love to add support for it to Steamodded at some point
if you have any guidance for making it into an API please send it my way
I assume you have been working with version 0.9.8?
yeah
I think one way is to use hook eval_card and the other is to write a lovely patch for it
having a look at the source code for 1.0.0 alpha should already give you a rough idea of how APIs will work for it, but I'd say just do your thing for now. as long as things aren't hard-coded, the interface shouldn't be too tricky to convert to 1.0 standards at the end
idk how to use hooks 😅
i mean the term "hook" is not familiar to me
is card eval not something EnhanceAPI supports?
I've been looking at EnhanceAPI for guidance so far
Maybe EnhanceAPI is already supported by EnhanceAPI. But actually it might be simpler than that
if the x_mult is strictly positive, then fractional x_mult should work
Ah, but you might need to hook get_chip_x_mult
Because that function makes x_mult less than 1 not work
I'd suggest hooking get_chip_x_mult to return fractional x_mult only if you Enhancement applies
Anyways, "hooking" in this context means to overload the definition of a function to append extra behaviour either to the beginning or to the end of it
So hooking Card.get_chip_x_mult might look like
local get_chip_x_mult_ref = Card.get_chip_x_mult
Card:get_chip_x_mult = function(context)
if self.ability.name == "My Enhancement" then
return 0.5
else
return get_chip_x_mult_ref(self, context)
end
end
hum i don't really understand where to put that
for 0.9.8 it would be outside the init function
I think anywhere works
outside ?
Outside
bruh
don't think that matters
it seems weird since everything is inside of the init function
the function doesn't get called between loading and init, so it can't matter
so i just paste it in the code
and i replace "My Enhancement" by the name of the enhancement ?
but then what do i do of this ?
I was mostly concerned with local and global contexts, but maybe it doesn't matter
I don't know if self.ability.name is the correct variable, you could check that.
also, I imagine you can use the config for the value, but Idk the EnhanceAPI too well to tell you how
hey i found sixth sense, but this seems to make no sense to me, where tf does it destroy the six? sorry again if this is obvious, i managed to use some other code that works, however it destroys the queen before the scoring actually happens LMAO
if (v:get_id() == 12) then
local trash_list = {}
table.insert(trash_list, v)
local card_to_destroy = v
card_to_destroy.getting_sliced = true
card_to_destroy:start_dissolve()
end
end
actually, maybe just self.ability.Xmult works
because playing cards just use self.ability.x_mult
config
I was just saying that I don't know if self.ability.name is the correct variable that stores the name of the Enhancement in a card
Looking at get_chip_mult, it has if self.ability.effect == "Lucky Card" then
so maybe it should be self.ability.effect == "My Enhancement"
What don't you understand?
What were you asking?
well everything you just send
What do you think I said?
If you look at the code for Sixth Sense, it ends with return true. That eventually destroys the six. I suggest searching for destroying_card
Do you understand what the hook does?
i don't even really get what's a f- hook so...
i know what a variable is, i know what a function is but a hook idk
Here, I create a variable get_chip_x_mult_ref where I store the function Card.get_chip_x_mult
Then I define a function Card:get_chip_x_mult, which overrides the old definition, but since I saved that one in get_chip_x_mult_ref, I can call it in the new function
You could just erase the original function, but then you could break any mod that also tried to change that function
Returning true destroys the card
By saving the original and returning it, you ensure your mod works with other people's
Hmmm yea, the problem is i want it to destroy a queen when a straight is played, not just when a queen by jtself is played
then only return true if it's a Straight
If you want to know what contexts are available, I suggest this
Yea thats what im lookin at now haha
New Joker: Syzygy
I don't know why it has this awful gap in the textbox, but it works
does this not show up if you're already playing plasma deck?
since it'd be a bit redundant
At the moment it would show up. Maybe I could look into turning it off, but in principle it's not redundant if there was a way to disable deck effects. (Although with my implementation that might disable this Joker too lol)
clearly if you're using plasma deck it balances and then doubles chips and mult
how do you get the number of card ranks in alpha?
i would assume it's #SMODS.Ranks
but that doesn't seem like it's working
why
is it so difficult
to figure out
how many ranks there are in the game
why is this what i have to do to get the number of ranks
well this at least adds the shaders and adds it to the collection
woa
Each round is tough but maybe it’s warranted for such a powerful effect. I could make it reset only if it’s active, which makes it easier to “save” the effect for Boss Blinds
anyone know where editions are calculated?
You mean during play?
I think it’s at the end of the individual playing card evaluation loop
yeah during play
Generally it's during individual card play and before/after calculating jokers at final scoring.
how would i change the text on an existing joker using the G.localization function?
or more specifically, something past the first tab i.e.
descriptions = {
Joker = {
j_joker = {
name = "Joker", --changing this
text = {
"{C:red,s:1.1}+#1#{} Mult" --or this```
function SMODS.Edition:add_to_card(card)
sendDebugMessage(tostring(card.sort_id))
local center = G.P_CENTERS[self.slug]
card.set_edition(self, {
[center.key:sub(3)] = true
}, true, true, {
name = center.key:sub(3),
config = center.config
})
sendDebugMessage("Added edition to card " .. card.sort_id)
for k, v in pairs(card) do
sendDebugMessage(k .. ": " .. tostring(v))
end
end
this doesn't appear to do anything, my consumable just fizzles out and the jokers stay the same, any thoughts as to what i might be missing?
when I look at the card at the end, it doesn't have an edition key, but in my set_edition function I can iterate over self.edition
based
Good morning, evening or afternoon everyone!
lets gooo
Like, I only have the compat alchemical to implement
I don’t think I’ll release it before 1.0 comes out though
What have you guys been up to?
Not much unfortunately
morning
nice
Btw how would you go about checking if a mod exists in 1.0?
good morning feder
I need feedback on these install instructions plox
I hate writing installation guides
I'd recommend adding Windows and Linux to the first header
Windows + Proton / Wine
"Steam Play"
that being said Linux support should be easy
is that more known?
I've heard proton more
formatting looks good
I don't know how to write it for the people that wont read, but we'll get there when we get there 
linux erasure will be met with BALL CRUSHING
imagine giving microsoft/apple telemetry on your every move in your os
couldnt be me
imagine having a watermark telling you you cant run Microsofts shitty copilot, couldnt be me
I've switched to Linux when they announced Windows 11
linux is so much more fun to play with, especially love those SBC handhelds
After previously openly stating that Windows 10 would be the last Windows operating system that would receive continuous updates
Balatro even runs on them!
i should start using linux
WHAT is going on here
I'd heavily recommend a user-friendly distro like Fedora instead of stuff like Arch or Debian
everyone here is a bot except you
yeah ik
when 1.0 is finalised
https://fedoraproject.org/workstation/ @shell timber
yeah i was looking at fedora or mint
You can always dualboot Linux, btw
i'll switch to linux eventually but my indifference towards my os isnt really helping with that
i know, i have done in the past
Fedora is much better and a way more organized ecosystem than Mint
fair enough
why dualboot when you have cygwin 🙄
Alternatively you could always get into the Arch rabbithole and set up EndeavourOS
Not Manjaro, screw Manjaro and its devs
im obviously kidding
Being on an Arch-based distro has its perks though, like having access to the AUR
linux is great
aur is incredible but man, it can really be a ticking timebomb
but it doesn't need to be that way - use btrfs snapshots
I think pretty much all of the software on my computer was downloaded via AUR
It's a huge lifesaver, especially with Debian packages
I run W11 on basically everything nowadays, but that's because I do technical windows-specific stuff for work and it's an absolute PAIN to debug PE executables within Wine.
Reworked Starborn to be more inline with the name and also because the effect is hell on earth to make along with being boring (previous effect was "Increased played poker hand mult and chips by 1.5X").
#SMODS.Rank.obj_buffer,Ranks is indexed by key
oh, okay
if SMODS.Mods['id'] - it's not that there is no init, it's that your whole mod file is now the init
it was changed in 1.0
I see… that’s oil
Cool
Thanks a bunch
sleepin
slep is good
@frosty dock how was the tag API implemented? does it still use the 'apply' function for effects?
pretty sure I didn't change that
Oh?
I made it consistent between Backs and Tags, but I believe I changed the function in Backs to apply and not the other way around
what this
after i tried to register my tag, this issue appeared
function CodexArcanum.REG.tag_elemental()
SMODS.Tag{
name = "Elemental Tag",
key = "elemental",
config = {type = 'new_blind_choice'},
pos = { x = 0, y = 0 },
loc_txt = {
name = "Elemental Tag",
text = {
"Gives a free",
"{C:alchemical}Mega Alchemy Pack"
}
},
atlas = "tag_elemental",
apply = function(tag, context)
if context.type == 'new_blind_choice' then
local lock = tag.ID
G.CONTROLLER.locks[lock] = true
tag:yep('+', G.C.PURPLE,function()
local key = 'p_alchemy_mega_1'
local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2,
G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true})
card.cost = 0
card.from_tag = true
G.FUNCS.use_card({config = {ref_table = card}})
card:start_materialize()
G.CONTROLLER.locks[lock] = nil
return true
end)
tag.triggered = true
return true
end
end
}
end
oddity tag was working, no-?
I don't think I broke something at the very least
maybe feder hasnt updated
i did

set is present on latest commit
oh this is beautiful
but yeah all 4 oddityapi tags seem functional
I pushed like 8h ago
yeah they are
nice
now I only need decks and i am done with porting codex to 1.0!
is 4 tags too much for oapi lol
nah lmao
maybe i should make them individually configurable
alright things seem fairly stable now besides another small mistake
have I forgotten any reports?
or like, move some to Thac
i just dont want oapi to have more content than the Bare Essentials yk
yeah maybe move it to thac
(which is why it doesnt ship with any Oddities)
did you ever implement a deck fallback?
So far it's all been fine on my end, granted I haven't been playing with all the new APIs
like when the game tries to load an unloaded modded deck on selecting new game
it should have always defaulted to red deck, the issue we had previously that a hook wasn't replicating that logic
it's a non-issue with lovely
interesting bit of advice

lovely really is lovely
morningus
good evening akai
- playing card atlas issues
- blind animatedsprite issues
- poker hand scoring cards (maybe my fault)
- seal api jank
that's what i have but from like two days ago i havent been able to sit down and dev or look at commits
playing card atlas jank is resolved, same with blinds
poker hands work fine on my end, I checked again with spectrum
so how many apis have we amalgamated at this point
i do want there to be a builtin way for Legendary Oddities to appear, and the Mega Oddity Pack tag just seems like a no-brainer
seal API might still have jank tbh, not sure what that was about exactly
so maybe just Relic and Collector's tags get moved to thac
I added that, you can now add a legendary key to the rarities table
i know that hand api and tag api were implemented in
wdym?
oh i meant a "game object that gives a legendary oddity" but good to know i can remove my hacky way of doing it
though now that I think about it, there may be issues with the pool for it not being created since I use ipairs
i might just need to see an example of poker hand api, is sixsuits on 1.0?
no, I've just been throwing things in a test mod
I'll probably port it soon, but I can drop you the code for spectrum later
perhaps spectrum should be added to base steamodded
That would be wise.
understandable
spectrum as a base hand type would be kind of whack to balance around since multiple suits increase how easy it is
Also that
yeah makes sense
I'm getting an error engine/sprite.lua:34: attempt to index field 'atlas' (a nil value) when trying to view my jokers in the collection. Did I assign them incorrectly?
joker_sprites.register()```
```for _, v in pairs(jokers) do
joker = SMODS.Joker:new(
v.name,
v.slug,
v.config,
v.pos,
{name = v.name, text = v.desc},
v.rarity,
v.cost,
nil,
nil,
v.blueprint_compat,
v.eternal_compat,
nil,
'jokers',
nil
)
joker.loc_def = v.loc_def
joker:register()
end```
Here's an example of one of the jokers in the array that I am registering above:
```{ -- Plague Joker
name = "Plague Joker",
slug = 'plague_joker',
desc = {
"{C:mult}+1#{} Mult",
"{X:mult, C:white} X#2# {} base Mult at end of round",
"{C:green}#3# in #4#{} chance this",
"card gets destroyed at end of round"
},
config = {
extra = {
baseMult = 5,
xMult = 2,
odds = 8
}
},
pos = {x = 0, y = 0},
rarity = 2,
cost = 5,
loc_def = function(card) return {
card.ability.extra.baseMult,
card.ability.extra.xMult,
G.GAME.probabilities.normal,
card.ability.extra.odds} end,
blueprint_compat = true,
eternal_compat = false
},```
0.9.8 APIs are wacky, I can't tell if the argument placement works out on that
isn't atlas the last param?
I think it's "soul_pos", at least that's what I got from a guide somebody wrote in the modding forum
check on https://github.com/Steamopollys/Steamodded/wiki that your arguments match
you might be missing one in the middle?
Weird, a different mod I was working on has the same setup in the joker constructor, and it works just fine
Wait, does 1.0 have a deck API. I don't think I see it here
oh wait decks in the game are backs
forgot
yeah
Maybe it could depend on number of suits
oh actually does smods consumabletype offer automatic statistics screen creation? if not it probably should 👀 (since it offers collection screen, anyway)
it doesnt
you should port your alchemical stat screen code for smods
any small mod that makes custom packs?
ik alchemy did, but wonders if there's any smaller scale ones to look at
codex is probably the best place to look
https://discord.com/channels/1116389027176787968/1217914433846775918 i think this counts as small?
wooo codex
theres a mod that adds voucher packs and nothing else
its bundled with other mods normally but you dont have to do anything fancy to only have voucher packs
OddityAPI does it but I don’t know if it’s currently public
But FYI Steamodded 1.0 might support them out-of-the-box?
Idk
i would laugh out of sleep if that's the case
Itay can you read our dm pretty please
1.0 fusion API?
With fusion jokers, yes
dope
Idk I finished porting codex, and I am not sure what to do rn
should I port sound.lua or leave as is?
You can keep it as is I think
wouldnt want to piss off its author again
hmmmmm should the Collector's Deck just turn Arcana/Celestial/Spectral Packs into Oddity Packs... (deck that turns all consumables into oddities)
its kinda weird not being able to use oddities on cards in your hand in arcana/spectral packs... but im not sure theres a good solution?
Which one of these is chess cards?
then again if i could crack having the game allow you to use oddities from packs that'd be better anyhow
None XD
none of them, that was Composite Hands
Damn
yall rag on me for having too many projects meanwhile feder

