#💻・modding-dev
1 messages · Page 110 of 1
Yes
I did yeah
Did you find out the cause and/or how to fix it?
It’s something to do with how the engine scales images, I believe it’s internal to love2d
Proof-of-concept for the Enhancement
@wintry solar You had recommended that I make a border at the shader level. Do you know how I could do that?
looking at sticker calc rn, why are end of round effects this annoying
Change the colour of the outer pixels inside the shader
But how do I know what pixels are the outer pixels
Especially if I wanted that rounded card look
I mean, I could make a helper atlas that serves as a mask, but maybe there's a pure shader-level solution
Something like uv.x < 0.1 || uv.x > 0.9
And similarly for y
Then you can math out the corners too
{ set = 'Other', key = 'key_here' }
oh
okay
alright is there a way i can suppress or alter the message given when adding chips
I thought that wouldn’t look pixelated
that looks sick, does it work with editions too?
It is an edition
I need to make it not an edition
Also
I used your Tilted as a reference
Do I need to keep your accreditation?
yeah I'm worried that might need some thunking cuz Idk if that'll work as not an edition without completely changing how cards get drawn
I mean I could do a patch and test for the specific property, but SMODS.Enhancement Docs says it has a function to change how the card is drawn
But it doesn’t explain what it does
Problem is with how shaders work
in vanilla game you draw a shader off of a texture sprite, while your enhancement shader would not create a texture, it would draw directly to canvas, and edition will only get the plain texture of the sprite, unless you change how it works
theres a few ways, you could draw on to a sprite but iirc creating a sprite every frame is pretty resource intensive
and the other way would require changing how card:draw works completely
uhm, depends on how much did you change, I don't remember what tilted does anymore, but if you only used it as an example then you don't need to credit me
I need to go over it, but where tilted flips I changed it to look at the modulo of the screen position
I think everything else is, like, vanilla shader code
That was also inside Tilted
maybe trying to get this to use eval_card wasn't a great idea, at this rate i might just be rewriting the evaluate_play stack. worse yet there's a bunch of joker retrigger stuff in there where I'm not entirely sure how it works
yeah then dw, you don't have to credit anything
thats cool lmao
This is how I feel looking at most of the calculation stuff math has added 🤣
uv is just the individual position of pixels, I think it should look okay
made a draft PR for what I have so far on top of the enhancement calc PR but it's pretty bad rn
I've managed to make a sticker trigger on joker contexts like skipping_booster that don't normally use eval_card though
feels like i'm just making things more scuffed rather than less tbh
I’ll take a look shortly, I was planning on adding the consistent keys to return in that PR too
would it be safe to hook the card sprite drawing function to add some extra stuff?
This is turning into better calc 2.0 🙃
if we go down that route, there might just not be a way around redoing evaluate_play in full
But it's a float right?
At the very least I'd need to know the size of a pixel in floats
ideally with some util function that consistently does returned effects
As in the side length
Thanks :D
better better cal
betterer calc
I don't think I've even taken a close look at that one when it was still recent 🙃
probably but what are you trying to do
It’s a float but it’s referencing a coordinate on the card where the very left is 0 and the very right is (1-pixel width) iirc
So you can just trial and error to find the correct number
Yes, but if I don't get the size right I'd end up with mixels
I actually don’t think evaluate play needs too much rewriting unless we want to add Utils for adding extra stuff into it without needing to lovely patch
please add those utils
i have an effect i'm planning to add to cards for the reincarnation afterlife effect for my mod, where it has like an aura around the card
that way it's able to be told apart visually from regular cards
No you wouldn’t, if say each pixel is on 0.05, putting uv.x < 0.12 would give you the pixels at 0, 0.05, and 0.1
and i could end up throwing any other effects into the same thing which would make things way easier
I'd want these utils, at least for the sake of stickers (I've tried to kind of include that in eval_card, but it's way too inconsistent in how it handles returned effects)
@frosty dock Funny you say that because I'm asking Eremel how to add a border around a card using shaders
Depending on the kind of effect you want you don't need to hook or patch
is it possible to add another texture input for a shader? if so you could just easily do a mask texture
It should be, I was just wondering if there was a pure shader-level solution
just white for the card shape, black around the outside, and multiply the output of the shader by that
parallel conversations moment
shader-level border would result in needing more calculations which would make it not as efficient, not noticeably any slower unless there's a ton of cards with the same shader
a mask would be the simpler solution too
say I try to have a sticker that's just supposed to return some mult in context.joker_main. the calculate function will get called but it only takes effects.jokers into account but not effects[sticker]
Yeah I want to write joker calc like I’ve done enhancement and seals
I thought accessing a separate texture was more resource intensive than doing a few flops
They just don’t have consistent keys in returns iirc
God overwriting evaluate play would break so many mods 🙃
Anyways, @storm oar, do you want an Enhancement, an Edition, or something new
should be fine if it takes all keys in effects maybe, not sure what other inconsistencies there are
Noticed that upon stopping hovering on any description containing cards (like poker hand examples in the run menu), it causes a lot of weird events to appear in the queue (checked with DebugPlus only)
Upon hovering a lot and quickly switching to the game the events happening in the queue hinder the other events (such as playing cards), but it's really hard to get the timing right. The more cards the description contained, the more events appear in the info queue
Suspecting maybe start_dissolve starts happening for each card after the description disappears?
I read this as an statement about God
changes name to God
God flooding the world would break so many houses
i'm adding a new thing to the cards since i don't want to replace enhancements or editions, the idea is that each card has a chance to be carried over to a new run if you have the voucher for it and i don't want to replace anything about the cards in that case
Take a look at Myst's L Corp
i guess the card_ui patch would be where i should look at?
Is it just a different sprite you want to draw?
yeah i'm wanting to add an animated border to the cards that have been brought over from the previous run
uhhh animated would be harder
I havent really looked at how the animated sprites actually work
I don’t know, but if you look at the assets, you’ll see some art elements that go over cards
i would think it wouldn't be toooo complicated to do an animated effect
Use the atlas’ name to find out what objects use those elements
Then see what changes the draw pipeline to draw them over
and yeah it looks like there's a patch for card.lua that is in the draw function so probably simple to do that
A little bit because the vanilla animated sprites don’t work well with Jokers
Math recreated animated sprites for Aura
Well, it’s a hacky change of normal inanimate sprites
But it works
ah. well, for now while i'm just trying to get things working functionally i could just skip that part
just have a basic overlay sprite
That’s what I did for Temporary cards
i think that was due to some mistake in AnimatedSprite code? idr if there's more to it
Last I had heard no one knew why
Nor how to fix it
there's this but I'm not sure how relevant it is to anything
I think when I looked at it I suspected it was because AnimatedSprite didn’t have all the methods of Sprite
that's not possible, it derives from Sprite
at the very least my fake blind collection cards work well enough with animated sprites
I think it’s something happening to the Sprite that breaks it
So maybe it breaks during normal gameplay
But not where your fake Blinds are
iunno
I suppose I should work off the sticker calc pr now
would there be some weirdness with if i were to make the sprite for the modifier be larger than the card sprite to add more than a 1px border?
I think so
I haven’t come back to this yet, but here are some oversized Enhancements @storm oar
Since you want to draw it on top, that might be less problematic
also are there any issues with alpha with sprites at all?
can always merge it into the enhancement calc branch
or would some partial transparency on sprites be fine?
Glass
ah...right forgot that existed
i haven't played the game a ton, only about 12 hrs total so far
yeah will do that. what are the key things we;re aiming for then I don't forget 😆
for stickers to be calculated using eval_play effect tables in joker and playing card contexts, extended returns in joker eval, probably some kind of util to evaluate effects consistently if we can help it
also no calling calculate_joker directly though I think I already took care of most of that, we want either eval_card or some wrapper to it that includes effects-related things
I wish I understood how retrigger api works
i have a question about the enhancement calc fixing, would it be possible to make in-hand retriggers? i presume it'd be something like:
if context.cardarea == G.hand and context.repetition_only then
[code that makes played card retriggers, too early to write it all out]
return{
repetitions = card.ability.extra.repetitions
message = "Again!"
its a random idea i had, but was just curious if it was possible
so, e.g, an enhancement could retrigger all cards played when held in hand
same 😭
Is there a way to check which events are currently in the event queue?
Help Needed: Destroying a specific type of joker when card is picked up
joker_retrigger.toml
Ctrl+A
Ctrl+/
joker_retrigger.toml
Ctrl+A
Backspace
ah but I might need to reference it when reimplementing it
it's supposed to retrigger other jokers right?
til about Ctrl+/
fair enough
yep
Iirc you can do G.E_MANAGER.queue.base for the main qieue. You can see the event with G.E_MANAGER.queue.base[1] and if you need info about the function try debug.getinfo(G.E_MANAGER.queue.base[1].func)
don't you love trying to work out why your code isn't working and then realising you've just editted the lovely dump
i can't say that hasn't happened to me
i love writing abstract code and forgetting about config I need to add
You mean like Red Seal retriggers in the hand?
-# can red seals retrigger in-hand? thats a thing?
Always has been
okay so it seems a negative x/y position for a sprite doesnt work?
so how do i offset the sprite for my overlay for cards so it properly displays?
what kind of overlay?
just an added sprite
for now at least, i plan to make it an animated sprite later, just using a regular one for testing
is it properly 71x95?
no, it's slightly larger so i can make a border that's more than 1 px around the card
hm
alright my reusable collection code covers jokers, all consumables and booster packs... time to work out how to include card modifiers
wait do you mean as in, retriggers when being scored, or as in when a card is kept in hand (e.g steel cards)
tags and blinds are too unique and who cares about the deck collection
vouchers exist
hm you can try messing around with the sprites' T.w and T.h values
i don't know the exact values (balatro's system is a fuck (use debugplus eval)) but you can do some math to calculate the overlay's values compared to the card's
x and y offsets the sprites i think??? but something about bonds that make them Not Work
also they are very much Not Pixels lol
i guess what i could do is like set it to some variable i can manipulate using debugplus to test?
is there any way to force give jokers for testing?
lmao I was editing a copy of my mods folder and not the actual folder for 2 hours yesterday feels bad man
how about not caring what the unit represents and using card width/height as reference instead
also whats the flag to have it auto discovered in collection
BALATRO MATH LFGGGGGGGGGGGGG
discovered = true
thanks ik it was something dumb I was forgeting
it doesn't work if you put it on a pre-existing card that was already undiscovered though, due to it being saved as such in your profile
so should i just do -G.CARD_W*0.0704 for an equivalent of 5px offset?
and same for height but whatever 5/95 is
Cnst you just specify how big the cards are in your atlas definiition?
but it doesnt center the sprite, it's pinned to the top left of the cards
the issue is the sprite is larger than a card and i want to offset it so that it is a border around the card
So this is something like a seal where it's on top of a card?
yeah
Oh hmm that is a bit tricker then
does anyone know what attempt to index global 'context' [a nil value] means?
just built my first full modded joker and as soon as I click a card in my hand while having it my game crashes and I get that as an error message
It means you tried to access a value off of something called context but context is nil
hand
nevermind I was missing another fucking comma
Maybe if you just center the layer
the alignment I think is center middle
but center center would make it look like it's a border around the card
screw it, i'll just make it just draw into the card instead
cause it seems like everything i try isn't working
there's one last thing you could try
might not look good though
you can scale that layer up
okay finally figured it out mostly
now i just need to figure out the positioning properly
but i can actually move it now
👀
👀
-# actually i forgot to remove a commented-out function, this should be even more
yes i standardized collection UI (except blinds, tags and decks)
is there a way for vouchers in collection to not be grouped by 2s for certain vouchers? cause i'm not sure if i'm going to make upgraded versions of the afterlife vouchers or not
it uses a special type of card area that always has these groupings
you could dig as deep as to change how it works depending on the cards, but i don't think it's worthwhile
nice
ah fun
-# meanwhile i spent like 2 hours on something that makes no visual difference
It's fire 🔥
also i just realized i left some test code in the rental calc function 🤪
sprite is a wip, i'm planning to make it look fancier later
like a kinda spectral fire looking thing idk
while it's just sitting there it's fine, while dragging it it seems to offset it slightly
yeah i noticed
at least i have somewhat of an idea of how to mess with that now though
does copy_card work for jokers as well?
Can you show me how you did it?
the positioning itself or fully adding a new sprite to the cards?
The positioning
in the draw_shader calls, i added nil, nil, -G.CARD_W*G.RCOXV,-G.CARD_H*G.RCOYV to after self.children.center in the arguments, i added RCOXV and RCOYV as values i can change to test positioning, the 2 nils are because the arguments after are scale, rotation, x, y
maybe i should do self.T.w and self.T.h instead and that would fix the weird offset issue?
new suits?
Porting over from my game
the tree of life suit cant hurt you!
the tree of life:
What tree?
the bottom one kinda looks like a tree to me
it reminds me of the album cover for 7-3 in ultrakill
They’re Paddles
makes sense
blue queen and king have miscolored letters
i like it though
Can you show me the code?
Already fixed
it's a patch for the drawing function to add the sprite to the card but here's the full thing
[manifest]
version = "1.0.0"
dump_lua = true
priority = 1
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = "elseif self.sprite_facing == 'back' then"
position = "before"
payload = '''
for _, v in ipairs(G.afterlife_modifiers) do
if self.ability[v] then
G.afterlife_modifier_sprites[v].role.draw_major = self
G.afterlife_modifier_sprites[v]:draw_shader('dissolve', nil, nil, nil, self.children.center,nil,nil, -self.T.w*G.RCOXV,-self.T.h*G.RCOYV)
G.afterlife_modifier_sprites[v]:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center, nil, nil, -self.T.w*G.RCOXV,-self.T.h*G.RCOYV)
end
end'''
match_indent = true
[[patches]]
[patches.pattern]
target = "game.lua"
pattern = "set_profile_progress()"
position = "before"
payload = '''
self.afterlife_modifiers = {
"reincarnated"
}
local modifiers_atlas = self.ASSET_ATLAS["ns_aftrlfe_AfterlifeModifiers"]
self.afterlife_modifier_sprites = {
reincarnated = Sprite(0,0, self.CARD_W*1.1408, self.CARD_H*1.1052, modifiers_atlas, {x = 0, y = 0})
}
'''
match_indent = true
can anybody help? trying to make a new consumabletype and the name doesnt seem to show up
also yeah it seems using self.T.w and self.T.h instead of G.CARD_W and G.CARD_H fixed the issue with it being offset
at least the differences in the deck and hand
but it still offsets slightly when dragging the card but that's not tooooo bad, i can just make it go slightly further into the card to hide that
i think that has something to do with the parallax
How do I read the card being discarded to see if they are faces?
I think there’s a card:is_face() a function?
just as a test i made it guaranteed for jokers to carry over too
should i make the chance vary based on rarity of the jokers?
also is there a way I could make it so that during the transition to the new run screen, it shows the voucher, dissolves it away, and a joker materializes?
also hm. there's a weird issue where sometimes the game decides to not properly start the new run, instead just goes to black screen
well, made some good progress before work today
fun question
So, I'm making a semi-full ui overhaul in #1322621155173077003
And I've made changes to the joker cards, as well as the diamond collabs and the SHOP sign in game
When setting up the lua, how would I go about assigning the textures to the collabs and shop sign itself?
not sure about the shop sign, but you can look at the NegateTexturePack mod in Steamodded example mods
probably the same thing but just needing to figure out the atlas name or something
gotcha
why would you replace the collab when you can just add them
should i make a thread for my mod yet even though it's still a wip or wait till i get to where i can release it?
feel free to make a thread
someone save me
this is fine
im only recoloring one of them
well, one suits collabs
yeah but you can add it
steamodded has SMODS.DeckSkin
i think i might make some myself, maybe based off some bands i like
Ok, for some reason this is crashing now
hmm
Can anyone potentially tell why this would crash my game on launch?
steammodded won't throw a fit if i have another json file in my mod directory... right...?
like an unrelated json file
honestly it doesn't really matter now that i'm thinking about it i could just give it a different extension lol
it'll just ignore json files that dont look like mod metadata
it'll log that it ignored it, but that's all
uhhh
why are you making a mod for old steamodded?
could have seen that right away if Discord's mobile UI wasn't stupid
there's no reason to do that
it doesn't even have good docs
and uh
it's 8 months unmaintained
steamodded 1.0 (still) alpha, see https://github.com/Steamopollys/Steamodded/wiki/SMODS.Atlas for docs
Listening into this conversation.. just starting on something today myself. Steamodded sent me to its wiki..
phew, I'm safe. Hah.
oh wait, that is what I'm using
Just gotta figure out how to add a button to the Collection screen and put together a little baby-UI.
I'm not stopping you, the old format is still technically supported by the loader but no one will help you with it
or wait
the alpha, gotcha
god, wait, im dumb
writing in the old format but it's still supported by the new format
gotcha
I should document mod functions you can define for these things, that's one of the main things we're still missing in terms of docs
yeah we still have backwards compat, but it's only meant as that and not for you to write new code for it
it's a genuinely bad system, that's why we changed it
i remeber looking at it when the docs still showed the 0.9.8, and 
i felt my life being shortened
I mean, it's fairly easy to understand, but that's coming from someone who hasn't coded lua since roblox before tix left
I remember making these APIs somewhat usable and/or consistent
the only modding i’ve done is factorio, it is in lua but not the same
I had a cursed idea last night while truing to sleep seeing if I can implement it
honestly making an API sounds super fun, i’d love to try it one day but i just dont have the expertise 😭
rven just writing documentation
i literally woke up today and thought “hrm. dark mode jimbo”
I am entirely unaware of how to go about this in this method but, as a great philosopher once said
fuck it, we ball
Hah. I'm looking to put together an basic in-game stats tracker. I find it kinda incredible that we don't have any semblence of run history available to us.
Whomever put together Steamodded should be commended. That thing really makes this much more straight forward.
I don't like to claim credit for it, it's very much a community-run project
-# but I'm the top contributor, just saying
so thanks I guess
Does anyone know off the top of their head any jokers that have text that does the kind of type effect in it's description
I know they exist but I don't rmeenber which ones have it
I'm not sure any vanilla jokers do
Good to know. I'll keep that in mind as I go about my business, that it may be worth cleaning stuff up to make it generic enough to be useful to the community.
What about consumeables?
oh oops does it
the soul
on the string probabilities
nodes[1].nodes[1].nodes[1] users hate this one simple trick
oh forgot the return
i should make this actually useful hang on
hm
wonder how id do that
smods devs are top-tier
C users when they modify an argument instead of returning something new
i imagine the only way to use this as it is would be to find a value in a config and then assign that config an ID and then use uie by id
lovely devs are toppest-tier
truthful
lies, no one maintains lovely
but meh modifying an argument helps with preventing memleaks
it just exists
Btw, I believe there are some mods that attempt stuff in this direction? Flowerpot and Divvy's History come to mind
it's better because it means the caller gets to handle mem management
question, how would one request something to be added to smods? specifically example stuff
just in general better imho
Looked at Divvy's History. It describes itself as only saving hands and allowing for replay. I'll look at Flowerpot.
we said the same thing
true, you better get going with maintaining lovely
yes but I get the xp
darn
listen I had this crazy idea to randomize patch application order
Lovely was found on the doorstep left in a basket one night
ok! So, smn like this?
nah nah, you gotta switch from .toml to using BASIC
its much more optimised 
BASIC would probably be better
wee babby lovely
speaking of toml ```lua
-- [lovely.pattern_patch]
-- target = "game.lua"
-- pattern = "new_cards[#new_cards+1] = _card"
-- position = "before"
function Cryptid_the_cryptid(check_for_unlock, _card)
if _card.config.center.key == "c_cryptid" then check_for_unlock({type = "cryptid_the_cryptid"}) end
end
plans for manifest v2
the latter
sorry my sister hit the enter key on my keybaord
is that your OC or are you being serious
I'm being serious that is why that message is weirdly split
getting rid of toml is one of my top priorities. it sucks
Ok, so heres a fun question
at least for writing code
kid named multiline patterns
toml at least has multiline strings
How would i find out the key for the shop texture itself?
but how
yeah there was multiline paterns added but we had collective amnesia and forgor
using magic I didn't consider when I quickly assumed you were asking generically about multiline patterns
@tepid crow Thanks for pointing it out. Flowerpot is close to what I'm looking for.. but not quite. I'll bet I could build on what they've done to accomplish what I'd like to see.
Cause I've looked through the github and cannot for the life of me seem to figure this out
defining multiline patterns as a lua comment is more funky
the easy way is to force everyone to become civilized and use regec
crazy idea
much better
I wish lua's syntax had function decorators
metatables
Aure, I apologize for interrupting, but would you happen to have any idea about this issue?
thanks spaghetti monster
thanks
they're somewhere in the game code. the old sprite docs also have it iirc
we could in theory make patch defs evaluated lua code
anyone got an example of a mod with a weird/complex hover thing
Would you happen to have a link to where I could find that doc?
Or is it on the steamodded wiki and im blind

shop_sign with atlas table ANIMATION_ATLAS
oh that was fast
it's on a hidden page that I don't want you seeing
-# it's not that hidden, it's just not in the main sidebar
:sus:
you wanna know the funniest part of this
I had originally planned to just try shop_sign but i sat there for a minute like...
you're onto something here
"Nah... Nah, it wouldn't be that simple"
lol
https://github.com/Nabeel20/Badr might be of some interest to you
it's not entirely related obviously but the backing implementation might be useful
pffft who needs usable UI code
The issue is I'm stealing ui boxes not making new ones
(I alreayd do my own ui in DebugPlus)
valid
- as a costurctur goes hard
also I can't scroll up the log in dp :-(
Just kinda guessed the dimensions and got real close lmao
we love you ve operator overriding
cool done
Skill issue
Also please make a way to scroll logs faster
go_to_twitter sounds like an insult
lmao
it's annoying when printing large tables
now i gotta finetune it and figure out why it's doing those damn lines
also maybe you have a large number of logs that are hidden (I broke scrolling kinda)
Fun fact I started learning vim this break
however I don't have proper ways to handle text rn
Maybe I'll see about forcing monospace text
vim is a lot of fun to learn. I find that I rarely use and advanced features of it, I just like the text navigation part
can someone give me a crash course on how objects in lua work
an object is a table
I have a vscode neovim extension but I've never bothered actually learning the keybinds lmao
neovim mentioned?!
helix is also fun to pick up. it's somewhat similar to vim
I always enjoy using it but the terminal experience in windows is still not great
hi peter flowey l'gardener
mostly because I use a custom keymap and that makes the keybinds really weird
- I already have mouse keys
How can I detect what type of object I have?
assuming I've been given a random object
depends on what you mean by a type of object
^
type() can get you some info but it's not great
idk it's an obj idk what it is
like an oop object?
class/struct style
eg. an object with functions and data, or an object with just structured data
Within Balatro's base code? Yes apparently
I think there's a metatable with some class information?
It's in engine/object.lua
this is literally 1 line but idk why it isn't doing anything
I just want to make the Manacle into an Ante 2 boss because I hate them
boss = { min = 2 }
A wonderful issue that, no matter what, I cannot seem to fix for some ungodly reason
for some reason, this is dragging the bottom pixels of the sprite down and also jittering slightly, even though I have the dimensions of the sprites seemingly set up correctly
I didn't think Balatro needed a dark mode.. until I saw that. The theme looks cool!
Things seems fine within the file itself
nothing changes with the jittering when i change the py value, however
i even have it set to the full sprite sheet size rn and it's still doing that
guys i'm making consumables and i want them not to be used immediately but instead to keep them in your consumables slots (like alchemical cards from ca)
also are you like directly messing with the game's files for everything else? cause that could mess with other mods as well, iirc cryptid changes values for the background vortex thing
This is a DynaText for anyone wondering
also id see if the atlas size is set right by finding the info for the shop sprite in the game's code
I tried digging through but couldn't find anything
I'll take another dive tho
just do a search through every file for shop_sign
So, as a test to learn how enhancements work, I want an enhancement that adds a red seal to itself after the hand has been scored. this isn't working, and I assume it's because I am using wrong contexts </3
key = 'fungal',
loc_txt = {
name = 'Fungal',
text = {
"my beautiful spores"
}
},
config = {extra = {mult = 12, size = 4}},
loc_vars = function(self, info_queue, card)
return {vars = {card.ability.extra.mult, card.ability.extra.size}}
end,
atlas = 'casssilly',
pos = {x = 0 , y = 2},
calculate = function(self, card, context)
if context.after and context.cardarea == G.play then
card = card
G.E_MANAGER:add_event(Event({
func = function()
play_sound('gold_seal')
card:juice_up(1, 0.5)
card:juice_up(1, 0.5)
card:set_seal("Red", true)
return true end }))
card_eval_status_text(card, 'extra', nil, nil, nil, {
message = "Seal!",
colour = G.C.RED
})
end
end
}```
ignore the variables and config, I copied some properties from a joker I forgot to remove
context.after doesn't exist for enhancements iirc.
Kinda sad cause I also need it for my stuff
how do i put a sticker in an info queue?
dang, really? Well is there any other way to accomplish what I'm looking to do
Needs a keep_on_use function
uh oh stage 2 is starting
Wouldn't that be easy to implement?
Probably
...are the Mime-like repetitions for cards locked to 1? Trying to return a higher value, in this case, 3.
local repeats = card.ability.extra.repetitions -- is 3.
if context.cardarea == G.hand and context.individual then
return {
message = localize('k_again_ex'),
repetitions = repeats,
card = card
}
end
if so maybe can see how it repeats and just manually do it more times
I believe you need to be in context.repetition there, not context.individual
It should support more than 1 yeah, hanging chad does 2 in vanilla
can you implement custom unlock conditions for things?
yeah but i want them to be in your slot for later use not for it to be reusable
that might be my fault you though i asked something else
you can
i cant remember it exactly, but i know you can
context.repetition did do it, but I still need to catch if a card doesn't have any effects to trigger... card_effects, was it?
this is gonna sound patronising and i dont mean it that way, does mime’s code use it?
... and (next(context.card_effects[1]) or #context.card_effects > 1)... so yes.
from a pack?
Mime retriggers actually have a bug in that they won’t retrigger the card if it doesn’t have an effect that triggers the first (like if reserved parking fails the first 1 in 2, it won’t retrigger to roll the second 1 in 2)
are they specifically mentioned in the code?
They will retrigger the reserved parking if the card has some other unrelated effect
yes
Regardless of if the first roll fails
ah hmm
Not sure how else to reach card_effects to prevent the
spam.
Besides using a check if the card is enhanced or has a seal applied.
what are you trying to do exactly?
Prevent retriggering a playing card without any effects when held in hand.
and by effects you mean enhancements, seals and editions?
What about also joker effects
I just want a Mime-like behaviour.
'cause this technically works, even if the
-retrigger appears whether the retrigger did anything or not (i.e. Blue Seals giving planet cards just fine, but it still appears when cons. slots are full.)
if context.cardarea == G.hand and context.other_card and (context.other_card.ability.set == 'Enhanced' or context.other_card.seal) then
if context.repetition or (context.end_of_round and not context.repetition and not context.individual) then
return {
message = localize('k_again_ex'),
repetitions = repeats,
card = card
}
end
end
Btw you don't technically need to check for and not context.repetition in those parentheses since you checked for it in the first part of the if statement
should i make it so that the aura effect for reincarnated cards shows when cards are flipped as well or only if they're front facing?
I'm trying to use the DeckSkinTemplate.lua and it's not working, like it's not using the texture just the default one, the texture rn is just the among us skin just to get it to work and it isn't
like if the texture is too small it will get mad but it doesn't show up
so it's obviously reading it just not using it for some reason
I didn't edit anything about the DeckSkinTemplate.lua besides the file names which are correct
yes
how many are you trying to replace?
like ranks-wise
and do you have the right number of cards in the image?
hm
It's really bothering me because it's obviously reading the file but not using it for some reason
do you actually define the atlas?
Oh I know this one! For some reason, you need to use an atlas that contains every card when setting up a Deckskin
I just directly copied DeckSkinTemplate.lua from the example mods folder and edited the stuff that's listed as to edit
this is what I used, and it worked
why does it need every card even if you aren't replacing every card???
fun
because I believe you CAN replace every card
with a deckskin
but it's an optional thing
It's funny I actually started with the full deck png and then changed it because I didn't want to use every card lol
and it still doesn't work
welp
getting rid of the prefix_config = {key = false} fixed it
Hi guys is it possible to change the pos of a joker?
So since "context.after" doesn't exist in SMODS.Enhancement, is there any way to accomplish what I'm looking for?
I assume I need to inject/patch it in directly, but I am unsure where I would want to
if you want to change all instances of the joker's position, you can get the center and change the values iirc. If you just want to change your exisitng one you can do card.children.center:set_sprite_pos({x = 4, y = 1})
@frosty dock do you have a sticker example I can use for testing?
worked perfectly, ty
is there a list for these functions?
in case I want to change the name too
no things are all over the place
for name I think you want to add a second localization key
yes but how would I assign it to the card
alr, thanks for the help
i just used the rental sticker 🙃
oh that's true
How on earth do I remove a playing card from the full deck, whenever I use :start_dissolve() it removes it but then when the round is over it draws 52/xx and then next round if it draws one of the "removed" cards it leads to an empty card slot in the hand that I can't do anything with
Wdym by where
if you're removing with a joker, you should use context.destroying_card
Oh, you're right
I forgot I changed my context after trying to fix some other bug that ended up being unrelated
Lol
yeah
I can't remeber any other pitfalls off the top of my head
Well I knew I should use that but I thought it lead to some other bug, and forgot to change it back after fixing that
how do i make a sticker not show up in the collection?
and have it only show up in a seperate tab of the collection
actually how do i even make a seperate tab of the collection period
one that goes in the other category
SMODS.current_mod.custom_collection_tabs()
oh yeah aure how do I add more than one config tab for my mod
(I have too much confiuration)
Add the other tab as a extra_tab
i mean mod funcs in general
I documented one of them
this is so much pain
can we please have base SMODS.ObjectTye aybe have an option to create a misc collection page?
you can leave it off if you are making more behind the scenes object types
look how card sleeves does it
ok
would auto making a page work well?
this is what we do for consumable types
at least for collections of cards we have util for it now
I imagine more other types don't have a good way to represent them that is just able to be dropped in
generic object types can't have a generic collection, I don't think
hmm
yeah
unless maybe if its a modifier to a card it generates a blank card?
and then aplies the modifier
there's no util application function though
you could also just make SMODS.CollectionPage a thing
honestly im probably not going to make a special tab for the studs
i however will keep the object type since the pool could be useful
oh eremel, question, when the enhancement calc is merged will i need to change the effect.repetitions to the usual return function?
-# i wasnt sure wether to ping you or not
-# don't ask me why the card areas have a height of 1.03
-# why are they that size
-# for the same reason that they're 0.95 in the joker collection
they’re what
Also not all ObjectTypes are made for the purpose of letting get_current_pool work with custom objects, there's uses for them when you want a specific set of jokers.
How would the UI work then?
i actually do think that we could divorce it from object types actually
we could make a SMODS.CollectionPage that then has a reference to the pool, in addition to a bunch of other options
that sounds cool
i don't know what that would even want to be capable of
collection pages are just arbitrary UI that probably has more than one page
True
and I already made a util function for collection pages that have cards
everything else is too unique for me to cover or care about
yes you will
cool, ty
-# i should specify non-fake cards, technically my blind collection objects are also cards
do you mean to say I should put #1# in the name and set it to a global var to change it?
-# I'll try that
Can u not wisper
I cant hear you well
👀
I hueshifted a little so you can see them like in balatro but behold, the Alternative suits
There will be a smeared joker that has all modded suits however the original will stay as is because of the enhancements
Why does this message not get sent? The game doesn't crash either, it just doesn't go off for some reason
what context?
setting_blind
doesn't have message returns
Oh I see. I didn't realize different contexts couldn't take message returns
keybinds got docs now https://github.com/Steamopollys/Steamodded/wiki/SMODS.Keybind
onto mod functions
wooo!!!
-# nobody will notice i actually hid a breaking change in there
-# they definitely wont, trust
-# it's a rather irrelevant one, previously action got passed G.CONTROLLER which is useless because it's already a global so now it just takes self
??
okay let me
fix tmj then
i just had a dumb idea that would be hard to do but cool if it was possible, minigames between antes that can get you free stuff that normally appears in the shop
not sure why that would ever be necessary
sound sfun
love it
i have a folder for mods but idk how to put mods in it how do i put mods into the folder?
lmao i didn't think anyone would be using that (but also i was somehow unaware that's what the args were even though i should have known)
its just an easy shorthand tbh
we kinda had the same thing a while back with blind funcs passing G.GAME.blind
is there any mod that changes the Joker's name and/or description?
I saw one joker that switched bewteen "im so happy" and "im so sad" but I forgot where it was 😮💨
Since I guess this isn't possible
it's so concise
amazing
How would I go about changing some functionality of vanilla hand types?
I did not understand that
I thought you meant something like this
use SMODS poker hand API to take ownership of the hands and change their evaluate functions https://github.com/Steamopollys/Steamodded/wiki/SMODS.PokerHand
Neat, thanks
or hook/patch the underlying functions get_X_same/get_flush/get_straight if you're after a less invasive change
no.
I'm saying you should have two different localization entries
Ah my bad. I didnt mean a "translation" change but more like after X joker activates, then Y joker changes name and description
not what i mean either
let me explain
{
descriptions = {
Joker = {
j_mod_myjoker1 = {
name = 'Name',
text = { 'Text' },
},
j_mod_myjoker2 = {
name = 'Different Name',
text = {'Different text'}
}
}
}
you can have a setup like this in your language file
then you can use loc_vars to choose any of these descriptions
loc_vars = function(self, info_queue, card)
if condition1 then
return { vars = {'vars for desc1'}, key = self.key..'1' }
end
if condition2 then
return { vars = {'vars for desc2'}, key = self.key..'2' }
end
end
that looks interesting
if condition1 was G.GAME.isAvailable
and G.GAME.isAvailable changes during a round, would the change apply?
This sounds like a better solution to what I'm after. What's the process for this? I apologize if these questions are a little silly, I'm just finding the wiki somewhat hard to navigate
yes
neat, ty
depends on the exact change you need, you'd probably need to use lovely patches or a regular function hook if you're just intercepting the calculation as a whole some of the time (like when there's a certain joker)
if you're after straights specifically we have a bit of an issue, Steamodded overrides get_straight and lovely patches on steamodded files are currently broken
Hmm ok. I am going for specific joker presence for this, here's the functionality I'm after. Sadly I'm still very new to this so lovely patches sound a little intimidating
just to be sure I understand the effect correctly, you want them to act as the same rank?
This is not my concept, but I believe the idea is same card exactly (so for example a hand of 5 cards containing all evens would register a flush 5)
the ranks part is kind of hard if you want them to be able to stand for each even/odd rank at the same time, but if you choose one rank to represent them you can get away with hooking Card:get_id()
same exact card seems a bit sketchy given other card modifiers, like how far do you take that
My guess is modifier doesn't apply, just base rank and suit
if we reduce it down to just suits, i don't think just making them wild would work because something like 5 same cards shouldn't trigger something like flower pot
I thing adding wild enhancements to the cards kinda ruins the idea anyways
quantum enhancements do just let you have the cards act as wild even though they're base cards
I've never heard of these before. What mod is that a part of?
Say I went the taking ownership route, would I have to copy over the base functionality to my end?
right, so what about sticker calculation on playing cards doesn't work? everything?
i haven't thoroughly tested tbh
end_of_round definitely didn't work
before my trying to get things working, I'm sure nothing about it would have worked at all, given all there was is a patch into Card:calculate_joker that would take over the return value
made it work, do you think its worthy of the legendary rarity?
yeah that seems really strong, removing playing cards is an insanely good effect to have and even get econ for
of course it's a limited resource so idk about legendary
but no less than rare for sure, could be something like an epic
cooking more docs btw https://github.com/Steamopollys/Steamodded/wiki/Localization
man, when you properly look through the game's code there are so many things in here that do absolutely nothing
oh for sure
(i only made this because i needed to reference something for mod.description_loc_vars)
oh nvm my highlighting was off
so question, how hard would it be to change the description of a voucher if a specific joker is unlocked?
oh
same principle
ok that seems simple enough
do i need to patch something to disable discarding if certain cards are selected?
and also is there a way i can prevent certain jokers from being sold?
70% for common, 24% for uncommon 5% for rare and 1% for epic
lets go
yes
in button_callbacks.lua
Something wrong with this for loop? It's giving me an error in my calculate function: for k, v in pairs(G.jokers.cards) do
what would be the best way to patch that with the lowest chance of breaking other mods if they patch that?
try ipairs? cause iirc thats what vanilla stuff does when doing a for loop
nothing wrong with that by itself. would need to see what's around it and what context it's being called from, as well as what error you're getting
you do want ipairs instead of pairs here because pairs isn't ordered, but that won't cause errors
Ok. I tried just the for loop with an empty body but it was still giving an error. I'll send the contexts and stuff in just a minute
Ah, makes sense. The error was 'for' limit must be a number
there's no inherent difference there
Here's the full calculate function:
calculate = function(self, card, context)
if context.end_of_round and G.GAME.current_round.hands_played == 1 then
for k, v in ipairs(G.jokers.cards) do
-- if v.set_cost then
-- v.ability.extra_value = (v.ability.extra_value or 0)
-- + (v.sell_cost > card.ability.extra.money_max and card.ability.money_max or v.sell_cost)
-- v:set_cost()
-- end
end
return {
message = localize('k_val_up'),
colour = G.C.MONEY
}
end
end
and that was on that line specifically?
oh nvm I am dumb, I use pairs on jokers all the time 😆
Do I need to remove the joker and re-add it for it to work 🤦♂️
never hurts to try
Nope, still breaking. I wonder if it has something to do with accessing G.GAME.current_round.hands_played for some reason
When I remove that part it seems to work just fine
reading a value shouldn't cause issues
state_events is a vanilla file right?
yeah
check that line number in the lovely dumps folder
👀
should the debug_info be moved here from the utility functions
yeah probably, lemme do that
hmmm, how should eval_card handle debuffed cards
or do we leave it up to developers in calculate functions to check for debuffs
i don't think we should
that makes debuffed cards not well-defined
debuffed cards should just do debuffed things
oop, I see my mistake. I forgot an extra after ability when accessing my card's money_max field 🤦♂️
I'm debating fixing this up so people can install luajit if they want a performance improvement
if it offers one at all
unless I'm being dumb and it's already luajit
who knows
it's been a long day
isn't it already luajit
Ok, so that wasn't the issue. For some reason inside the for loop if I access v.sell_cost it breaks, but doesn't that get the current card's sell value? Or am I missing something?
I think I've got editions going through eval_card properly now too
so the playing card part of this (at least in evaluate play) should be pretty much done
I'm currently trying to keep track of retriggers, but checking within context.cardarea == G.hand crashes with this. Any ideas? Am I potentially overcomplicating things for myself?
great stuff
if you're in context.repetition it expects how many times it needs to repeat afaik
like
message = localize("k_again_ex"),
repetitions = card.ability.extra.retriggers,
card = card
}```
I might be wrong tho
I never updated my steamodded but I thought it'd be funny to show since they'll spawn anyways
We got context.scoring_hand for checking cards that have scored, but is there a context that checks for cards that are played, not just scored
Ok, so I forgot to add and not (context.individual or context.repetition) in the context check, so it complained when I returned the Value Up message in those contexts. Man that had me stumped lol
I am in that context, however omitting the cardarea context I mentioned does work (i.e. it works keeping track of retriggers from a played hand, but not retriggers from held cards)
Lmao
maybe try adding
or (context.cardarea == G.hand and (next(context.card_effects[1]) or #context.card_effects > 1)) then
these last two conditions are equivalent for arrays
I thought so, but they are both present in Mime logic
Would returning repetitions = 0 be valid?
so patching discarding, should i use a regex match for it?
I dont think so
no, repetitions is for extra repetitions
it's so small 🎉
I added another if after the first one for my use
[patches.pattern]
target = "functions/button_callbacks.lua"
pattern = '''if G.GAME.current_round.discards_left <= 0 or #G.hand.highlighted <= 0 then
e.config.colour = G.C.UI.BACKGROUND_INACTIVE
e.config.button = nil
else
e.config.colour = G.C.RED
e.config.button = 'discard_cards_from_highlighted'
end
'''
position = "after"
payload = '''if G.GAME.nof_disable_discard then
e.config.colour = G.C.UI.BACKGROUND_INACTIVE
e.config.button = nil
else
e.config.colour = G.C.RED
e.config.button = 'discard_cards_from_highlighted'
end'''
match_indent = true```
mm but I guess if another mod modifies the first one then it wont be added
But first, we have to talk about Parallel Universes
hold up
btw
oh actually that gives me a fun joker idea actually
select a card to put back into the deck for a future hand
does playing cards count for
context.remove_playing_cards
?
as in they are being removed from the hand
I got an odd question: is it possible to turn the hiker ability into a consumable that i can use on any card i pick?
is there a joker for +3 mult for all the new suits?
I've made a consumable that gives 2 target cards 10 chips, if that helps
(permanent Hiker-flavored chips too)
ATM no. Will there? Yeah
That's exactly what i wanna do for my one set of tarots
lemme rip that code out of my current mod then...
oh cool
SMODS.Consumable{
object_type = "Consumable",
set = "atomic",
name = "atomic-silicon",
key = "silicon",
atlas = "atomic_atlas",
pos = {
x = 6,
y = 1
},
loc_txt = {
name = "Silicon",
text = {
"Gives up to {C:attention}#1#{} selected",
"cards {C:chips}+#2#{} extra chips"
}
},
cost = 3,
discovered = true,
order = 23,
config = {
extra = {
max_highlighted = 2,
bonus = 10
}
},
can_use = function(self, card)
return #G.hand.highlighted > 0 and #G.hand.highlighted <= card.ability.extra.max_highlighted
end,
use = function(self, card, area)
for i = 1, #G.hand.highlighted do
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.4,
func = function()
G.hand.highlighted[i]:flip()
play_sound('tarot1', 1.1, 0.6)
return true
end
}))
end
delay(0.2)
for i = 1, #G.hand.highlighted do
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.4,
func = function()
local c = G.hand.highlighted[i]
c:flip()
play_sound('tarot2', 0.9, 0.6)
c:juice_up(0.3, 0.3)
c.ability.perma_bonus = c.ability.perma_bonus + card.config.extra.bonus
return true
end
}))
end
end,
loc_vars = function(self, info_queue, center)
return {vars = {center.ability.extra.max_highlighted, center.ability.extra.bonus}}
end
}
...for future reference should I just DM big code blocks like that?
c.ability.perma_bonus = c.ability.perma_bonus + card.config.extra.bonus this is the important bit btw
yeah
how hard is it to add/replace functionality of a base game enhancement? Is it just claiming ownership and overriding one of the methods?
depends which one you want to change
SMODS.Enhancement {
key = "devour",
loc_txt = {
name = "Devour",
text = {
"Discarding cards adjacent",
"to it will grant +5 Mult",
"Resets when played"
}
},
atlas = 'Enhancements',
config = { extra = { mult = 0 } },
pos = {x=1, y=1},
calculate = function(self, card, context, effect)
if context.discard then
for i, handCard in ipairs(G.hand.cards) do
if handCard == context.other_card then
if (i > 1 and G.hand.highlighted[i-1]) or
(i < #G.hand.cards and G.hand.highlighted[i+1]) then
card.ability.extra.mult = card.ability.extra.mult + 10
end
break
end
end
end
if context.cardarea == G.play and not context.repetition then
if card.ability.extra.mult > 0 then
effect.mult = card.ability.extra.mult
end
end
end
}
I'm trying to make a new Enhancement where discarding cards adjacent to the Enhanced card grants +10 mult, but it keeps crashing, saying that attempt to index field 'extra' (a nil value)
I'm thinking that it's because mult is 0 in the config section, but the card's supposed to start off at 0 mult before ramping up, and without config, it'll just crash saying that it needs the extra section
could i just do like c.ability.mult?
oh on that note, is it just taking ownership of something to change its graphics? i want to change the colour of red seal, but i've never touched take_ownership 😭
does anyone know why it triggers after playing a hand?
then it'll be a bit of a pain because of how they're coded
what level of pain? Are we talking lovely patches?
lots of lovely patches I would imagine
Ok so it actually did accept repetitions = 0 believe it or not

hmm... I guess I'll need to study more of my full combination then
because I want to enhance enhancements if they have a certain sticker on the card
I don't think enhancements ever receive the discard context
agony
when I'm done with the calculation rework you'd be able to do this in the sticker calculate code
Is this where a lovely patch comes in because I have zero experience with making those
at this rate I think I'm going to just release a mod with 26 consumables then...
Lemme see if the chip ones work atm
then focus the jokers
oh wait maybe they do
I am lost inbetween builds
I'm still lost on what the nil error means
Is it because mult is 0 and it's looking at it as a nil or something
which line?
0 is not a nil value
Something else is amiss then
you can just do if card.ability.extra.mult then if it starts as 0
what's up?
Should I remove the config as well?
I don't think you'll ever increment it though, context.discard doesn't have context.other_card
no keep the config
Ah right
Yeah it doesn't have a popup saying +10 Mult or something, is that something you have to manually code in or it does so automatically
you probably want to use context.pre_discard and check if context.full_hand cards are adjacent to the current card instead
it doesn't have any return state though so you'd need to throw your own message
-# for now
This is for the newer releases of Steamodded? Could potentially stop "useless" retriggers on mine. 😅
what do you mean by useless retriggers on yours?
Not "Mime"... I'm just not sure how to limit the Mime-like retriggers on cards held in hand. Mine currently applies retriggers regardless if the card's enhancement or seal does anything or not. 😅
oh yeah this will fix that
What does context.pre_discard do? Does it check discards or a state/something before discarding?
im pretty sure its for things like burnt
-# dont quote me on that
istg it says on the documentation what jokers use it
oh snap vanilla only has it on jokers
😢
[[patches]]
[patches.pattern]
target = "functions/state_events.lua"
pattern = "inc_career_stat('c_cards_discarded', highlighted_count)"
match_indent = true
position = "after"
payload = """
for i = 1, #G.hand.cards do
eval_card(G.hand.cards[i], {pre_discard = true, full_hand = G.hand.highlighted, hook = hook})
end"""
Alright, let's see if this works
this is the lovely patch to add it for cards in your hand
wait nvm I can't read
it's built in smods
it runs just before the discard happens
'cause I very much am not sure how to limit it further currently. The card_effects will be available for use with the later release?
if context.cardarea == G.hand and context.other_card and (context.other_card.ability.set == 'Enhanced' or context.other_card.seal) then
if context.repetition or (context.end_of_round and not context.repetition and not context.individual) then
return {
message = localize('k_again_ex'),
repetitions = repeats,
card = card
}
end
end
calculate = function(self, card, context, effect)
if context.pre_discard then
for i, handCard in ipairs(G.hand.cards) do
if handCard == card then
if (i > 1 and context.full_hand[i-1]) or
(i < #G.hand.cards and context.full_hand[i+1]) then
if card.ability.extra.mult then
card.ability.extra.mult = card.ability.extra.mult + 10
end
end
break
end
end
end
if context.cardarea == G.play and not context.repetition then
if card.ability.extra.mult then
effect.mult = card.ability.extra.mult
end
end
end
Yeah I may be a bit lost on how I should implement pre_discard
i geniuenly stared at my screen like yougottabepennyingmyjim when you sent that
it should just only retrigger things that have an effect automatically for you
is it not card.ability.extra.x?
not card.config?
-# i presume its the same for consumables as it is for jokers, but idk
that looks a good start, just need to change the check on adjacent cards to see if G.hand.cards[i-1] is in context.full_hand
I just copy/pasted the one from rft
#💻・modding-dev message
then changed it
oh I might've screwed up that part of the code
at some point I did a transition from basing everything off config to ability, but haven't gone through and tested every card
Not sure what syntax should I use to make it so that it can check if context.full_hand contains G.hand.cards[i-1]
I define and use this to check if tables contain a value
function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end
I'll let ya know how it goes in a bit
👀
It still attempts to retrigger the Gold cards and Steel cards during the Held-Cards evaluation stages... former not doing anything because it's not context.end_of_round and latter not doing anything because it is context.end_of_round. (+2 retriggers given here)
Where do I add the function table? Outside the calculate function? Or outside SMODS.Enhancement or something?
Outside entirely, yeah.
Well, even then it still says attempt to index field 'extra' (a nil value)
function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end
...
config = { extra = { mult = 0 } },
pos = {x=1, y=1},
calculate = function(self, card, context, effect)
if context.pre_discard then
for i, handCard in ipairs(G.hand.cards) do
if handCard == card then
if (i > 1 and table.contains(context.full_hand, G.hand.cards[i-1])) or
(i < #G.hand.cards and table.contains(context.full_hand, G.hand.cards[i+1])) then
if card.ability.extra.mult then
card.ability.extra.mult = card.ability.extra.mult + 10
end
end
break
end
end
end
if context.cardarea == G.play and not context.repetition then
if card.ability.extra.mult then
effect.mult = card.ability.extra.mult
end
end
end
}
I'm out of ideas what causes this error except for the config tag
Did you give the enhancement to the card before you added the config
I still can't figure out why it's not working
If this is main branch I think that’s what happens since quantum enhancements got merged
Is there an easier way than this to make it so that set_cost() doesn't automatically recalculate a card's base cost? For example, I have a joker that resets a card's sell value to 0, but if I want it to go up by 1 after that, it adds the base cost and then + 1 to that.
Currently on 1.0.0~ALPHA-1217c... so, not much else I can do about it for the time being?
I don’t believe so, nope
Fair enough, I'll just mention the jank in the description.
Seems like it I guess? You mean in game or in code?
In game
Yeah I did
I used the debug tool to set a card to the Enhancement I made, discarded a card next to it (gave no popups), played a Flush with it, and it crashed
Actually, have you tried doing what mime does?
context.card_effects or context.other_card.card_effects end up as nil, did try.
I see
Potentially such has not been exposed yet.

