#💻・modding-dev
1 messages · Page 593 of 1
wouldnt just swapping the < for a <= do it
uhhhh lemme try actually
would still only select 1 hand
last tied one i think
wait hang on is it.
not doing it based off of the hand you play?
oh actually
this check feels weird why not just check whether the hand you're playing is valid for being levelled up
what you could do is
if theres a tie, check if the current hand is the played hand
and then ignore the hand if so
What the code is doing
loops through all the cards
selects the one that has the least uses
if the played hand is equal to that hand, level it up
if G.GAME.hands[context.scoring_name].played <= 1 then
return {func = function()
SMODS.smart_level_up_hand(card, context.scoring_name)
end}
end
local hands, played = {}, math.huge
for k, v in pairs(G.GAME.hands) do
if SMODS.is_poker_hand_visible(k) then
if v.played < played then
hands = {[k] = true}
played = v.played
elseif v.played == played then
hands[k] = true
played = v.played
end
end
end
if hands[context.scoring_name] then
return {func = function()
SMODS.smart_level_up_hand(card, context.scoring_name)
end}
end
```?
so it.. always stores what hand it will level up?
oh yeah I could use breaks actually?
no because
yes but only 1 at a time
what if there is another less played hand
you cant know until you check every single one
gonna try this
okay then simple, just don't store it and instead calculate it on an individual hand basis
when a hand is played, check if that hand specifically is the least played or tied for least played
or would that happen after it already adds to the played count and get fucky
hey guys why does this white box go outside of the borders even after i set its maxw to like 2
this is the part of code for it
and the red thing is not even visible
its calling out this line specifically
Change key to k
Yes.
No, it checks for all ties.
I think I fixed it.
lemme see
are all of these the available tables for context.other_ret in context.post_trigger? since you need to use context.other_ret.jokers to get the joker return there normally (also what do all of them even contain)
Yes, context.other_ret contains the return of eval_card
They contain their specified objects calculation except playing_card, end_of_round and retriggers
can you make an enchanced card count as a specific rank?
as well as their original rank? not yet
instead of their original rank? you can hook get_id but it's going to have some spotty mod compat
can anyone help maybe?
you can hook Card:get_id and make it return 11 if they have an enhancement
what I mean is like
The enhancement itself COUNTS as a jack
that specific enhancement
the outer one says 2 but the inside one says 3
ok same thing but check for that enhancement
for reference im trying to make these count as jacks, queens and kings respectively
ill get to learning hooks in a moment then
So the card with the enhancement counts as a jack and something else?
how do i prevent this from being debuffed on the collection screen
if not card.area.config.collection
table.contains seems to not exist because my game crashed instantly
upon trying to view it in the collection
Yeah, 'tis not a out-of-the-box function here.
welp time to make a utility for it
im trying to make a joker that removes all stickers from other jokers, but it isn't working calculate = function(self, card, context) local jokers = G.jokers.cards for i, joker in ipairs(jokers) do self:apply(joker, false) end end
i also honestly considered adding my clamp and sign functions to lua's math library but i feel like that could result in mod conflicts or something
When do you want to do it?
ig every time you get a new joker
if context.card_added and context.card.ability.set == 'Joker' then
for k, v in pairs(SMODS.Stickers) do
v:apply(context.card)
for kk, vv in pairs(G.jokers.cards) do
v:apply(vv)
end
end
end
can anyone please help me with this, i wanna extend the top part to be a little more to the right
as drawn
im messing around with shop ui and i cant get it to work
i mean it works, but if you buy a joker with a sticker it doesn't get removed imedietly, only if you buy another joker
question
how would i make a joker that adds a incredibly large number to a stat (+1e300 hand size) without having to write out that large number
ive tried having 2 values, a number and a power, and then doing this but it doesnt work
1e300
tbh i'd probably use a lower number
1e100 is already far greater than the number of atoms in the observable universe
also a big size is going to look really bad with a small quantity of cards
It's 1e300 not 1e+300
is the purpose of this to set the hand size to a really big number or just to have the hand size big enough to draw all cards to hand
the latter
because unless you have a specific reason theres no reason not to just set the hand size to the number of cards in deck
and then dynamically update it
wait
oh the deck size can change 😭
but yeah theres got to be a better way to do it than just setting the number to 1e300 or something
i have changed it to 1e100
nothing has changed
just use a draw function
instead of making a fuckton of hand size
because precision will make your hand size go to 0 after you sell the joker like this
still gets debuffed
apply = function(self, card, val)
card.ability[self.key] = val
if card.ability[self.key] then
card.ability.lem_preorder_tally = G.GAME.lem_preorder_rounds
card.ability.lem_preorder_rounds = G.GAME.lem_preorder_rounds
-- don't debuff this in the collection
if not Lemniscate.table_contains(G.your_collection, card.area) then
SMODS.debuff_card(card, true, self.key)
end
end
end,
what is said draw function
im not good at this
if context.first_hand_drawn then
SMODS.draw_cards(#G.deck.cards)
end
@broken rivet
(card.config.center_key == "c_base" and not card.children.front) checks if a card is an unenhanced "fake card", i.e. the card used to display stickers/etc in the collection. i have a sticker that also needed to not do something in the collection, so i just made it only do the thing if that condition was false
aren't there also mods that can allow you to have c_base as a card
someone pls im losing my mind
okay so the joker is not the problem
i've never run across any situation where you could have a c_base card in-game that also doesn't have a front (i.e. the suit + rank)
or well a blank one
if not G.SETTINGS.paused
i'm guessing something like entropy's blank cards still technically have a front
you mean the nil rank/suit?
yea
yea that's still a front
if there's no front then the card doesn't display anything on top of the base (e.g. stone cards, but enhancements aren't c_base anymore)
ye
this worked, ty
should SMODS.scale_card be used on effects to playing cards? like, for a joker that gives playing cards perma mult or something
just in terms of practice
No.
alright, i figured you could use it in those cases but wasn't sure if that would be "correct"
do stakes not have loc_vars?
was gonna use a key return to make a toggleable blue stake rework
you could make it togglable, it would just require a restart
just take ownership of it based on a certain config value
yea
just sucks that it needs that
Does anyone know how to swap the card designs?
I'm designing a whole new deck for context
loc_vars = function(self, info_queue, card)
local reverse_fool_c = G.GAME.tboj_last_tarot and G.P_CENTERS[G.GAME.tboj_last_tarot] or nil
local reversal = nil
local last_tarot = reverse_fool_c and localize { type = 'name_text', key = reverse_fool_c.key, set = reverse_fool_c.set } or
localize('k_none')
local colour = (not reverse_fool_c or reverse_fool_c.name == 'The Fool' or reverse_fool_c.name == 'The Fool?') and G.C.RED or G.C.GREEN
--more code here
local main_end = {
{
n = G.UIT.C,
config = { align = "bm", padding = 0.02 },
nodes = {
{
n = G.UIT.C,
config = { align = "m", colour = colour, r = 0.05, padding = 0.05 },
nodes = {
{ n = G.UIT.T, config = { text = ' ' .. last_tarot .. ' ', colour = G.C.UI.TEXT_LIGHT, scale = 0.3, shadow = true } },
}
}
}
}
}
return { vars = { reversal }, main_end = main_end }
end,```
This mostly works, but for some reason the last used tarot color is incorrectly green instead of red when the last used tarot is 'The Fool?'
you should probably be checking reverse_fool_c.key, name is just a field that vanilla uses and wont exist unless you define it seperately (its not the same as the name from localization basically)
does anyone have good examples of jokers with an use button
I wanna make a hook for it but I have no good examples
Didnt you find a reference before? That one is a good way to do it
yeah but it crashed the game for me
Whats the error? I can try to help as it worked for me
completely unrelated error in line 777 of the entropy file
like not even IN my mod
just having it in my mod was causing a crash by entropy
What line of code did you take from the mod
Where can I get the full deck?
how would you check if a card is scored inside of full_hand
<@&1133519078540185692>
is anything stopping you from just looping over scoring_hand instead
nothing other than not wanting to do that if there is a simpler way, and that i need to account for the unscored cards as well
G.playing_cards
That works in SMODS.Back too I suppose?
eh i figured out a better way to do it
by just subtracting full hand by scored cards and manually adjusting by the debuffed cards
cus debuffed cards dont count as scored cards normally, right?
These are the parts you need
First, your Joker with its id (prefix included)
Second, a hook for G.UIDEF.use_and_sell_buttons(card)
And then the two functions (G.FUNCS.use= function(e) and G.FUNCS.can_use = function(e))
Can you send your code?
oh alr, you'll get it later 💪🏽
i might just wait until like
the SMODS button function is ready
next release for sure
it's in the works?
yeah its almost done apparently
one of the main things rn is adding controller binds to the buttons
that's pretty neat
not sure
hello, is there any reason why this shouldn't be working? in game the joker don't animate for whatever reason
joker animations are currently not supported, either wait for next smods release or use the system that was made for cryptid
oh i see
cryptlib could have it right
it might
where's the documentation for it anyway
how can i make joker change its description to highlight certain words mid-run?
e.g. {C:inactive}Spades changing to {C:spades}Spades{C:inactive} if something happens
doing it through displaying variables doesn't seem to work
you could instead use the colours field in your loc_vars return and return a custom colour depending on whether it's active or not
np! :)
if Lemniscate.config.blue_stake_rework then
SMODS.Stake:take_ownership("stake_blue", {
modifiers = function()
G.GAME.modifiers.enable_lem_preorder = true
end
})
end
this is causing the stake to be displayed as green stake instead of blue stake in the continue run tab (though it is still blue stake when i actually do continue it)
having some issues trying to do custom boosters
key = 'testbooster_dark',
group_key = "k_dark_testbooster_group",
atlas = 'Boosters',
pos = { x = 0, y = 0 },
discovered = true,
loc_txt= {
name = '{C:red}TEST{} Booster pack',
text = {"Pick {C:attention}1{} card out of",
"{C:attention}3{} {C:red}TEST{} jokers!", },
group_name = {"Lorem Ipsum"},
},
draw_hand = false,
config = {
extra = 3,
choose = 1,
},
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.choose, card.ability.extra } }
end,
weight = 1,
cost = 7,
kind = "DarkHazardPack",
create_card = function(self, card, i)
ease_background_colour(HEX("ffac00"))
SMODS.create_card({
set = "jokersTest",
area = G.pack_cards,
skip_materialize = true,
soulable = true,
})
end,
select_card = 'jokers',
in_pool = function() return true end
}```
ease_background_colour should not be in the create_card function, and you should not use SMODS.create_card either
just return the table of arguments and it gets passed into SMODS.add_card
alr
will report
if anything happens
welp
might not be related but select_card should either be G.jokers or just not there
also the in_pool function does nothing
tried both
same error
how would i add a shader to a deck back? tried doing my usual draw step and it doesn't work. is it even possible?
hm, might be something im overlooking then
found the issue
oh
my create_card function
is just messed up
I SERIOUSLY need to lock the fuck in 💔
thanks for the help though
I appreciate!
btw for future reference if you press ctrl + c on the crash screen it copies the entire crash log to your clipboard so you can paste it
makes it a lot easier to diagnose issues
oh alr
ty
noted!
the back isnt spawned as a card, you should just draw it on all cards with card.facing == "back" and then check the card's back sprite
i forget how to access the back sprite of a card but i hope thats enough
hold up
it wasnt the function
I mean
it was but
only one line
tried with set = "Playing Card"
worked
but not with mine
hm
set = "Playing Card" should work
are you sure youre like. actually returning the table
it is
so like
im trying to do a custom pool
for a custom booster
giving well
custom jokers
what is the key in the ObjectType definition
I do precise the pool though
did you actually create that pool with an SMODS.ObjectType
ObjectType?
ohhh
im stupid as shit
gimme a sec
yeah the pool wont exist just by adding it to jokers
got it working but uh
eyikes!
it would be cool if an objecttype was created automatically
maybe thats a thing for the tags pr
code
SMODS.DrawStep {
key = 'chak_decks',
order = 10,
func = function(self)
if G.GAME.selected_back.effect.center.key == 'b_chak_draft' then
self.children.center:draw_shader('booster', nil, self.ARGS.send_to_shader)
end
end,
conditions = { vortex = false, facing = 'back' },
}
taglist...
oh that's funky
yeah thats just an issue with drawing shaders on backs iirc
so the name should be "JokersTest" if I'm correct
just making sure
yeah
alr
just make sure you use the same capitalization everywhere
since i saw different capitlization in some of your screenshots
oh prob
I made sure
should be good
worked 😎
ty!
whats the base joker doing in there
anyways
it works so
not gonna complain
will look into it later
default card
because the pool ran out of cards to spawn
u can set a custom default card on ur booster
you can configure the default card for a pool
^
if needed
or if u dont want free copies of a card just leave it as jimbo
i may have just come up with the most hacky solution ever and just took a screenshot of the deck with the booster shader and applied it as a multiply layer in aseprite
but hey
but why 😭 what was wrong with the previous solution
it works!
shader was not centered and you could see jokers through their back
(this is a deck btw not a booster)
yea i can tell lol
for the first one u could just make sure it draws the shader in order of the deck's sorting
no it's a different issue
but yhea idk why it does that on the other one
playing cards rotate depending on their position on the screen, deck backs don't
so the booster shader is rotating as if it was a playing card when it's not
you can tell more easily when you mouse over it and the shader tilts while the card back itself doesn't
i think you can set that in send_to_shader
maybe try looking at how cryptid does the shader for antimatter deck
thats the only mod i can think of with deck shaders
i could take a peek
a quick look perhaps
lets take a look...
Can I make a joker that makes all other jokers think an enhancement is a specific rank, with a return statement maybe?
not until the quantum ranks PR is merged
(i mean technically probably you can do it now, but it'll be difficult and involve hooking/patching shit)
quantum ranks 😨
i mean you could also hook Card:get_id() if its replacing the base rank entirely
like cryptid abstract cards
true
my sticker isn't even appearing in the shop 😭
I do have cryptlib as a dependency
maybe I can use that
so
if Lemniscate.config.blue_stake_rework then
SMODS.Stake:take_ownership("stake_blue", {
modifiers = function()
G.GAME.modifiers.enable_lem_preorder = true
end
})
end
literally all the stake is doing
idk why this doesn't work
a bunch of bs is how
show sticker code
or why the game seems to think blue stake is also green stake
like can u not just change it to self.children.back
tho
no clue about the green stake popping up but i might be able to help otherwise
is what im wonderin
i'll try
local preorder = {
object_type = "Sticker",
key = "preorder",
atlas = "stickers",
pos = { x = 0, y = 0 },
badge_color = HEX("e87169"),
default_compat = true,
rate = 0.3,
init = function()
local gsr = Game.start_run
function Game:start_run(...)
gsr(self, ...)
G.GAME.lem_preorder_rounds = 2
end
end,
loc_vars = function(self, info_queue, card)
local r = G.GAME.lem_preorder_rounds or 2
return {
vars = {
card.ability.lem_preorder_rounds or r,
card.ability.lem_preorder_tally or r,
}
}
end,
calculate = function(self, card, context)
if context.end_of_round and not context.repetition and not context.individual then
-- countdown
card.ability.lem_preorder_tally = card.ability.lem_preorder_tally - 1
-- remove sticker
if card.ability.lem_preorder_tally <= 0 then
SMODS.debuff_card(card, false, self.key)
card.ability[self.key] = nil
card.ability.lem_preorder_tally = nil
card.ability.lem_preorder_rounds = nil
end
end
end,
should_apply = function(self, card, center, area, bypass_roll)
return G.GAME.modifiers.enable_lem_preorder and card.config.center.lem_preorder_compat
end,
apply = function(self, card, val)
card.ability[self.key] = val
if card.ability[self.key] then
card.ability.lem_preorder_tally = G.GAME.lem_preorder_rounds
card.ability.lem_preorder_rounds = G.GAME.lem_preorder_rounds
-- don't debuff this in the collection
if not (card.config.center_key == "c_base" and not card.children.front) then
SMODS.debuff_card(card, true, self.key)
end
end
end,
--[[lem_credits = {
art = { "InvalidOS" },
code = { "InvalidOS" },
idea = { "InvalidOS" },
},]]
}
also shows a completely white "ERROR" badge in-game but i suspect that's because of my mod's credit badge code
okay okay so the shader now takes the shape of the back i just have to disable the rotation
this probably
if you remove the and card.config.center.lem_preorder_compat part in should_apply, does it apply it to every card in the shop?
...oh
replace self.ARGS.send_to_shader with {0, self.ARGS.send_to_shader[2]} maybe
somehow i thought smods would set that
(card.config.center.lem_preorder_compat or false) ? or should every card be compatible with it by default
o7
actually wait hold on you have default_compat = true in the sticker already :clueless:
looks great
yeah 😭
i can read
still try taking the compat check out? it might be that you just have the wrong name for it, idk
ok hm
no yeah that worked
it appeared on everything
if you disable tilt for the shader, it'll look good on the deck view, but face down cards look pants
if you enable tilt for the shader, it'll look pants on the deck view, but face down cards look good
youll have to change the shaders first arg to focus on the rotation of the back rather than the center
i'm guessing i should check for if the compat value is false
here's the current code
SMODS.DrawStep {
key = 'chak_decks',
order = 10,
func = function(self)
if G.GAME.selected_back.effect.center.key == 'b_chak_draft' then
self.children.back:draw_shader('booster', nil, self.ARGS.send_to_shader, true, nil, nil, nil, nil, nil, nil, false)
end
end,
conditions = { vortex = false, facing = 'back' },
}
and also roll the appearance rate myself
check if it exists and is true, or if it doesn't exist at all
and then yea you'll have to roll the appearance rate
From last night but have another question ngl bc I’m not knowledgeable in this part lol
you need to enable the
retrigger_jokeroptional feature and then usecontext.retrigger_joker_check(and don't use the cardarea or main_scoring checks)
Where do I paste the retrigger thing in? Anywhere in the doc? The joker? A seperate config file?
anywhere that gets loaded
Aight
putting it in main.lua should be fine
-- Enable optional features
SMODS.current_mod.optional_features = {
retrigger_joker = true
}
local send_to_shader = { math.min(self.children.back.VT.r*3, 1) + G.TIMERS.REAL/(28) + (self.juice and self.juice.r*20 or 0) + self.tilt_var.amt, self.ARGS.send_to_shader[2]
}
might work?
just put that at the top of main
Aight
and then use that table in the draw shader
context.beat_boss is a thing right?
keep in mind i am no expert and i am jus lookin thru source to try to solve this thing
this should be right
do you need context.end_of_round if there's context.beat_boss ?
not really but it's good practice because it might be used for another context later
I use it, it exists, and it’s probably recommended as I do use so
fair nuff was just wondering
where would i put this? cuz i put it in the draw step func and it seemingly had no effect
you have to change self.ARGS.send_to_shader in your draw_shader call to just send_to_shader after putting the table before it
got it working
so that stopped the shine from going crazy when you hover over the deck, but the cards still don't flip well
thats awesome actually
nice
🔥 awesome
we love to see new stickers
i might add an infoqueue that shows the joker info
upd
@gilded bramble what if we made a patch for this sticker
starspace has "patches" that are like inverse positive versions of stickers
that
wtf that's so cool
positive
positive versions of stickers
it's not???
how would u invert it
it debuffs the card
that's why i pinged astro so we could brainstorm
temporarily
exactly
it's part of a blue stake rework
just because it's less worse than perishable doesn't mean it's outright good
yea but im saying how would u do an inverse of it
yea that's what we're trying to figure out rn
i thought it was a cool sticker and i wanna crossmod but i don't have an exact idea yet
pre order bonuses
anyway the shader is still not changing, i think maybe the other args in draw_shader may be overriding it?
SMODS.DrawStep {
key = 'chak_decks',
order = 10,
func = function(self)
if G.GAME.selected_back.effect.center.key == 'b_chak_draft' then
local send_to_shader = { math.min(self.children.back.VT.r*3, 1) + G.TIMERS.REAL/(28) + (self.juice and self.juice.r*20 or 0) + self.tilt_var.amt, self.ARGS.send_to_shader[2]}
self.children.back:draw_shader('booster', nil, send_to_shader, true, nil, nil, nil, nil, nil, nil, false)
end
end,
conditions = { vortex = false, facing = 'back' },
}
dawg what is this
a deck
upgrades its edition for the first two rounds maybe
yeah i see
Crap sorry i completely crashed and fell asleep sorry to anyone who wanted to help me yesterday
its okay kennit the tart
so having "true, nil, nil, nil, nil, nil, nil, false" makes it look good in the deck space, but makes flipped cards look pants
removing "true, nil, nil, nil, nil, nil, nil, false" makes it look pants in the deck space, but makes flipped cards look good
pants?
my mod is currently unreleased but knowing people will make crossmod is awesome
it might also possibly end up in cryptid though
bad
just say bad
i know something like it was in the csd
counter-strike discord...
cryptid suggestions doc
i see
either way it'll be cool
that's even worse
true
plant the bomb at site c(ryptid)
many horrors in there
If i can ask does anyone know if the tailsman mod is broken/outdated because it keeps crashing my game and this is the error i keep getting
https://docs.google.com/document/d/11O707NiaCQlxjFuYxxMzyWGyAJ-58_YO1671A3gPwEw/edit?usp=sharing
either way i'll just take ownership of the cryptid one and make it Not Exist because mine is objectively more awesome on account of not being cryptid
based
not the google doc for your crash you can send it as a txt file on discord
uh make sure you updated tailsman
honestly i think i'll just change the shader based on the cardarea
Whats the current version?
2.5
fair enoughj
just paste the crash log man, people need access to google docs
https://github.com/SpectralPack/Talisman/releases/tag/v2.5 according to its github
Alright will try that version brb (for context im on Android for discord junk)
i mean if you are comfortable you can create a github or gitlab account and link your mod repo
its a good way to version control
how do you make a joker change its own edition?
card:set_edition(<key>)
how would i get a card's cardarea while only having it's self to reference
Card.area
hrm
Alright so just looked and i am using the recent version of the mod (also idk how to txt the crash log here since im not really using discord for this junk lol)
btw that worked thank you
but also what's the card area for this area called?
is it deck?
G.deck
It is the recent version any other suggestions? (And yes i checked)
shader's working very nicely
this is why i don't use cryptid as a reference cuz it's so ancient 😭
if i had done the cryptid method instead of a simple drawstep i wouldve killed myself
the only problem is that in the main menu it has no shader, but in a run all the decks have the shader
though this may just be a galdur problem
it's not just a galdur problem
i think the issue is that it's checking for the current game selected back instead of each card's selected back, so it's applying it to every deck if you're playing the selected back
trying to do smth and its not quite workin
should be lowercase card
lemme try
Alright i think this is the best i can do for the crash log sorry if its not perfect but best i can do atm
And its the current version so im just stuck and confused
post an issue to the github then
it says 2.3 in the log and the link earlier says 2.5
And yet when i try to download the mod my computer says i already have the file downloaded by the extra (1) in the name
the file is always named Talisman.zip
anyone know the name of the cardarea for this deck in New Run
Should i do like a photo step by step just to make sure im doing everything right?
i dont think that's necessary, just delete the old folder and unzip the new one in
Fine brb
Ok so downloaded and unzipped everything and put in the mods folder and gonna give a test game (proof to see I've downloaded the right version sorry if its crap Android camera)
why can't you use discord on your computer again?
My computer is a laptop/lemon it can barely run 2gb games lol (its old)
Well nvm it seems like the mod is finally working i am gonna test it using other mods like cryptid/pokermon just to be safe (this is very tiresome why do people mod <:3
And now lovey is having a fit great apparently its going though a syntax error with a card or something (maybe a file got damaged in the log/dump) update im stupid because it might be trying to load cryptid pokermon and undertale/deltarune mod all at once
Hello, anyone know why I get this error when I try to call SMODS.create_card?
local _card = max_played_card
if (max_played_card.ability and max_played_card.ability.set == "Enhanced") then
_card = SMODS.create_card { set = max_played_card.ability.set, enhancement = max_played_card.ability.name, seal = "Red", edition = 'e_polychrome', rank = max_played_card.base.value, suit = max_played_card.base.suit, area = G.discard }
else
_card = SMODS.create_card { set = "Basic", seal = "Red", edition = 'e_polychrome', rank = max_played_card.base.value, suit = max_played_card.base.suit, area = G.discard }
end
it should be Base not Basic
in the first one I would also recommend using Base to not accidentally apply an enhancement twice
thank you
oh and the enhancement should be max_played_card.config.center.key
Why does this say table index is nil? When I iterate through the vouchers and print their keys, this is literally the key that is used there:
G.GAME.banned_keys[v_tarot_merchant] = true
the string should be in quotes
Ahhh makes sense, thank you!
Weirdly the voucher is still not getting banned, I tried it with both G.GAME.banned_keys['v_tarot_merchant'] = true and G.GAME.banned_keys["v_tarot_merchant"] = true, but the vouchers I try to ban this way just don't get banned
They're inside the apply function of an SMODS.Back by the way, setting joker rates and other stuff works, just not the voucher bans
I iterated through the voucher pool and banned keys that way, it's still not working
I'm assuming banned_keys doesn't apply to vouchers then? Is there a banned vouchers list? banned_vouchers didn't work
yeah looking at the code i don't think vouchers check for that but i might be wrong
it should because it works for challenges so idk
Quick question, is there a way to have a message trigger and originate from a joker adjacent to the trigger joker (I.E. is there a card = card variant that would make a different joker have the message)
message_card
So when written its "card = message_card"?
No, it's message_card = adifferentcard
Ah gotcha thanks
what function is used to spawn vouchers in the shop (not picking them but actually making them appear)
i believe its just in the generic "setup shop" code
you can look at how ortalab does its chalupa pack tag tho?
if you wanted to clear/interact with it i think its also a cardarea
SMODS.add_voucher_to_shop
If I’m trying to make a joker spawn in one specific joker after a number of rounds, what would be the code for spawning in the joker?
SMODS.add_card{key = "the key of the joker you want to spawn, including object and mod prefix"}
so for oops all sixes itd be j_oops
for example
Gotcha thanks
is context.post_trigger not a thing in blind calculate?
is post_trigger on?
god damn it
i had turned it on earlier but removed it after i thought i didn't need it 😭
How do I determine if a single Joker does or does not have an Edition? I looked in the code and saw that Wheel of Fortune uses SMODS.Edition:get_edition_cards(G.jokers, true) to specify, but would get_edition_cards() be able to specify only one Joker if a single card was passed as the first argument?
You can just check card.edition. Itll be nil if it has no edition
So, would card.edition(G.jokers.cards[1]) work? I don't know the proper syntax for these things.
no
generally when someone says to check card.[something], the "card" is a placeholder for whatever card object you're trying to use
so in your case, G.jokers.cards[1].edition would check if the leftmost joker has an edition (and if it does, it would also specify what that edition is)
That helped. Thanks, Meta.
Hey all, starting to tinker with the idea of modding the game. I don't wanna ask questions that have been said to death here, but I'm wondering if there's any documentation available RE the audio engine of LOVE2D / Balatro? I'm a PhD audio tech student and that's my primary area of tinkering
tbh I just need a productive hobby and a dumb mod sounds up my street
like a stupid idea I'd want to look into: the mult of each score plays a sinwave at that frequency. If I can do something like that within Lua I can pretty much do everything I wanna
I dont think balatro does any modifications to love2d audio system so i'd say a search engine is your friend here
not google though use like. firefox or something
I mean fastest way to have a correct answer is by guessing and someone correcting me but I think if you access the games files through the browse local files in steam you can open up and within the resources folder find sounds and change the sound files by making a new one and replacing the old one by renaming your new file to the same name
This is a hypothetical, I haven't yet done something like that
https://www.love2d.org/wiki/Tutorial:Audio Here is some rundown on using audio in Love2d; it's an audio file playback system with options to manipulate playback
Also what does error: attempt to index local 'center' [a nil value] mean?
Oh dope, that seems straight forward enough if there's nothing additional!
tried to index center when its nil obviously
Yeah that is one method. Something I know is possible is adjusting the playback speed (like during the gameover stuff). Ideally I'd want to add a soft-synth that can be triggered via LOVE2D which I can easily whip up in C++/whatever. Unsure how that is done in Lua though
of course, you of in the out hot of which you in the cold food to out eat the in out hot of the food from the in out oven
tah!!
trying to access the local variable center as if it's a table when it's nil
not really much simpler it gets
ahah if i'm reading this right, balatro could play soundfonts
how do i hook Game:update_shop(dt)
anyone know how to make get_enhancements less laggy? i got a stack overflow from a joker whose effect is literally just this:
calculate = function(self, card, context)
if context.check_enhancement and context.other_card.base.suit == "Diamonds" then
return {
m_gold = true
}
end
end
(though to be fair my entire deck was steel diamonds)
should be
local update_shop_ref = Game.update_shop
function Game:update_shop(dt)
local ret = update_shop_ref(dt)
-- whatever code you want
return ret
end
would this work as a hook for the box from cryptid to add another rarity that it debuffs?
-- make the box debuff plentiful jokers too
local og_box_debuff = SMODS.Blind.cry_box.recalc_debuff
og_box_debuff = function(self, card, from_blind)
if og_box_debuff and og_box_debuff(self, card, from_blind) then
return true
end
return card.config.center.rarity == "crp_plentiful"
end
sorry if i sound weird it's late lol
probably want to set the function directly rather than using the variable just for clarity but i think it'd be fine
uh nevermind i guess?
i think youre returning debuff_card = true not just true
same as standard blind stuff
probably SMODS.Blinds
oh yeah true
Yes, you could do the quantum enhancements yourself.
main thing is i want them to be compatible with anything that would interact with gold cards
like golden ticket, etc
without manually making those clauses
thats the consequence of quantum enhancements unfortunately
nope!
you also forgot bl_
okay yeah that makes more sense 😭
Yes, if you did it yourself it would have less lag and it would do that.
sounds like i gotta learn how to recreate quantum enhancements now..
it doesn't crash but also doesn't debuff plentiful rarities what else am i missing
-- make the box debuff plentiful jokers too
local og_box_debuff = SMODS.Blinds.bl_cry_box.recalc_debuff
og_box_debuff = function(self, card, from_blind)
if og_box_debuff and og_box_debuff(self, card, from_blind) then
return true
end
return card.config.center.rarity == "crp_plentiful"
end
https://github.com/Somethingcom515/SealsOnJokers/blob/main/bigfuncs.lua#L2507-L2534, https://github.com/Somethingcom515/SealsOnJokers/blob/main/bigfuncs.lua#L2656-L2728, https://github.com/Somethingcom515/SealsOnJokers/blob/main/bigfuncs.lua#L2656-L2728
try using the recalc_debuff itself instead of setting the variable
i got a syntax error when doing that earlier
thank you mr seals on every 
you did put it in brackets right
no i'll do that
forgot lol
is autocomplete correct here
or should it just be the first
yeah seems good
mmm still doesn't seem to affect them
-- make the box debuff plentiful jokers too
local og_box_debuff = SMODS.Blinds.bl_cry_box.recalc_debuff
og_box_debuff = function(self, card, from_blind)
if og_box_debuff and og_box_debuff(self, card, from_blind) then
return {
debuff_card = true
}
end
return {
debuff_card = card.config.center.rarity == "crp_plentiful"
}
end
You should be using take_ownership
No, you can use both.
also you are starting a new run every time right
yes
oh wait
You're defining the old function instead of the actual function.
is that not the same
me when this is what i said earlier
no
i see i see
i thought you just meant for like clarification lol
oh
-- make the box debuff plentiful jokers too
local og_box_debuff = SMODS.Blinds.bl_cry_box.recalc_debuff
SMODS.Blinds.bl_cry_box.recalc_debuff = function(self, card, from_blind)
if og_box_debuff and og_box_debuff(self, card, from_blind) then
return {
debuff_card = true
}
end
return {
debuff_card = card.config.center.rarity == "crp_plentiful"
}
end
i think you might have been silly paradox
wdym
i assume it doesnt need a table it just needs a bool and its seeing the table and goes "welp. tables are truthy. go ahead. be debuffed"
"tables are truthy" yes i see your vision
why return debuff_card in a standard blind definition then
guys it's fine i gotta learn this one day
if you need proof simply if {} then print("tables are true...") end in your debugplus console,,
sin
have i been lied to
In response to this SMODS.add_card{key = "the key of the joker you want to spawn, including object and mod prefix"} what are the object and prefixes because I believe the issue I'm having is that I'm not setting them
j_modprefix_key
So how would I set that? currently its nil
Set what?
You set the mod prefix in your metadata.
You don't set the class prefix.
So it would be like SMODS.add_card{key= "jokername", "modname"}?
I feel foolish
No, it's j_yourmodprefix_key
why exactly does this crash? the given line is
self.ability.invis_rounds = self.ability.invis_rounds + 1
sorry if this is like unreadable it's pretty big 😭
self is the center, card is the card.
so it should be card instead of self
Yes.
okay easy fix
im trying to make a joker that increases its mult value each round and if a card is destroyed (in any way) the molt resets to 0, any ideas how to fix? (destroying cards doesnt seem to trigger the effect i want, but it does scale at least)
--Code
config = { extra = { Xmult = 1, Xmult_mod = 0.25 } },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.Xmult_mod, card.ability.extra.Xmult } }
end,
calculate = function(self, card, context)
if context.setting_blind then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.Xmult_mod
return {
message = localize { type = 'variable', key = 'a_xmult', vars = { card.ability.extra.Xmult } }
}
-- i think the above says what the mult is when the blind starts
end
if context.joker_main then
return {
Xmult = card.ability.extra.Xmult
}
end
if context.removed_card then
card.ability.extra.Xmult = 1
message = localize { type = 'variable', key = 'a_xmult', vars = { card.ability.extra.Xmult } }
end
end```
whoops, i shoulda condensed that but idk how
Yes, because it's (context.joker_type_destroyed or context.remove_playing_cards)
```lua
-- Code
```
ohhh thank you
how do you disable a joker from appearing naturally?
how do you find the center of a joker or is that just the key?
in_pool = function() return false end
G.P_CENTERS.j_modprefix_key
I have a bit of a problem with fusing my jokers. Nothing happens even if both needed jokers are present. Someone sees what could be the problem here?
What's the context for opening shop?
it should be card.config.center.key, not card.ability.name
if next(SMODS.find_card('j_modprefix_key1')) and next(SMODS.find_card('j_modprefix_key2')) then
local jokers = {SMODS.find_card('j_modprefix_key1')[1], SMODS.find_card('j_modprefix_key2')[1]}
SMODS.destroy_cards(jokers)
SMODS.add_card({key = 'j_modprefix_key3'})
end
oh that's 100 times easier
Is there a context for rerolling that applies before reroll?
So if I ban planet cards when I reroll, then I can't reroll into them? Now with context.reroll_shop the first reroll can still reroll into planet
Hook G.FUNCS.reroll_shop
hmmm today I will use quantum enhancements
Is there a way to make it so jokers are triggered by cards that don't score?
if context.cardarea == 'unscored'
ive seen a few mods do things for unscored cards
thanks
how would I use get_id() in a hook to tell an enchancement to be considered a specific rank ?
local oldcardgetid = Card.get_id
function Card:get_id()
if SMODS.has_enhancement(self, 'm_modprefix_key') then
return id
end
return oldcardgetid(self)
end
I replace id with the rank, right?
No, you replace it with the ranks id
So if its a jack, would it be 11 (the order), J (the card's key) or Jack (the key)?
No, 11 is the id
got it
I know quantum enhancements are wonky, so would this cause a loop?
context.other_card.config.center.key == 'm_gold'
can create_card / add_card add only a specific joker?
SMODS.add_card({key = 'j_modprefix_key'})
thankuu
if i wanted to change the vanilla jokers description, is it loc_txt or an actual localization?
Is it SMODS that adds the from_quantum parameter to card objects?
Yes.
You would redefine the localization.
how would i do that
j_key = {
name = 'New Name',
text = {
'New Description'
}
}
``` In `Localization > descriptions > Joker`
thanks
local hand = G.GAME.current_round.current_hand
local planet = nil
for _, v in pairs(G.P_CENTER_POOLS.Planet) do
if v.config.hand_type == hand then
planet = v.key
end
end
return{
SMODS.add_card
{
key = planet,
set = "Planet",
edition = "e_negative"
}
}
why is this not working?
return {
func = function()
SMODS.add_card{ key = planet, set = "Planet", edition = "e_negative" }
end
}
how do you SET the mult to something? I know return mult increases it but I'm not sure how to set it directly
it still creates a random planet not the current hand planet
mod_mult(amount)
like this?
yeah you dont need do end end around return
Figured it out
its one of the quick fixes it gives me
Was more speaking about mod_mult & mod_chips functionality.
otherwise its giving me an error
I think its because you place an if directly after the return
do I have to place it before that?
got it
technicly you could place the if in the func
like
return {
func = function()
mod_mult() = xxx
if xxx = xxx then
xxxxxxxx
end
end
}
What is the c_base equivalent for _card:get_seal()
if _card.seal ~= nil then
or
if _card.get_seal() ~= nil then
hey
how do move cards from the discard pile to the top of the draw pile
and would it be safe to do so in a discard context
does anybody have a copy of the vanilla negative shader? I want to poke around and figure out once and for all what the heck is going on with the color math there (I dont have access to my game files rn)
Sounds like hooking antics and changing the target of draw to the deck... as well as having the discarded cards "marked" and them reshuffled and remove the mark.
great,
is there a function that changes the background color as well as the color dyn_ui.boss_main
?
ease_background_colour
if card:get_seal()
Is it possible for a mod to handle multiple separate config files?
Gaze at the atrocity of this frankenstein of a jokerlua calculate = function(self, card, context) local my_pos = nil for i = 1, #G.jokers.cards do if G.jokers.cards[i] == card then my_pos = i break end end if my_pos and G.jokers.cards[my_pos + 1] and not SMODS.is_eternal(G.jokers.cards[my_pos + 1], card) and not G.jokers.cards[my_pos + 1].getting_sliced then local sliced_card = G.jokers.cards[my_pos + 1] sliced_card.getting_sliced = true G.GAME.joker_buffer = G.GAME.joker_buffer - 1 G.E_MANAGER:add_event(Event({ func = function() G.GAME.joker_buffer = 0 card:juice_up(0.8, 0.8) sliced_card:start_dissolve({ HEX("57ecab") }, nil, 1.6) play_sound('slice1', 0.96 + math.random() * 0.08) return true end })) card_eval_status_text(card, "extra", nil, nil, nil, { message = localize({ type = "variable", key = "a_spy", vars = { 1 }, }), colour = SMODS.Gradients["busterb_epileptic"], no_juice = true, }) local eternalreward = pseudorandom_element(G.P_CENTER_POOLS.Joker, pseudoseed('spytf2')).key local card = create_card("Joker", G.jokers, nil, "eternalreward", nil, nil, nil, "busterb_spy") card:add_to_deck() G.jokers:emplace(card) return nil, true end end
ya i stole from both daggers
k
local eternalreward = pseudorandom_element(G.P_CENTER_POOLS.Joker, pseudoseed('spytf2')).key
SMODS.add_card({ key = "eternalreward", edition = 'e_negative' })
return nil, true```
alsp for pseudorandom_element, the second entry can be any string
any string
so SMODS.Rarities?
element?
where u put pseudoseed
oh
yea it can be any string
pseudoseed (SMODS.Rarities))?
no remove pseudoseed
they mean that you don't need to call pseudoseed and can instead just enter any string
yeah
it'll be converted to a pseudoseed automatically if it hasn't been
smods adds that afaik
(G.P_CENTER_POOLS.Joker, SMODS.Rarities)?
thats a table
why are you putting rarities there
is there a quick way to reload all of my mod's centers?
also you're not actually creating eternalreward
just put 'spytf2' like you did before without the pseudoseed
you're returning the string eternalreward corresponding to a card that doesn't exist
instead of the variable
i was saying it would make it more balnced to like have it pick a rarity to spawn instead of a random joker since you wanted it to be busted
function pseudorandom_element(_t, seed, args)
if seed and type(seed) == "string" then seed = pseudoseed(seed) end
i forgot you don't use quotes on key
hmmlua local eternalreward = pseudorandom_element(SMODS.Rarities, 'spytf2').key SMODS.add_card({ key = eternalreward, edition = 'e_negative' }) return nil, true
like this?
if you wanted to do that, youd do local _, key = pseudorandom_element(SMODS.Rarities, "spytf2") SMODS.add_card { set = "Joker", rarity = key }
yea
you can't enter the key of a rarity to get a joker
do this
key is an argument for the key of a joker/center
yea thats if youre trying to spawn a specific joker
rarity = key, do i keep it that way?
No.
⌚
correct
assuming you have it like this
ok so
calculate = function(self, card, context)
local my_pos = nil
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then
my_pos = i
break
end
end
if my_pos
and G.jokers.cards[my_pos + 1]
and not SMODS.is_eternal(G.jokers.cards[my_pos + 1], card)
and not G.jokers.cards[my_pos + 1].getting_sliced then
local sliced_card = G.jokers.cards[my_pos + 1]
sliced_card.getting_sliced = true
G.GAME.joker_buffer = G.GAME.joker_buffer - 1
G.E_MANAGER:add_event(Event({
func = function()
G.GAME.joker_buffer = 0
card:juice_up(0.8, 0.8)
sliced_card:start_dissolve({ HEX("57ecab") }, nil, 1.6)
play_sound('slice1', 0.96 + math.random() * 0.08)
return true
end
}))
card_eval_status_text(card, "extra", nil, nil, nil, {
message = localize({
type = "variable",
key = "a_spy",
vars = { 1 },
}),
colour = SMODS.Gradients["busterb_epileptic"],
no_juice = true,
})
local _, key = pseudorandom_element(SMODS.Rarities, "spytf2")
SMODS.add_card { set = "Joker", rarity = key }
return nil, true
end
end```
is it good now?
oh yeah
i forgot to remove the comment from dagger
since i stole it from vremade
⌚
seems good
one last thing again since this is supposed to be "busted"
you could make it not spawn cursed jokers
by putting if key == "cry_cursed" then key = "cry_exotic" end after the pseudorandom_element call
if key == “cry_cursed” then key = “entr_entropic” end
What is the goal?
Ok so
The main reason why I made spy tf2 was to combat cursed jokers
What they suggested was
To replace cursed jokers with exotic jokers
If detected that is
you mean here?
local _, key = pseudorandom_element(SMODS.Rarities, "spytf2") --here--
SMODS.add_card { set = "Joker", rarity = key }```
yea
this would cause issues if you have cryptid and not entropy
oh yea true
yeah
Oh wait
its CRY_cursed
Right
I forgot
Then it’s still cry_exotic
Ok so spy breaks
When I try selecting a blind
With another joker
:(
It doesn’t even give any “oops the game crashed” or something
WTF
REMOVING SPY BREAKS THE GAME??
Maybe it’s the placement of the local my_pos
IT WORK
How do I apply multiple lines of these?
how do i change the """"size"""" of a joker? like, when its flipped, how do i make it a square or whatever yknow
cuz i have some nonstandard joker sizes
Candycane?
display_size is at what size the sprite should show ingame, pixel_size is the size of the sprite on the atlas which tells the game how much of the sprite to use
if im patching a new texture path into the game how do i specify the folder it is in?
or can i just put imagename.png
why are you patching images into the game
i cant imagine you would have to patch the texture files for that
try looking at how tangents changes the shop sign
yes
missunderstood you
Guys I currently have this and it doesnt seems to work
store in card.ability
thanks
how would i apply pixel_size to a joker that already exists? Im changing egg and stencil to be custom models with their own sizes
you should probably ask the malverk thread about that
alr
actualyl
ig you could take_ownership but that would be wierd with the texture pack disabled
ill ask malverk
which thread is that? I searched up malverk in #1209506514763522108 but i cant find it
ty
sorry back
wdym multiple, just copy paste the line
Oh
Would it crash if I use the joker without cryptid?
If Cryptid won't be present during the check, those will just fail.
They’ll be ignored?
<@&1133519078540185692>
bazinga
🫡
Could one of you tell me how to specify a random Tag? Diet Cola uses add_tag(Tag('tag_double')) to specify a Double Tag in particular, but can this be modified to produce a random Tag?
particles keep crashing.
(before yall hound me for using a development version, this happens even on stable.)
Yo what's up Lapsem, been seeing you on the balatro wiki. As for your question, there's get_next_tag_key which is probably what you're looking for?
Well, if only I knew how to use that.
get_next_tag_key would interfere with the main tag spawns i imagine
since itll use the same queue
DebugPlus
there's the append arg, does that not circumvent that issue?
uhhhhhhhhhhhhhhhhhhhhhhhh
i have no clue i only knew about the vanillaremade way of getting a random tag
yeah i imagine you just do what Card:start_dissolve does but with self.states.visible = false instead of self:remove
I don't know either! You can find the code for it at functions/common_events.lua:1914, and my guess is that you'll need to format it like add_tag(Tag(get_next_tag_key("modprefix_seed")))
okay thanks
Hey, is there a good way to test UI? Like making a separate window so you're not messing with the base game UI
Debug plus watch commands
looking at your screenshots of the code, you never defined any icon atlases
remove the suit_icon = { ... } lines
and see if that works
you did not remove all the suit_icon = { ... } lines
?
did you. save the file?
yeah
it doesn't seem like you did
there is literally no way for the error to say anything about icon_lc if icon_lc isn't anywhere in your file
wait i resaved it and it still crashed but i think this is a new error
delete line 27
Folks, how could I check what current Ante is? Like for exmaple «if current Ante is 6»?
in terms of context
G.GAME.current_round.round_resets.ante iirc
if that doesnt work then try blind_ante instead of ante
ok i got it in the game now i just need to actually figure out how to add it to the cards
now go to the Customize Deck options
im here
{ n = G.UIT.O, config = { object = G.GAME.blind, draw_layer = 1 } },
{ n = G.UIT.O, config = { object = G.GAME.blind, draw_layer = 2 } },
How come the first one shows up in the create_UIBox_HUD_blind function, but not the second?
the Hearts suit should have a new option
hrm
is this because of the altered pixel size
No, it's G.GAME.round_resets.ante
try turning off pixel smooting in your settings if you have that on and see if it shows then
the entire reason im making this mod in the first place is to change the dimensions to make the cards high quality
i made a joker a while ago that sets the card's seal to gold before it's scored, but it doesn't trigger the seal's ability
is there a way to fix that?
the code for calculate looks like this
if context.before and not context.blueprint and #context.full_hand == 1 and context.full_hand[1]:get_id() == 6 and G.GAME.current_round.hands_played == 0 then
-- context.full_hand[1]:set_seal("Gold", nil, true)
G.E_MANAGER:add_event(Event({
func = function()
card:juice_up()
context.full_hand[1]:juice_up()
context.full_hand[1]:set_seal("Gold", nil, true)
return true
end
}))
return {
message = "Gold Seal",
colour = G.C.MONEY,
message_card = card
}
end
end```
👌
Remove nil, true and move it out of the event.
yeah it did work, but the seal gets set before the card finishes moving when played
which... doesn't look great
Is it possible to change em tho
it should just work by default
deck skins are probably different then but ive never worked with them so i wouldnt know
ok cause my plan is the png for the texture pack is 10x larger than normal so i want the card pixel size to also be 10x larger to match it
Where can I have decks store permanent data (eg from card.ability), since self.ability and card.ability seem to throw an error where the value is nil
just store it in G.GAME
isnt deck.effect.config the center's config
G.GAME.selected_back?
Since I'm running it on calculate, and using a config to set a persistent value like jokers do
maybe but thats what eremel said in the write up :3
Idk if they carry similar params
deck.effect should work i think
yeah
I'll see
deck should be the second argument of calculate in this case
well they can be named john, sue, alvin if you want lol
The card is equal to the deck itself.
but self, deck, context is what makes sense there
Fair enough
Nope...
"attempt to perform arithmetic on field 'multi' (a nil value)"
For my "Deck! Deck! Deck!"...
calculate = function(self, back, context)
if context.before then back.effect.config.repeatamount = G.jokers.cards and #G.jokers.cards or 0 end
...
You should also start a fresh run to initialize the value.
Kk
yeah ok just tested and you can modify that value without affecting the center so it should work ok
Well the crash is gone, but the effect is just dead
It's not removing the enhancements of the entire deck which is a shame
whats the code
What is your SMODS version?
key = "GG_vampiricdeck",
atlas = "atlasholders",
pos = {
x = 4,
y = 2
},
config = {
multi = 0
},
loc_txt = {
name = "Vampiric Deck",
text = {
"At the end of ante",
"remove all {C:attention}Enhancements{},",
"gain {C:mult}+2{} Mult for every",
"{C:attention}Enhancement{} removed."
}
},
calculate = function(self, deck, context)
if context.end_of_round and G.GAME.blind.boss then
local cards = G.playing_cards
-- fix this shit later idk
for i = 1, #cards do
if cards[i].ability.name ~= "Default Base" then
cards[i].ability.name = "Default Base"
deck.effect.config.multi = deck.effect.config.multi + 2
end
end
end
if context.pre_joker then
return {
mult = deck.effect.config.multi
}
end
end
} ```
did it work before
setting the name does nothing besides creating janky interactions, you should check config.center.key and use Card:set_ability("c_base") instead of setting the name
1.0.0~BETA-0711a-STEAMODDED
i never played with Smods.Back so no
i merely checked how it is defined in the card ability config, so i dont really know what i was doing
via debugplus
as far as i know it was doing something since the crash was related to within the if condition, but i will see how i can tinker with the keys and all that
Update SMODS
it should be something like
for i = 1, #cards do
if next(SMODS.get_enhancements(cards[i])) then
cards[i]:set_ability("c_base")
deck.effect.config.multi = deck.effect.config.multi + 2
end
end
Alright
On 0827c
if context.ante_end then
for k, v in pairs(G.playing_cards) do
if v.config.center.key ~= 'c_base' then
v:set_ability('c_base')
deck.effect.config.multi = (deck.effect.config.multi or 0) + 2
end
end
end
would be simpler.
looks the same to me
Well at least the enhancement draining works
return{
sound = "xmpl_soda",
func = function ()
SMODS.add_card{key = "j_diet_cola", edition = "e_negative"}
end
}
why does the sound not play?
But I think the deck just doesn't want to give me any mult
Code?
if anything, it probably looks even worse now because "-$3" popup and the effect are out of sync
it needs to have a message, use play_sound() instead
if context.before and context.main_eval and not context.blueprint and #context.full_hand == 1 and context.full_hand[1]:get_id() == 6 and G.GAME.current_round.hands_played == 0 then
context.full_hand[1]:set_seal("Gold", nil, true)
context.full_hand[1]:juice_up()
return {
message = "Gold Seal",
colour = G.C.MONEY,
message_card = card
}
end
end```
ok thx
You didn't remove nil, true
try another context other than pre_joker maybe
Got any suggestions?
context.other_joker
yeah.. i changed it after it didn't work for the second time, one minute...
like baseball card
whats my keyboard doing
Are there anything I can use to have it before jokers score?
That's a seizure lol
isnt that how baseball card works already
or does it give the mult after the joker trigger
Before any joker should trigger
Like the green joker's mult change for instance
Idk
i dont think thats a thing, there is initial_scoring_step which is before everything ig
Well that's a bit rough