#💻・modding-dev
1 messages · Page 610 of 1
No, it's not, that's the name.
Hold on, I'll check
You are right, the key is sunplanet
modify what?
no
thats for modifying pools, no relation to that
you would use take ownership or patching
damn
so how do i do that
(also while im at it how do i give lucky cards more variables and change its text)
<@&1133519078540185692>
thank ya :)
-# sorry for the double ping, was gonna bump something and then that happened
Bump, because I'm still stuck. Sorry I keep doing this, I'm just lost
how do i create additional cardareas?
how do i make a voucher that decreases boosterpack price?
my freind, we are not ChatGPT
iam aware
but i do not know how to make something that changes the price of booster packs
and mayhaps someone here does
you don't seem to have bird_active or bird_inactive anywhere in your localization file
Hook Card:set_cost
thanks
I copied from loyalty card in vanilla remade so I didnt think I had to
no, you didn't just copy, you changed it
I'm just gonna try copying it again to see what I did wrong
bird_active and bird_inactive don't exist, the vanilla remade code has loyalty_active and loyalty_inactive
so where would I specify those??
in your localization file, under misc and v_dictionary
I've been trying to get this to work, but it just doesnt for some reason. I dont know why. It should give me a Sol, but it has never triggered.
Would this be the format then?
return {
misc = {
v_dictionary = {
}
},
descriptions =
-- Everything else in localization I had
Just blank for now so I know I have the right idea
Yep, that's correct
okay, and what would I specify the bird_active and bird_inactive so it would have the description like Loyalty Card?
do you want the message to be the same as loyalty card
Pretty much, yes
cus if so, don't make a new one, just use the loyalty_active and loyalty_inactive keys
Oh, and it should work with the variable used before?
it will work just like loyalty card
Nevermind, works! Thanks :)
you need c_modprefix_sunplanet to spawn the modded consumable
I will try that
It is still not triggering
Yes, it's context.consumeable.config.center.key ~= 'c_cry_sunplanet'
No, what I meant was the key for Sol was not cry-sunplanet, this is about the if
It is not, this is the current code
you might need G.E_MANAGER:add_event
No, an event is not required.
Yeah, I dunno why it should
No, it's card.config.center.key not card.ability.key
Is it possible for hands, discards, dollars, chips and mult to be treated as the same value?
I mean, you could just make them all equal with something idk
My code works, just a little too well. I can still use a Sol card and get triggers from that.
replace card.config.center.key with context.consumeable.config.center_key on the 2nd part of the condition
and I'd move the using_consumeable outside the parenthesis
Ah, that makes more sense now
It works, thanks
Also, I see that the Vanilla Remade wiki has something called quantum enhancements. What is that? Does that mean it is in some superposistion?
cards count as multiple enhancements as once and have all of those effects
take lucky 7 from extra credit
I see now
itll roll the lucky card chances for each card and scale lucky cat if it triggerss
got it, makes sense
How do I check if a card has an specific enhancement? I tested the methods on the Vanilla Remade Wiki and for some reason it didnt work.
if SMODS.has_enhancement(card, 'm_modprefix_key')
difficulty understanders, does this looks like a non-ridiculous alternate stake path?
- White Stake
- Scarlet Stake: Lose $0.5 per Ante past 2 when entering shop
- Irrigo Stake: Level down third hand played each round
- Void Stake: Jokers can have Counterfeit sticker (sell value locked to $0)
- Sky Stake: Showdown Blinds appear twice as frequently
- Mint Stake: -1 Chip and -1 Mult per ante for each card scored
- Tungsten Stake: Selection limit 1 for first hand or discard each round
- #CA7CA7 Stake: +1 Win Ante
- Rose Gold Stake: Applies both #CA7CA7 Stake and Gold Stake
-# oh ffs discord, let me zero index my lists.
irrigo stake feels specifically like a fuck you to high card and pair
mint stake feels like that for five card hands
two pair on top 🔥
i wouldn't mind that as much but then mint stake says fuck you to every build other than pair and high card
also is there any benefit to extra selection limit on hands beyond scoring an additional card
on the one hand i do want to balance vanilla's tendency toward spamming small hands
on the other, i'd prefer to do this by rewarding large hands
counterfeit sticker is cool
i feel like sky stake's been done before but it's not really a bad thing
tungsten stake feels like it'd be better as a boss blind
i think tungsten sets the limit to 1
oh yeah right im stupid
sky stake has definitely been done, it's a common suggestion for a rework of blue
i think -1 mult and chips per unscored card would be a better idea
this does Very Little
tbh mint stake feels boss blind-esque too
unless you have phanta ig
isn't balatro in lua the 1 indexing language
anyway in conclusion, i think overall you have some good ideas but mint and tungsten probably need to get reworked entirely
i think theyre all mostly fine in a vaccum but i think that also these might affect playing hands disproportionately too much
tungsten feels fine if it was 2 cards
anyone know if this is revo's vault causing the crash?
mint is not great though
looks to be
tungsten is meant to amount to "lose a hand or a discard but you get to decide which"
maybe a bit much, nobody likes blue stake after all
balance sure, but i don't think it feels like a stake
stakes have very passive effects in vanilla, making something directly affect scoring like mint or only apply for the first something for a round isn't that
does rose gold apply all of the default stakes
rose gold is probably gonna be hell regardless
16 stakes worth of stake
that's the idea, yes
yes because gold applies orange, which applies purple, which applies blue, etc
what if it was rose gold steak instead and i ate it
that sounds horrible on every deck other than yellow
🥩
i mean quite a couple of these stakes are like that
i think theyre not necessarily meant to be vanilla feeling stakes
if they are id suggest a couple reworks though
hello
thanks mods 💖
I cant seem to get the Light cards to retrigger, they are the Cryptid Light cards. I dont know why this is happening, especially since I have made other retriggering Jokers that do the same thing.
Im using chat gpt to help a bit, and im wondering if
"if context.joker_main then
return {
xmult = card.ability.extra.xmult * stickercheck() + 1,
}
end"
has to be changed in Revo's mod? Its saying that the call may of changed names or is handled differently.
pinned message
It's context.other_card not card in SMODS.has_enhancement
even the pinned message aside, chatgpt is not helpful
i dont think we can convince them of that
I tried that, you can preempt it with a question if it knows that it exists, which it actually does, then you ask it to code in Lua + the steammodded keys, and that is actually how I got a Joker to work.
TLDR: Yes, yes you can
ok besides the fact i have no experience or help. can i get some help?
how much time did you waste over doing it normally
we have no clue what you're trying to even do
i would report it to revo without your correction
standard procedure for when a mod that's not yours crashes
you just gave us a potential answer without giving us the question you initially asked
yeah you're lucky i was around when your game crashed
wow hostile environment. i just want to play my game. i reported it to Revo, and i just wanted some pointer if i could get it to work on my own.
then Don't Use AI
i didnt know

additionally always provide context
in this case the crash the line of code and wherever stickercheck is defined
or if it isnt say that
Pinned things are always important, check those in every server and channel on Discord. Theres normally something is all I can say
How would I spawn in a vanilla joker with a modded joker? 1. I'm unsure how to spawn a joker from another, and 2. I know you can use j_prefix_key for modded, but vanilla I'm unsure
There's just no prefix. Like, if I wanted to spawn Reserved Parking, I would do j_reserved_parking
Got it, thank you
best way to find a vanilla joker's key is to search en-us.lua in the vanilla source
Got it, and then how would I spawn a Joker into the Jokers lineup?
This is not working for some reason, I cant get it to retrigger the Cryptid Light Cards. Im going to look like I just had chemo from the amount of hair pulling that is happening
Yes, it's context.other_card instead of card not SMODS
Did I not?
Yes, you replaced SMODS instead of card
bump because i want to know,
what is the value that handle the if it's the fist most used joker,second most used joker,third most used joker and ecc...
I know that the has_enhancement does not exist for context.other_card, but I dont know any other solutions.
No, you had it as SMODS.has_enhancement(card, ...) but then you changed it to context.other_card.has_enhancement(card, ...) instead of SMODS.has_enhancement(context.other_card, ...)
hello, really simple question
when a joker is triggered in balatro, like when you have the heart joker and play a hear card, the joker does a little animation
how can i add that animation to my jokers?
when a joker returns something in a calculate function, and that something has a message (either by default or by adding a message to the return manually), then it will have the animation
if you need the animation to happen outside of a return (e.g. you need it to animate multiple times), you can call SMODS.calculate_effect(card, {...}) where the curly braces are the same as what you'd return in a calculate function
what message do i add to get the default shaking animation?
doesn't matter, smods applies it
literally this is the most ai hateful server i've ever seen
for good reason
I despise ai with a burning passion
and if you're e.g. returning chips/mult/etc for scoring, then you don't even need to add a message at all
you're being really helpful but i'm not sure i understand ;-;
what is your goal
it's something "Juice up" if i remember
when a joker is trigged, i want to play the standard animation for jokers getting trigger (eg lusty joker when you play a heart card)
you don't need to worry about it
just code your joker and forget about the animation
i did
it'll either happen naturally, or you just have to add message = "something" to the return table
("something" being the text that will display when it triggers)
it's not happening naturally, can i add an empty message to get the animation?
cuz like the joker is currently staying still when its triggered, and i rly like the animation
No, the card is the second input.
if you explicitly don't want any text, then you should have this in your calculate function (not in the return statement, my bad. usually if you want the animation you also want some text with it)
G.E_MANAGER:add_event(Event({
func = function()
card:juice_up(0.8, 0.8)
return true
end
}))
you need the event for timing purposes, the shake itself is the juice_up call
idk, but im not discussing furthermore because its the rules
seu pai ahh
how do you check for played unscored cards?
if context.cardarea == 'unscored'
You need a platform role.
where?
....
how do you make that it gives the same amount of money as the fifth most used joker(the one in the middle)
thanks
You need to put all the entries in a number indexed table then sort them by count then get table[5]
So I found how to create a Joker, but it just spawns it in on the screen...doesn't add it to my Jokers.
if math.random() < 1/15 then
create_card("Joker", G.jokers, nil, nil, nil, nil, "j_cavendish")
else
create_card("Joker", G.jokers, nil, nil, nil, nil, "j_gros_michel")
end
No, it's SMODS.add_card
oh, thanks
can you show me an example if you can?
Like this??
SMODS.add_card {"j_cavendish"}
No, SMODS.add_card({key = 'j_cavendish'})
alrighty, thank you
does it return a table with unscored cards, or do you check yourself?
i guess if you were to check urself, it would be full hand - scoring hand
What is the goal?
look at all unscored cards and find a specific rank
Iterate over context.full_hand and check if SMODS.in_scoring(card, context.scoring_hand)
an attempt...
Tables are {} not []
how does it look like now?
now it gives this error
any response
i would lose motivation again to work on this if i don't find an answer to this problem...
I'm not helping if the code is formatted like that man
also it looks weirdly like python? 🤔
i don't think context.before has unscored as a cardarea
^ that'd be my guess too but you'll want to confirm that by printing
i mean yea they have a print already
print(context.before)?
do like it how it's formatted now?
More like if context.before then print(inspectDepth(context)) end but it's up to you how you want to print it
Is this a joker?
You need to iterate over context.full_hand like I said.
At least it's readable now. Why are you trying to sort an already manually sorted table?
Ah
you should start with an empty table all_most_used_jokers = {}, then insert into it, then sort
like the example Something gave, though you'll probably need to insert every joker since you're looking for the 5th biggest 🤔
so like this?
i missed a negation but yeah
like this isn't it?
First insert, then sort. You're sorting, and not inserting
(the used_cards[#used_cards + 1] = ... in something's code is the insertion part)
Yes.
now?
Insert in the for loop. Otherwise k and v don't mean anything
instead of the temp_count, that's not gonna help you here unfortunately
and what should i replace it instead?
with the insertion
this?
No, within the if statement
this
or this?
First one
ok
But change it to +1 instead of +5 (we're simply appending/adding to the end of the table, +5 wouldn't really mean anything)
And move to sorting so that it's below the for loop insertion
And remove the v.count > all_most_used_jokers comparison since that doesn't mean anything
like?
Sort after the entire for loop. Don't sort in the for loop. It would technically work, but you're wasting a lot of compute
is it common to set parameters like blueprint compatibility and sticker compatibility if they're going to be default anyways
it's usually skipped if they're default afaik
ic
finaly like this?
yeah that's pretty good
but you're returning the whole (sorted) table now, you wanted a specific one right
yes one specific one, the 5th one
you know how to get that one?
what is it, like this?
👍
now what do you want with the 5th most used joker? give money for the amount of times it's been used? how much the 5th used joker costs?
give money for the amount of times it's been used
okay
now you're returning the 5th most used entry, which for example looks like {count = 4, key = "j_card_sharp"}
so how do you return the amount of times it's been used?
it should just get this number below the this joker:
and then give the amount of money the same as the number below the joker
I understand. I'm asking you if you know how to get it from the table entry
well uh then, no, i don't know
you don't know how to index a table in lua?
also this crash occur when i try it ingame
I have no idea what your code currently looks like
Nice job on the dollars =. But you're still just returning the entry of the 5th most used joker, not the amount of times the joker has been used
Do you understand what I mean when I say "entry"?
yes, the joker that is in the 5th position or the joker key
But do you know what that entry actually looks like in code?
this is what i get for being too lazy to fully read documentation
like this?
Close! More like {count = 12, key = "j_why_do_i_exist"}
so do you know how to get the count out of the table?
this is not probably it
No. Check out https://www.lua.org/pil/2.5.html for examples on how to read and write to tables
i forgot to run the folder loader on the localization files
does,now,this,work,?
it should 👍
do you that am asking all of this
because am adding global stats gamevars to joke forge?
did you know?
I did not
alright i can go to rest now,bye and thank you
Hi friends. I've managed to get an xmult joker working by myself, but the xmult value in the description just says Xnil. Can someone take a peek in my code and try and help me find what I missed?
Also it might look like spaghetticode but hey
You don't have loc_vars
Making a Joker that calculates the number of Gros Michels and Cavendishes being held in hand and some math seems to be going wrong. Any pointers what I could do?
if context.joker_main then
card.ability.xmult = card.ability.xmult + ( #SMODS.find_card("j_gros_michel") + #SMODS.find_card("j_cavendish") ) * card.ability.xmult_gain
check baseball card's code in vanillaremade's repo
what's wrong with it
When I had only 3 Michels it was at x2.5 I believe, my xmult_gain was 0.25x
and you want it to give 1.75?
correct
I think I figured out it was possibly because the variables were not marked as extra
Where and how in Balatro's code is G.PROFILES[G.SETTINGS.profile].career_stats.c_single_hand_round_streak incremented?
if context.joker_main then
return {
xmult = 1 + ( #SMODS.find_card("j_gros_michel") + #SMODS.find_card("j_cavendish") ) * card.ability.xmult_gain
}
end
what about this
I ran a recursive file-searcher program and it said it only appeared in game.lua, functions/common_events.lua and functions/state_events.lua. But nothing in those files told me how it went down.
what do you need to know that's not there
How the game knows when to increment it.
Understood.
Hmm. Anyone know where a list of G.FUNCS. is?
Forgot to mention but this code does not update live for some reason? I looked at my other jokers and confused why that is
I feel my card is a bit unorganized...also trying to figure out why the xmult isn't working properly (does not update live or calculate properly), where the place to return my xmult is, and how to have the messages for when a joker is added pop up sooner (normally wouldn't send everything, but this time its all important)
config = {
extra = {
xmult_gain = 0.5,
xmult = 1,
every = 1,
cooking_process = 1
}
},
loc_vars = function(self, info_queue, card)
return {
vars = {
card.ability.extra.xmult_gain,
card.ability.extra.xmult,
card.ability.extra.every + 1,
localize { type = 'variable', key = (card.ability.extra.cooking_process == 0 and 'loyalty_active' or 'loyalty_inactive'), vars = { card.ability.extra.cooking_process } }
}
}
end,
calculate = function(self, card, context)
if context.joker_main then
card.ability.extra.xmult = card.ability.extra.xmult + ( #SMODS.find_card("j_gros_michel") + #SMODS.find_card("j_cavendish") * card.ability.extra.xmult_gain )
card.ability.extra.cooking_process = (card.ability.extra.every - 1 - (G.GAME.hands_played - card.ability.hands_played_at_create)) %
(card.ability.extra.every + 1)
if not context.blueprint then
if card.ability.extra.cooking_process == 0 then
local eval = function(card) return card.ability.extra.cooking_process == 0 and not G.RESET_JIGGLES end
juice_card_until(card, eval, true)
end
end
if card.ability.extra.cooking_process == card.ability.extra.every and #G.jokers.cards <= G.jokers.config.card_limit and not context.blueprint then
if math.random() < 1/15 then
SMODS.add_card ( {key = "j_cavendish" } )
return {
message = 'Potassium.', colour = G.C.YELLOW
}
else
SMODS.add_card ( {key = "j_gros_michel" } )
return {
message = 'Order up!', colour = G.C.YELLOW
}
doesnt't look like your calculate ever returns anything
hiiiiii gang...
anyone know how to do the hyperop thing
i need it for my mod (fallout)
also gimme 1s
it doesn't??? I had to remove the ends at the end so all that could fit so that may have something to do with it
sorry im really stupid sometimes please ignore my previous statement
All good :)
So something I'm confused about...how 2 version of my code word work. 1 works correctly and 1 doesn't, and I do not understand why.
-- Works (goes up by 0.1 per card destroyed)
if context.remove_playing_cards and not context.blueprint then
if destroyed_cards > 0 then
card.ability.extra.xmult = card.ability.extra.xmult + destroyed_cards * card.ability.extra.xmult_gain
-- Doesn't Work (goes up by 1 per Cavendish/Gros Michel when wanted 0.5 and triggers consistantly, always going up even when one doesn't spawn)
if context.joker_main then
card.ability.extra.xmult = card.ability.extra.xmult + ( #SMODS.find_card("j_gros_michel") + #SMODS.find_card("j_cavendish") * card.ability.extra.xmult_gain )
Something weird just broke, I'm getting a love2d traceback instead of the balatro traceback and despite saying it's disabling my mods restarting doesn't fix it.
I'm not sure what caused it but disabling all my mods, starting the game then restarting it with all my mods reenabled fixed it
order of operations
it's multiplying cavendish by gain-per-banana, then adding gros michel
when I had xmult_gain outside the parenthesis it still didn't function correctly
you may want to add a bracket
Okay, so I got it to work, goes up as it needs to. My issue now is that it just continuously goes up by 0.5 when theres a Michel/Cavendish when I want it to only once per
for the return values its
eemult/eechips = ^^
eeemult/eeechips = ^^^
hypermult/hyperchips = returned as a table of two values where {x, y} represents {x}y
ight
thanks
😭
bigger wip https://streamable.com/6zdk2o
would it be possible to get whenever the music changes?
how to choose a random card in deck
pseudorandom_element(G.deck.cards, 'seed')
thx
does smods have is_rank yet?
No
hi eremel
is G.C.ORANGE used for {C:attention}?
G.C.FILTER
another question, if I have a new enhancement that can shatter like glass does, is there a simple way to implement it other than lovely patching every instance where 'Glass Card' is checked?
Add shatters = true to the definition
it's a bit more visible imo
i also use different colors from the descriptions for other things
ah i see :3
why does this happen
for i=#cardtable, 1, -1 do
local card = cardtable[i]
if card:get_id() ~= random_rank or not card:is_suit(random_suit) then
card:remove()
else
for i = 0, 5 do
local copied_card = copy_card(card, nil, nil, nil,nil)
copied_card:start_materialize()
copied_card:add_to_deck()
G.deck:emplace(copied_card)
end
Question, how do I make this option toggled on by default?
FNAF = SMODS.current_mod
FNAF.save_config = function(self)
SMODS.save_mod_config(self)
end
local config = SMODS.current_mod.config
SMODS.current_mod.config_tab = function()
local voice_toggle = create_toggle({
label = localize('fnaf_va'),
ref_table = FNAF.config,
ref_value = 'voices', -- what var does this button match
callback = function()
FNAF:save_config()
end
})
return {
n = G.UIT.ROOT,
config = {
r = 0.15 ,
minw = 8 ,
minh = 6 ,
align = "cm",
padding = 0.1 ,
colour = G.C.BLACK -- this will define the background of the menu
},
nodes = {
voice_toggle, -- the option itself
}
}
end
return {
voices = true,
}
also while I'm at it, how do I use this config on the mod itself, I have voicelines that play if a card is triggred but I dont know how I disable them
like what kind of var or function that I call to check if this setting is on or off?
this should make it on by default but your config was probably saved already
FNAF.config.voices
if FNAF.config.voices = true correct?
it would be if FNAF.config.voices then
right thanks
also damn you need to at least link the stuff about the UI Guide on the SMODS section on the VanillaRemade Wiki so people at the very least have a ideia how where to start, while you still make a tutorial about a config page
bump
i think people should read the smods docs first
Hi friends! I've come to you with a bit of an ambitious idea today
So you know how Oops! All 6s doubles listed probabilities
Well I want a joker that doubles listed chip / mult values
which I don't know how to do
I did this but with mult only actually
oops all 6s can double probabilities since the entire game is built around being able to do that
lemme find that
doubling chips and mult will be much harder
thats what i expect
atleast listed chips and mult because you would somehow have to differentiate them from regular values
just doubling the effects would be easier
This is what I did (mult only rn)
That's horrible
ik
its ok i will name my variables horribly so it breaks
card.ability.extra.markiplier
Doesn't work for a lot of vanilla jokers but idk how else to do that back then
there is definitely a way to do the chips and mult values thing though, just not visually
i can go for that
mods
immolate his balls
thank you mods :3
manipulate_ret = function(table, mod) -- multiplies values in a table by `mod`. plug context.other_ret.jokers into `table` in context.post_trigger
for k, v in pairs(table) do
if type(table[k]) == "number" and (k == "mult" or k == "chips" or k == "chip_mod" or k == "mult_mod" or k == "h_chips" or k == "h_mult") then --this is only +mult/chips, but you can expand this to allow other calculation keys
table[k] = table[k] * mod
elseif type(v) == "table" and not v.area and not v.config then
manipulate_ret(v, mod)
end
end
end
``` modified function from my own mod, this should work
No, you're missing h_chips and h_mult
ah right
something i forgot to mention
the joker increasing chips and the joker increasing mult are seperate
why?
so theyre 20
AGAIN?
twist his balls
<@&1133519078540185692>
mods
i mean then you can make two functions, just copy the one i gave and change the calculation keys it allows (handy image with all calculation keys for reference)
thank you mods
mods would it be interesting to automatically check the URLs of the images posted?
theyre just webp attachments as seen at the top of the messages
No they're a URL
so probably not very
oh ok
but its image1.webp, image2.webp etc
that doesnt sound extremely interesting
well they're not linked to discord.com/images/image1.webp, but rather discord.com/images/dkfajsladfjasklfjd134.webp or whatever
again, I have no idea if that's something the mods can even check
but if it's possible then it would be very helpful
i mean the best you could do is report whatever website they link to in some places
automod specifically for those images
^ yeah, this
theres more than 1 set
alright, can you break down exactly what this function is doing?
they always have some slightly different images
oh really? from every quick glance I've had at them they've always looked exactly the same
it loops over all of the values in a table (in this use case context.other_ret.jokers which is the calculation result of the context.post_trigger joker). if it encounters a number, it checks if it has one of the keys that should be modifies it, and does so if true (table[k] is used instead of v because v is not tied to the value in the table directly). if it encounters a table, e.g. the extra table that can be returned in jokers, it'll check if the table is not a card (this prevents infinite loops and unintended effects), and if it isnt, calls the function itself again on that table, allowing it to recursively go through any number of subtables
cool stuff. Which part of the function modifies the values? for example, groudon is supposed to multiply mult values by 1.5, so what should I change in the function for the intended effect?
mod
yeah the mod value determines what to multiply by
so you would put in 1.5 as the second argument to multiply by 1.5
and would this function apply to all mult values?
or do I need to put in more calculation keys?
talisman adds more calculation keys right
the one i gave applies to all +chips and +mult, but you can modify what values get modified by changing the long string of k == "mult" or k == "chips" or ... to check other values. image has all of the calculation keys that can be used so use that as a reference
so it'd also be the emult, eemult etc. if you want this to be compatible with as much as possible
or also just check for mult or chips like Eris said
you could also check string.find(k, "mult") as a more automated approach, which will just affect anything with a key containing mult
that seems more efficient
because i'm looking to modify flat mult and xmult values
yeah it is but some stuff can slip by but there aint much you could do about that
true i suppose
i mean i cant think of any mod that adds calculation keys containing mult that dont affect mult
I will addd a calculation key that contains mult that doesnt affect mult so there exists one
and its also better than adding 8 extra checks because talisman adds a fuckillion calculation keys
well its like 6 because hypermult and hypermult_mod are tables ig
actually hold on
ill make a bit better version of the function because it forgets one thing currently
which was really funny when i accidentally did it
i got it yippee
manipulate_ret = function(table, mod) -- multiplies values in a table by `mod`. plug context.other_ret.jokers into `table` in context.post_trigger
for k, v in pairs(table) do
if type(table[k]) == "number" and type(k) == "string" and k ~= 1 and string.find(k, "mult") then --can be changed to `chip` for chips
table[k] = table[k] * mod
elseif type(v) == "table" and not v.area and not v.config and k ~= "colour" then
manipulate_ret(v, mod)
end
end
end
what has 1 done bro
1 is in the Crime Box for their transgressions
someone bailed out 1 just for them to get captured and put into another jail
thoughts on this chat?
if you didnt blacklist 1 it would affect the hyperoperator in hypermult and hyperchips
Wouldn't that be op with like hot potato
idk i haven't played hot potato
it has tabs in the shop with different songs
ig the k ~= 1 isnt really changing anything here since it already checks if k is a string
let me get hot potato and see what happens lol
well as long as it's not breaking anything I won't remove it
well i'll see how it goes and i'll report back with my findings
not working
show code
is it an error or just doesnt work
no error
you need to create the function outside the joker
o
to use in calculate
since its just a utility function you could probably just put it in the main file
for how to use it check my joker that uses a similar function https://github.com/borb43/Hypernova/blob/92f0d54ed1ec7f316b1ab476730e42c851ec7b6d/items/misc_joker.lua#L33-L36
its relatively simple
how can i get the cryplib instaled on my pc?
can i just download this, extract and put on my mod files?
yes
yeah that could be an issue
ok
problem
so we have Groudon modifying mult values by 1.5x
I also have Primal Groudon in my mod
and you can transform groudon mid run
and I want it to do the same to a larger degree
like 2 or 3x
how would I differentiate the functions for them to use?
well you can just use the same function but put in a different number than 1.5
but there will be multiple of the same function in main.lua
how will we differentiate them?
no like
the mod
the joker uses the function and puts in a number to multiply by
so you can just put in another value
oh
so i've implemented the manipulate_ret function into main.lua
how can i get Groudon to retrieve this information?
if context.post_trigger and not context.blueprint then
local other_ret = context.other_ret.jokers or {}
manipulate_ret(other_ret, 1.5)
end
``` this should work on any joker
you also might want to rename the function to something else since it only affects mult
and youre going to have one affecting chips too presumably
yes indeedy
1.5 here can be replaced by any number to multiply by
so I can change manipulate_ret to something like "maniupulate_mult"?
also its generally a good practice to add your mod prefix to globals you create or put them in a table for your mod
so theres less chance of interfering with other stuff
something like manipulate_mult_esz
yeah
to distinguish it
and now in order to recall this information using groudon, i just use a calculate = function, right?
yeah
brilliant
this little bit of code should work
also actually i probably shouldve said this earlier but context.post_trigger does not calculate for playing cards as of now, so stuff like mult cards will be unaffected
well idk if it will
and it would be pretty nice to have that because of the small use case of manipulating return values
what are you testing with
i know some jokers have their messages hardcoded to always say the same value
are you sure its flat mult
it should be flat mult
that's what it advertises
im pretty sure scholar does properly display the mult changes
ok so i only have abstract and groudon
but it's only giving me +6 mult
when it should be giving me +9 mult
is the mult counter also only going up by 6
abstract joker gains mult based on the jokers you own
watch the actual mult UI on the left of the screen and not just the message that abstract joker gives you
does playing a high card end up with 7 mult or 10 mult
7 mult
hm...........................
try replacing string.find(k, "mult") in the function with string.find(k:lower(), mult) and see if that changes anything
idk if it will but maybe
or maybe just try some other jokers because maybe abstract is just wierd
i know stone joker either doesnt work or doesnt display properly with this either
easy fix atleast
tried it with new code
also tried it with droll joker
still not working
there is only one mention of post_trigger in the entire main file
so i dont believe so
you should have an SMODS.current_mod.optional_features somewhere in the main file
if its enabled
ok ill brb
how can i check if a card that is being scored is debuffed
You can't, because debuffed cards don't score.
oh
you can make them score if you need to
where are you trying to do this?
do SMODS.in_scoring(G.play.cards[X], context.scoring_hand)
kthanks
though you can also just look at the cards in context.scoring_hand
smods just has a function for everything now huh
next update we will have SMODS.generate_mod()
where in the main file do i put the optional features?
SMODS.calculate_joker_effect("+4 Mult") coming 2026 real
it already has, trust
SMODS.pinkprint_effect when
seu pai wannabes
?
8 month old function btw 🙃
alr
you should probably remove all the things other than post_trigger but other than that it seems to be correct
true
what does the code for groudon look like
hm
bro
what does the function look like
prefix_config = { atlas = false } and then just use a vanilla atlas key
iirc
if you want to use the default atlas for the same type of object you're making then you can just omit an atlas
no like the manipulate function
mult should be a string
ah
that should solve it at least though
ok its actually working now
you should probably change the mult in that function to be a value you pass into the function so you can reuse it for chips rather than creating an almost identical one
thats a good point
yeah that was what i was worried about
just add like a third argument and put that into string.find in place of "mult"
i didnt want to have to make a bunch of different manip functions
then again it would only be two different functions, one for chips and one for mult
the math is just different between base and primal forms
and they do that by themselves
use context.main_scoring instead of before
Ok so the backgound is black for some reason
G.C.BGCOLOUR1 = G.C.YELLOW
G.C.BGCOLOUR2 = G.C.PINK
local game_main_menu_ref = Game.main_menu
function Game:main_menu(change_context)
local ret = game_main_menu_ref(self, change_context)
G.SPLASH_BACK:define_draw_steps({
shader = "splash",
send = {
{name = 'time', ref_table = G.TIMERS, ref_value = 'REAL'},
{name = 'vort_speed', val = 0.4},
{name = 'colour_1', ref_table = G.C, ref_value = 'BGCOLOUR1'},
{name = 'colour_2', ref_table = G.C, ref_value = 'BGCOLOUR2'},
},
})
return ret
end
oh yeah I forgot
Hi folks, back again
So the Fool creates the last used Tarot/planet yeah
How would I go about creating the last used consumable
Making a joker that calculates the number of Gros Michels/Cavendishes. At the moment, when one banana is there it adds my xmult_gain as mult every hand scored. I'd want the number to update in real time (like Swashbuckler for example), and need it to detect when one is sold or goes extinct.
calculate = function(self, card, context)
if context.joker_main then
card.ability.extra.xmult = card.ability.extra.xmult + ( #SMODS.find_card("j_gros_michel") + #SMODS.find_card("j_cavendish") ) * card.ability.extra.xmult_gain
if card.ability.extra.xmult > 1 then
return {
xmult = card.ability.extra.xmult
}
end
just remove this
then it wont scale, will just update to the amt of banana
did the code i suggested not work
1 + did the same thing
what same thing
It seems to count a joker again and again every time a hand is scored
you don't need to update card.ability.extra.xmult
if you need the number for the description recalculate it in loc_vars
check how vanillaremade jokers do it
Got it, the card does have a few other issues though
But thats 1 of 3 at least
Those issues being below.
Issue 1 is when 1 banana spawns it stops making them all together, even when only 2 Joker slots are taken up (1 by the original Joker). 'Issue' 2 is that I want the messages to appear sooner, so when the banana spawns it says the message and not when scoring
if card.ability.extra.cooking_process == card.ability.extra.every and #G.jokers.cards < G.jokers.config.card_limit and not context.blueprint then
if math.random() < 1/15 then
SMODS.add_card ( {key = "j_cavendish" } )
return {
message = 'Potassium.', colour = G.C.YELLOW
}
else
SMODS.add_card ( {key = "j_gros_michel" } )
return {
message = 'Order up!', colour = G.C.YELLOW
}
when does it make the jokers? you should probably also check the joker_buffer if you're making cards during scoring
for issue 2 you should put add_card in an event
The jokers are made immediately after every = 0, so the banana would score for the hand its made
sorry I don't get it
oh also I just noticed. don't use math.random()
use SMODS.pseudorandom_probability
okay i bugfixed the code a bit now how would i add mult to a card if a condition is true
Forgot the every wasn't shown...so here's just the whole calculate as it is now. Also meant when cooking_process is 0 so thats my bad
calculate = function(self, card, context)
if context.joker_main then
card.ability.extra.cooking_process = (card.ability.extra.every - 1 - (G.GAME.hands_played - card.ability.hands_played_at_create)) % (card.ability.extra.every + 1)
card.ability.extra.xmult = 1 + ( #SMODS.find_card("j_gros_michel") + #SMODS.find_card("j_cavendish") ) * card.ability.extra.xmult_gain
if card.ability.extra.xmult > 1 then
return {
xmult = card.ability.extra.xmult
}
end
if not context.blueprint then
if card.ability.extra.cooking_process == 0 then
local eval = function(card) return card.ability.extra.cooking_process == 0 and not G.RESET_JIGGLES end
juice_card_until(card, eval, true)
end
end
if card.ability.extra.cooking_process == card.ability.extra.every and #G.jokers.cards < G.jokers.config.card_limit and not context.blueprint then
if SMODS.pseudorandom_probability < 1/15 then
SMODS.add_card ( {key = "j_cavendish" } )
return {
message = 'Potassium.', colour = G.C.YELLOW
}
else
SMODS.add_card ( {key = "j_gros_michel" } )
return {
message = 'Order up!', colour = G.C.YELLOW
}
end
end
end
end
I assume joker forge has a way to do that but in code:
https://github.com/Steamodded/smods/wiki/Calculate-Functions#step-2-logiceffects
Also, updated. Just dont know what I'd put in place of the "Dina"s I have (thats my card's key)
if card.ability.extra.cooking_process == card.ability.extra.every and #G.jokers.cards < G.jokers.config.card_limit and not context.blueprint then
if SMODS.pseudorandom_probability(card, "Dina", 1, card.ability.odds, "Dina") then
SMODS.add_card ( {key = "j_cavendish" } )
return {
message = 'Potassium.', colour = G.C.YELLOW
}
else
SMODS.add_card ( {key = "j_gros_michel" } )
return {
message = 'Order up!', colour = G.C.YELLOW
}
thats fine, i would recommend adding your mod's prefix to it too
my Joker is triggering on repetitions and at the end of the round, when it shouldn't be. what have i done wrong, and how can i fix it?
do i just add context.individual?
awesome ^u^ thanks!
also needs a context.individual so it doesnt trigger in repetition checks
Bump. Just a few issues including xmult not updating right away when a Michel/Cavendish is added and only 1 banana being able to be spawned before spawning stops working. Also stops shaking when active when it spawns 1 joker if that helps with anything
context.full_hand returns all the cards in played hand. How do I get the cards in hand that have merely scored?
context.scoring_hand
does JokerDisplay currently support retriggering unscored cards?
or, unscored cards in general?
okay i can detect unscored cards pretty easily, but evaluating retriggers is the problem right now
card retriggers are calculate manually using JokerDisplay.calculate_card_triggers
ah, i see
so, would i create a retrigger_function on The Apparition, and return depending on if the playing card is present in the scoring hand?
yes
grand ^^ thanks
wait problem
looking at the code for Sock and Buskin's definition, it doesn't check if playing_card scores, meaning one of two things
either Sock and Buskin is assumed to retrigger all played cards, regardless of scoring
or retrigger functions only get asked how many times they retrigger scored or held in hand cards
both are a wee bit problematic ^^;
or maybe this is a false dichotomy and everything's fine
it does
i can change it probably
done
yay! thanks :D will pull that now
How do I add a sticker to a Joker? Like Eternal, for instance?
joker:add_sticker("eternal", true)
Oops, what I meant to ask was how do I add a sticker to a playing card?
the same way but you will have to implement the functionality yourself afaik
looks good ^^
Alrighty then
hoho! got it working :D
I figured out a method to give playing cards Eternal, at least
It's this
Yoinked from Entropy
No, it's card:add_sticker('eternal', true)
key = 'fisherman',
atlas = 'thehoooo',
pos = {x = 0, y = 0},
rarity = 'jabong_Max',
blueprint_compat = true,
cost = 10,
discovered = true,
loc_txt = {
name = "Fisherman",
text = {
"{C:attention}On blind Selection:{}",
"Go fish. {C:deactivated}({}{C:green}#1# in #1#{}{C:deactivated} chance of a catch{})"
},
},
config = { extra = { odds = 2, creates = 1}, },
loc_vars = function(self, info_queue, card)
local numerator, denominator = SMODS.get_probability_vars(card, 1, card.ability.extra.odds, 'jabong_fisherman')
return { vars = { numerator, denominator, card.ability.extra.creates } }
end,
calculate = function(self, card, context)
if context.setting_blind and SMODS.pseudorandom_probability(card, 'jabong_fisherman', 1, card.ability.extra.odds) then
SMODS.add_card {
set = "jabong_fish",
edition = 'e_negative'
}
return {
message = "caught!",
colour = G.C.BLUE,
}
else
return{
play_sound('jabong_womp'),
message = "Nope!",
colour = G.C.TAROT,
}
end
end
}``` do yall have any idea why this is acting passivley (infinitley looping every tick) in the blind select screen
You need a context check on the else
ah yes thanks
The calculate function retriggers cards but not Jokers, which is what I want it to do. And yes, the setting is enabled. I checked the wiki, and it should be context.retrigger_joker_check, so I dunno
are the steamodded example mods up to date and able to be referenced without issues?
Is there a context.<???> specifier for when the player's Joker lineup changes?
most of them are quite outdated, you should generally just use vanillaremade if you need a reference https://github.com/nh6574/VanillaRemade
no, there are some for adding or destroying/selling
What about moving them around?
nope
no
Much thanks
Found button code, will this work?
UIBox_button({
minw = 3.85,
button = "steamodded_github",
label = {localize('b_github_project')} })}```
iirc you need to hook Node:stop_drag
any help
Hit ctrl c and paste in a random textbox, that will allow you to read the crashlog
the guy in modding chat was wrong
modding chat is the right place
You mean modding dev?
Use SMODS.is_eternal
This is actually unbelieveable helpful this would have saved headaches yesterday thank you very much
I tried that, it doesnt work
Although that could work for Jokers
Would that also work for making it so that you can't rearrange cards held in hand?
no
Isnt there a Pinned sticker in Cryptid that prevents dragging?
Node:stop_drag is what happens when you well, stop dragging an object
No, that's from the base game.
you cant really make it not do that
its from vanilla but also that locks all the cards to be sorted based on sort order since thats how multiple pinned jokers are handled
the decision from cryptid is probably better to look at
since that prevents moving while still allowing free will
Arent pinned jokers impossible to obtain without playing a challenge run, right?
if (self.ability or {}).set == "Joker" then
but it is still from vanilla
Okay
You and @slim ferry, this is what I'm asking for: a junior version of Crimson Heart.
i see
i would just do that in update lol
perhaps entropy would have some code worth looking at since it has a blind which debuffs the leftmost joker(s)
or update works too
How do I retrigger jokers?
What does that entail, "update"?
i dont think blinds have an update function but you can hook Game:update, check if you are in your blind and then check for the rightmost joker and debuff it and undebuff all other jokers with the same source
Now that I have a clear head, thank you
I cannot get this thing to retrigger Jokers. I've been trying, but I cant seem to get it to work. I dont know what context I should put the repetition = true bit in.
you need to return repetitions = <amount>
ive been reading up on vanilla remade wiki
but i cant seem to figure out how to reduce the price of booster packs
What is set_ability() used for within a Boss Blind's code?
example?
Did I not? I can see that there is an repetitions = X in the return of both
-# ...did you enable Joker triggers optional feature?
Yes, I am making a mod that depends on Cryptid, which does enable retriggering Jokers
it doesn't matter if the mod you're depending on has the feature enabled, you must have it enabled in your mod too
Okay, so how can I do that? Is it in your moddata.json file?
Sorry, I meant within a Joker's code.
hey guys what did i fuck up lol
the card im tryna code
this is the wrong code screenshot
1 sec
this is the right one
ignore that first screenshot
i wanna work on some jokers that have to do with positioning.
first i want a joker that checks if any jokers have been moved (it will be a scaling joker that resets when any joker gets moved)
next i want a joker that is pinned to the position it gets bought in (can't use pinned as a reference because it's hardcoded in a file i can't find)
any ideas on where to start with these?
btw whats happening is the card doesnt trigger when the card is discarded
oooooooooooooooooohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
thatll do it
didnt fix it
lol
where can i find the full list for all the contexts ingame
contexts and variables and everything
Just for kicks, I set one of my custom Boss Blind's boss_colour to G.C.DARK_EDITION -- the swirling shade used by Edition text -- but when I selected the Blind in question, the color does not change from one of its initial states, #C78E8E. Why is this so?
Update: when I play/discard, it'll occasionally jump to purple from gold.
does anyone have a good resource on creating additional cardareas
how do i make a joker sticker calculate even when debuffed
on that topic why is my debug not working
why are you defining a whole second calculate function inside the return statement of the first calculate function
that's not how that works
because this is my first time coding with lua and i have next to no clue what im doing LOL
yea there's a lot weird going on here, and my recommendation is to throw this whole thing out and start fresh
but i'll help you!
bet
first, you want to use context.discard, not context.pre_discard. that way it'll calculate once on each individual discarded card, instead of having to manually dig through the discarded hand
also will make the timing consistent with jokers like mail-in rebate
or castle, yea
next, inside context.discard, you don't need whatever that if function() end == true then junk is
what you should do is check if context.other_card is an 8 of hearts, and if it is, you should increase the joker's variable where it has its current mult stored
use SMODS.scale_card for this
true (it's documented in the smods 0827 changelog)
it also changes behavior of existing jokers 
that was fixed actually
oh?
what does this do
i should know, i was part of that issue thread 
it allows you to opt into crossmod content that would change how fast cards can scale (e.g. someone else's joker that makes scaling jokers scale twice as fast would make yours gain +10 mult for every discarded 8 of hearts, but that only works if you use the scale_card function)
anyway, get started on what i wrote out and let me know when you're done. it won't be finished yet, we still need a second part to the calculate function, but i wanna get this working first
im confused wdym by crossmod content
like
other mods that add something that affects card scaling
using the scale_card function would mean that your joker is automatically compatible with anything like that
ohhh okay
only fixed for vanilla jokers
unless im misunderstanding something
calculate = function(self, card, context)
if context.cardarea == G.play and context.individual and not context.blueprint then
if context.other_card:is_suit("Clubs") then
return SMODS.scale_card(card,
{
ref_table = card.ability,
ref_value = "mult",
scalar_value = "gain",
message_colour = G.C.MULT,
message_key = "a_mult",
})
end
if context.other_card:is_suit("Hearts") and card.ability.mult ~= 0 then
return SMODS.scale_card(card,
{
ref_table = card.ability,
ref_value = "mult",
scalar_value = "loss",
operation = "-",
message_colour = G.C.RED,
message_key = "a_mult_minus",
})
end
elseif context.joker_main then
return { mult = card.ability.mult }
end
end
yea but like
it's not really fixable in the function itself
it differs from vanilla behavior because vanilla behavior keeps the message and the scaling separate, whereas scale_card bundles it all together at once
how would you rewrite this to work properly?
if i had to, i'd make the function return a table that can be returned in a calculate function. that would be where the message goes, instead of having a calculate_effect call in the scale_card function
but i don't think it's broken or bad as it is necessarily, it's just different
okay so i assume what youre saying with this entire thing is smth like this
nnnno
is_rank isn't a thing (yet), and you're using scale_card wrong
real quick can you show me the rest of the joker definition?
like how would you rewrite my code to work properly with SMODS.scale_card
also i highly recommend referencing vanillaremade if you aren't already. in particular, castle's effect is very similar to what you're trying to do
it doesn't use scale_card but tbh don't worry about scale_card rn, i think it just complicates things more than necessary for beginners
just the rest of this that i didnt alter from the base jokerforge code
alr
i meant everything in the brackets of the SMODS.Joker {...}
also while ur here can u help with this too
ah my bad
instead of message_colour and message_key, you should just have no_message = true, and then return the message manually
weird jank but ok
"how do i make it behave like vanilla"
how it behaves in vanilla
"weird jank but ok"
yea really do look at vanillaremade's castle, it'll help a lot i think
yea no worries
transitioning from jokerforge to lua is really rough in general because jokerforge-generated code tends to be really weird and not good for reference
fair
i just used it as a starting point and try to fix it up with what little i know about lua
i mean i got it to not crash upon opening the game by myself if thats anything LOL
I'm trying to make another suits-based mod. It's meant to be the 6 of Nones, but I think I did something wrong.
SMODS.Suit{ -- Temp
key = 'Nones',
card_key = 'NONES',
hidden = false,
lc_atlas = 'cmerge_cards',
hc_atlas = 'cmerge_cards',
lc_ui_atlas = 'cmerge_suits',
hc_ui_atlas = 'cmerge_suits',
pos = { x = 0, y = 0 },
ui_pos = { x = 0, y = 0 },
lc_colour = HEX('374649'),
hc_colour = HEX('374649'),
in_pool = function(self, args)
if args and args.initial_deck then
return true
end
end
}```
you haven't localized anything
i sent you a friend req btw if you didnt see it
okay im gonna go to bed now gn chat
Ohh
o/
Forgot about all of that
what is the card area for the discard pile?
G.discard i think
is like it possiable to make an undiscovered sprite have a custom display size
putting this display_size = { w = 65, h = 79 }, doesnt work in the SMODS.UndiscoveredSprite
those dimensions seem familiar
Even when I set odds to 1, this Boss Blind's code does not destroy cards after they are played, and I copied the code from the Vanilla Remade code for Glass Cards. What do I do?
calculate = function(self, blind, context)
if not blind.disabled then
if context.destroy_card and context.cardarea == G.play and context.destroy_card == card and SMODS.pseudorandom_probability(card, 'test', 1, card.ability.extra.odds) then
SMODS.destroy_cards(card)
end
end
end
Yes, card doesn't exist.
In the function() definition, would changing blind to card do the trick?
No.
What would?
And how would I make sure that it happens after all scoring is finished, like with Glass cards?
if context.destroy_card and context.cardarea == G.play and SMODS.pseudorandom_probability(blind, 'seed', 1, blind.effect.extra.odds) then
return {remove = true}
end
That worked!
still confused on this
like do i have to do something more for it to properly use the right text?
It only works for editions with card_limit in the config.
if i add a card_limit but dont use it will that work?
yes that works!
they really should have specified that better tho
How do I look for a unique Identifier of a card thats in G.jokers.cards
I needa check for a specific joker in a loop so that the loop ends
How do I apply random enhancements from a specific mod onto cards in a deck?
Thanks
if joker.config.center_key == "j_modprefix_key" then
thats not unique
thats gonna activate from the first joker of same joker
what if i have two
they should work seperately
i believe there's a unique identifier somewhere, yes
use debugplus to dig it up, i guess
break the loop if you find the first valid joker?
i did find a unique one
literally called something to the effect of unique id
thats boring
the description means to be to the left of itself
not that first one
from inspect()
where is it though
... there? in that table you are looking at?
And of course, crashes.
is inspect() not just abunch of variables
Replace card by v
need card in function if you call to it
yea that
Also pretty sure G.playing_cards is an ipairs loop
cards are tables
a
i thought it'd be inside somethign else
is the card in the function card or self
That worked, thanks
what's the effect supposed to be, why do you need to break the loop twice instead of just finding all the instances
not twice
if i have two of the same joker, they'll both stop at the first joker
i want them independent
is there a reason you need the unique value instead of just comparing the card directly, e.g. G.jokers.cards[i] == card?
then what's the problem with my method
true
you're checking for if the card is the same joker, not card
different things
i know
thats not what i want
G.jokers.cards is in the order theyre sorted in the joker slots, and they can't be reordered fast enough during calculation
so unless this effect takes place at two different timings it will always be the first in the order
(* unless some code does it)
wait so does this mean that this is how to player places them or how the game for some reason sorts them
former
this is why understanding the xy problem is important lol
huuh?
true i think
terrible name for it though
-# i agree
Wait til they bring up a Z solution to the Y solution 
the real xy problem is when you save in lumiose city and get softlocked
so true
How do you check in an enhancement when it gets added and removed from a card
on_apply = function(card)
print("apply")
end,
on_remove = function(card)
print("remove")
end
oh wait hang on maybe not that for editions
alr
lemme check if it works for enhancements one sec
ok uhh i was wrong no it doesnt my bad
is there like a better way of setting an edition's card limit change that i dont know about? rn im doing config = { card_limit = -1 } and it seems to be causing a whole lot of jank when applied to every playing card in the deck
yeah im trying another approach instead
It shouldn’t be jank on dev branch
im on 1.0.0~BETA-1016c, that should be the latest dev version right?
this is what happened when i was just playing hands with 12 hand size and a full deck of cards with -1 card_size from the big edition
drew a ghost card, then it disappeared and i drew a face down card that couldnt be selected, then two more ghost cards
should probably be noted the first hand of the round was entirely normal
No that’s the latest release, the latest dev version is 1031a
oh, so just download from code?
Though I do think it is better for this effect to use extra_slots_used = 1 so this effect
But yeah, download from main code for the current latest dev build (prone to being buggy though)
ok ive not yet run into the previous issues but after discarding ive somehow ended up with. 16 cards. in a hand size of 12. when i should be holding 6 because they all take 2 hand space.
ok no thats not quite accurate i wasnt reading the hand size text right
but when i discard i draw twice as many cards as i should
but only if im not already over the amount i should have
hmmm, will do some investigating
also strangely, im at 14 hand size from having 12 base and having a doubled juggler, and ive just entered the manacle and i still drew 7 cards when i shouldnt have had enough hand space to do that? the count says im at an effective 14/13 now
How would I juice a card until a hand is played?
have you looked at DNA's code
this will always be true
Should be fixed now on newest commit, (1031b), if you could verify your problems are gone that would be perfect
I changed it to hands =G+1, but it's not doing anything as well
that will always be false
you need to move the local out of the function
you went from checking G.GAME.current_round.hands_played == G.GAME.current_round.hands_played to checking G.GAME.current_round.hands_played == G.GAME.current_round.hands_played+1
effectively
Thanks for that
sorry for late response but yep its fixed
thanks for the quick patch 👍
how do you change the price of booster packs?
i tried reading up on alot of things but i just cannot seem to find the thing that changes the price of boosters
It's Card:set_cost
you told me that but i dont really get it
because how does that affect only boosters?
It doesn't, it affects all cards.
but i want it to only affect boosters
thats why i wanna know how to do that
if i made a voucher that reduced all card price, i would just be making clearance sale again