#đ»ă»modding-dev
1 messages · Page 560 of 1
yeppp i think im gonna put that one off till later too
If you check four fingers the code is just an SMODS function
the hard part in my head is keeping track of what cards you have and havenât played
that part seems a lot harder than making it a straight flush
You can check it easily
For loop thro the hands played and if itâs played more than one time itâs been played before
And check for scoring cards table size
through the cards played you mean?
If itâs 5 then itâs a 5 card hand that hasnât been played before
Hands
it checks for the cards played, not the hands played
its not
its like hiker
its checking for the individual card
wait they already store that?
i thought it was just for the current ante for the pillar
im pretty sure
Local thunk is a genius
or is the storage permanent
Local thunk knew all along
even if they dont it wouldn't be hard to implement
i think it's card.base.times_played
Trying to make a consumable that can only select a specific suit, what am I doing wrong?
for key, value in pairs(G.hand.highlighted) do
if value.suit ~= G.C.SUITS.Clubs then
return false
end
end
return #G.hand.highlighted <= 2
end,```
value:is_suit("Clubs") or value.base.suit == "Clubs"
how do i make it so that a blind appears after defeating a specific blind
(i know in_pool exists but i cant for the life of me figure out why it wont spawn)
Im tryna make an enhancement where if 3 of the same enhancement is played, then the played hand is upgraded, the problem is it upgrade the played hand per enhancement even though i only want it to activate once, how can i do this?
never mind figured it out
so in context.before iterate over context.full_hand or context.scoring_hand (depending on intent) and keep a tally of all enhancements encountered in a table
then level up if an enhancement in the table has a tally count of 3 or more
never mind again
im using G.GAME.chips = 0
oh wait i think i know why
why does this crash upon the voucher appearing at all
...
update = function(self, card, dt)
for i = 1, #G.jokers.cards do -- <- line 392
local joker = G.jokers.cards[i]
if joker.config and joker.config.center and joker.config.center.pools and joker.config.center.pools.Bulgoe then
card.ability.extra.bulgoes = card.ability.extra.bulgoes + 1
end
end
end,
...
full code
SMODS.Voucher {
key = "rabbulgoe_hole",
name = "Rabbulgoe Hole",
atlas = "crp_placeholder",
pos = { x = 5, y = 2 },
config = { extra = { bulgoes = 0 } },
requires = { "v_crp_bulgadicioe" },
loc_vars = function(self, info_queue, card)
info_queue[#info_queue + 1] = G.P_CENTERS.j_crp_bulgoe
return { vars = { } }
end,
update = function(self, card, dt)
for i = 1, #G.jokers.cards do
local joker = G.jokers.cards[i]
if joker.config and joker.config.center and joker.config.center.pools and joker.config.center.pools.Bulgoe then
card.ability.extra.bulgoes = card.ability.extra.bulgoes + 1
end
end
end,
calculate = function(self, card, context)
G.GAME.current_round.free_rerolls = G.GAME.current_round.free_rerolls + (lenient_bignum(card.ability.extra.bulgoes) * lenient_bignum(card.ability.extra.bulgoes))
end,
crp_credits = {
idea = { "Gudusername" },
code = { "Rainstar" }
}
}
the code
Why did you shape it like that
i think you need to do it with an event that sets G.GAME.chips to 0
oh ive never used events
Try the global chips
freeform screenshots
hand_chips
alright
i dont need to set mult but ty
so this crashes in a run?
you need to wrap the entire for loop in the update function inside of an if statement that checks if G.jokers exists
oh fair just like a nil check
yeah
it works but how do i set the visual thingy on the side
this
i think it was prob working earlier cuz u were in a run while viewing collection
SMODS.Scoring_Parameters.chips:modify(-hand_chips)
Yes, i have had that, the problem is the hand upgrading based on the amount of astral cards played (3 minimum) cause the upgrading doesnt activate unless theres 3 or more
ooohhhhhh
hmm maybe have a flag to check if its the first astral card scored then do the upgrade
why is value.base.nominal returning a boolean value?
for key, value in pairs(G.hand.highlighted) do
if not value.base.nominal <= card.ability.extra.max_rank then
return false
end
end```
because you're negating it
oh i did a lua oopsie
how can i get the rarity of a held joker?
one pair of parenthesis and lua is happy again
joker.config.center.rarity
How does gateway destroy all jokers
idk but you can destroy all jokers by doing SMODS.destroy_cards(G.jokers.cards)
Cryptid has a special gimmick where certain items can overflow even when the limit is reached. I wanna copy that effect but idk how.
@digital valve this person pinged you 4 months ago
This can be applied to a consumable?
yeah
No it was in #đčă»game-discussion
Will this also destroy the joker that the consumable spawns
I mean clearly yeah
No
Report this issue if you don't mind.
is it possible to have a joker destroy itself without making any noise?
can_use = function(self, card)
return G.jokers and #G.jokers.cards < G.jokers.config.card_limit
end,
if i remove
and #G.jokers.cards < G.jokers.config.card_limit
can it still spawn the joker?
Yes
Hey there! Just wanted a little tweak to this joker here. Rayquaza gains 0.1x mult for every stone card played. How can I show the current mult in the joker's description?
Return the value in loc_vars
And use #2# as an example to display it
Can i see a screenshot(iâm on phone )
This is so cooked
it wAS MADE IN JOKERFORGE OK
i can find config but i don't see loc_vars
Make a loc_vars then and return said variables
You can find examples in any joker
In vanilla remade
ok i'll take a look at that
Return variables by order
And place #1# in loc_txt do display first variable
#2# for second
And so on
Said variables are
Card.ability.extra.Something
In your config you can find all the (something )
Can jokers interact with a blinds chip requirement? If so how do
Yes
What do you want to do exactly
omg i'm looking for that too!
divide the size of the blind by a number
like half it for example
hey where are the smod docs i wanna see everything that context has as fields or functions
local current_score = G.GAME.chips
local current_requirements = G.GAME.blind.chips```
YOU NEED TO CHECK THAT YOUâRE IN A BLIND
or this will crash
local is_in_blind = G.GAME.blind.in_blind```
This is how to check
Ofc you want to change the direct variables not the local ones because that wonât do anything
And how does one do that
do you just replace local with direct
I FUCKING HATE THIS CONSUMABLE THAT KEEPS CRASHING
SMODS.Consumable {
key = 'fantasy',
set = 'Spectral',
atlas = "atlas_Fantasy",
pos = { x = 0, y = 0 },
soul_pos = { x = 0, y = 2, new = { x = 0, y = 1} },
soul_rate = 0.1,
can_repeat_soul = true,
soul_set = 'Spectral',
loc_txt = {
name = "Fantasy",
text = {"Creates a random {V:1,E:2}Grandiose{} joker", "{s:0.8,C:inactive}Destroys all held jokers, also needs room :({}"}
},
loc_vars = function(self, info_queue, card)
return { vars = { colours = {SMODS.Gradients["busterb_grand"]} } }
end,
use = function(self, card, area, copier)
SMODS.destroy_cards(G.jokers.cards)
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.4,
func = function()
play_sound('timpani')
SMODS.add_card({ set = 'Joker', rarity = "busterb_Grandiose" })
card:juice_up(0.3, 0.5)
return true
end
}))
delay(0.6)
end,
can_use = function(self, card)
return G.jokers and #G.jokers.cards < G.jokers.config.card_limit
end,
draw = function(self, card, layer)
if (layer == 'card' or layer == 'both') and card.sprite_facing == 'front' then
card.children.center:draw_shader('booster', nil, card.ARGS.send_to_shader)
end
end
}
I see
what part
Whatâs the crash
Read it all youâre not losing anything
thats a lot of reading
Put tiktok on the side
I dont use tiktok
I have been
Great !
re: this
where do i find all this
I cannot copy the crash log but it's something about utils.lua
Read the source code from smods
What does it say đ
... ah fuck context is from vanilla isn't it
There are couple of contexts in vanilla remade and smods docs
Everything you need actually
Some contexts can be skipped or replaced with flags
@cursive gazelle hey just wanted to follow up on the thing i was working on
am i at least getting somewhere
Somewhere yes
Please donât modify your variables in loc_vars
Tho
Just return card.ability.extra.xmultvar
And place #1# somewhere in your description
question
And it will be replaced with it
how will the game know that #1# is card.ability.extra.xmultvar
You return it the first value in loc_vars
If you return (5,card.ability.extra.xmultvar)
Then #1# will be 5 and #2# will be the mult value
điâm on phone
that makes so much sense
alright imma see how it works
src/utils.lua:2531: attempt to index a a nil value
nil checks again
probably just a syntax error i could fix very quickly
yeah that checks out
Some variables arenât always available like G.hand being nil aka not existing in shop
You have to take an account for that
And nil check it
But this is a spectral card that spawns a joker.
Replaces a joker ?
Or just spawns one
Spawns one
It should work like gateway
Removes all held jokers then spawns a new one
New one of a high rarity
Custom
I mean i can give you the code đ itâs not that hard man
You can figure it out
I just copied the code of another spectral card I made, used the thing for destroying all jokers, then ran it
It doesnât destroy all jokers tho
Wdym
Istg i hate coding in note app
đ
SMODS.Consumable {
key = 'something',
set = 'Spectral',
pos = { x = 0, y = 5 },
use = function(self, card, area, copier)
local deletable_jokers = {}
for _, joker in pairs(G.jokers.cards) do
if not SMODS.is_eternal(joker, card) then deletable_jokers[#deletable_jokers + 1] = joker end
end
local _first_dissolve = nil
G.E_MANAGER:add_event(Event({
trigger = 'before',
delay = 0.75,
func = function()
for _, joker in pairs(deletable_jokers) do
joker:start_dissolve(nil, _first_dissolve)
_first_dissolve = true
end
return true
end
}))
G.E_MANAGER:add_event(Event({
trigger = 'before',
delay = 0.4,
-- use smods.add_card here
end
}))
end,
can_use = function(self, card)
return G.jokers
end
draw = function(self, card, layer)
-- This is for the Spectral shader. You don't need this with `set = "Spectral"`
-- Also look into SMODS.DrawStep if you make multiple cards that need the same shader
if (layer == 'card' or layer == 'both') and card.sprite_facing == 'front' then
card.children.center:draw_shader('booster', nil, card.ARGS.send_to_shader)
end
end
}```
@pastel kernel
if context.evaluate_poker_hand then
if #context.full_hand < 5 then
return {}
end
local is_unplayed = true
for _, card in ipairs(context.full_hand) do
if card.base.times_played > 0 then is_unplayed = false end
end
if is_unplayed then return { replace_scoring_name = "Straight Flush" } end
end
end```
hmm this is uh. kinda working?
lmao not really though
its uh
only replacing the hand *before* you play it, once it actually gets scored it swaps the hand back to what it actually is
how do i get it to actually... be a straight flush
Thanks, iâm using this.
If you played it then it check if it was played and itâs played
So it goes back
Goodnight modders

how can i check if first card in played hand is a specific rank?
ok its getting late im gonna go to bed
G.play.cards[1]:get_id() i think
if context.full_hand[1]:get_id() == number
makin' more joker arts
How does context.selling_card work? I turned "selling_self = <>" to false yet its still triggers when it gets sold? Am I misunderstanding it somehow?
â
Anti Joker - Rare - Played cards have a 1 in 4 chance to be given a random enhancement
How do I make it so that played cards gain a random enhancement?
Hey, so my custom Joker doesn't seem to work with blueprint and I'm at a loss. Can someone point me to the right way? I'm terrible at coding.
is there a good guide to start with making a mod
2nd pin in #âă»modding-general
This looks extremely overcomplicated I cannot lie
A lot of this also does not follow typical standards for joker coding. Have you taken a look at VanillaRemade? That may help you with your structure and potentially solve your issue as well
So the idea is making the guy copy the first consumable used when the 'first' value is 0, after he copied it, I set the value to 1 to block future copies, and reset it back to 0 as the round ends
I'm doing something wrong, I'm not sure how check_for_unlock works as I've never used it before:
check_for_unlock = function(self, args)
if args.type == 'modify_jokers' and G.jokers then
for _, joker in ipairs(G.jokers.cards) do
if joker.ability.set == 'Joker' and joker.key == 'j_cavendish' then
return true
end
end
return false
end
end```
It's supposed to unlock if you obtain a cavendish, but I'm not sure how that works here
I can tell what it's trying to do
Currently he works even with multiple copies but I couldn't get Blueprint/Brainstorm to play nice with it
Instead of doing that loop, try doing if next(SMODS.find_card('j_cavendish')) then
right, yeah
i was honestly just copying some code from bootstraps, and obviously i dunno what i was doing
:P
I'm not 100% sure but I think you stuffing all of your code in a func return may be part of the cause
Also the elseifs between contexts aren't very standard
You could also simplify it to two checks by changing your first value from a number to a boolean and tacking on a if not card.ability.extra.first to your conditional (or whatever syntax you wanna go with)
For the life of me I cannot figure out how to check if the sold card was a joker and for it not to trigger on self sell Iâm going insane, ive looked on the wiki and vanilla remade but its not helping me at all..
I already know its gonna be the most simple thing and im gonna look stupid 
Can you show the conditional?
Yeah, I'll totally try that out thanks
Also do you think Blueprint doesn't play nice because it doesn't look at my first value? When I remove the value check it works
Been looking for a workaround for like an hour now đ
Which part is the conditional? is it the "If" statement?
yes
"if context.selling_card and G.GAME.blind.in_blind then"
And what is the intended function?
That could be a possibility but frankly I'm not 100% on that. I would just work on moving stuff out of that return func first and see where that leaves you
Lowkey I would rewrite it myself right now but it is late asf for me
Yeah I'll try that and see how it goes, thanks for the advice
Here I'll just give you the whole function (without all the previous stuff I tried to make so it wouldnt trigger on self sell and only work on jokers)
I genuinely don't even know what to make of this mess of code đ
why returning the cardarea............... đ
Anyways to solve the problem you're trying to fix is simply replace context.selling_card with context.selling_self
no I want it NOT to trigger when selling self
So only when selling another joker
yes
if context.selling_card and not context.selling_self and context.card.ability.set == 'Joker' and G.GAME.blind.in_blind then is your conditional then
holy context
yeah
that doesnt work
its still triggering on self sell
I tried that exact line of code earlier I cant get this to work i dont understand
then try replacing the not context.selling_self with not context.card == card
context.card ~= card should also work and is probably better for brevity's sake
now its not triggering at all for anything
not context.card == card parses as (not context.card) == card
so you have to use context.card ~= card
Where does one put localization text for a custom seal?
Under Other
omg thank you so much its working finally I have been trying to do this for over an hour
hbp_belphegor_seal={
name="Belphegor",
text={"Test."}
}``` Like this?
yep
@sturdy compass thx also
np
localize = "hbp_belphegor_seal"}```
I have this in the seal but it doesn't seem to work
You shouldn't need that if you're using a localization file
Okay this is so weird, I got it to work by setting
local thisdamncard = context.blueprint_card or card
Yep tested a few times and nothing went wrong for now, thanks for giving me ideas Astra!
Okay so the only problem remaining now with the sigil is that the description isn't updating.
name="Belphegor",
label="Helluva Boss",
text={
'This Seal gains {X:red,C:white}X1{} Mult',
'if in hand at end of each round',
'and applies it when played hand scores',
'{C:inactive}(Currently {X:red,C:white}X#1# {}{C:inactive} Mult){}',
'{C:inactive}(Resets if played)'
}
}``` I have this in localization
key = 'belphegor',
pos = { x = 2, y = 1 },
config = {
extra = {
sleepypoints = 1
}
},
badge_colour = HEX('d80007'),
atlas = 'helluvaseals',
unlocked = true,
discovered = true,
no_collection = false,
loc_vars = function(self, info_queue, card)
return {vars = {self.config.extra.sleepypoints}}
end,
calculate = function(self, card, context)
if context.cardarea == G.hand and context.main_scoring then
return { x_mult = card.ability.seal.extra.sleepypoints }
end
if context.main_scoring and context.cardarea == G.play then
card.ability.seal.extra.sleepypoints = 1
card_eval_status_text(context.blueprint_card or card, 'extra', nil, nil, nil, {message = "Reset Sleep", colour = G.C.BLUE})
end
if context.end_of_round and context.cardarea == G.hand and context.other_card == card and context.individual then
return { func = function()
card.ability.seal.extra.sleepypoints = (card.ability.seal.extra.sleepypoints) + 1
return true
end }
end
end
}``` And this is the seal itself
I'm trying to get the description to properly show how much of a mult it is giving but it's remaining at the default value
And apparently the label isn't working anymore
đ«
Yeah that's completely the reaction I wanted
Instead of indexing self.config in loc_vars, you should index card.ability.seal like you would in your x_mult return
Oh lovely that fixed the description!
Itâs as đŠle as that
Is it as shrimple fixing the error on the label? xD
I put in text= and label= but neither seems to be fixing it
Coding errors at my level are hilarious since most of the times I'm just using a wrong word or it's a syntax error of a missing damned comma or bracket
Ignore the ugly seals I'm still figuring out how they should look
this is way too verbose methinks
I know I hate it but I can't figure out how to phrase it smaller
In your localization under misc/labels do seal_key = âtextâ
Ah interesting that it's in a different area.
This is outside of descriptions btw
Mhm
seal_hbp_belphegor = 'Helluva Boss'
},```
I appear to be doing it wrong?
I have it in the misc outside of descriptions
Fixed it putting seal at the end insteada
Thank you very much
Now I just need to make sure the strengthening is working correctly then this seal is ready to go
And hopefully rewording the description smaller
Does the xmult only apply when you play the card
Or does it always apply when held in hand like a steel
So what it currently does is while it's in your hand and not being used it'll add the xmult when your hand is scored. At the end of a round this value gets larger if in hand but if you use the card in a played hand the value resets.
Or that's what it's supposed to do, it seems the adding value at end of each round it's held isn't working
text = {
{ 'aeiou' },
{ 'aeiou2' }
}
Hmm that's giving me an error
hbp_belphegor_seal={
name="Belphegor",
text={
{'{X:red,C:white}X#1#{} Mult',
'while this card',
'stays in hand',},
{
'Gains {X:red,C:white}X1{} if in hand',
'at end of round',
'{C:inactive}(Resets if played)'},
},
}
}```
-# ...ah, seal... not sure.
ÂŻ_(ă)_/ÂŻ
Okay neat it's not upgrading at the end of the rounds like it's supposed to
đ«
Muscle memory is gonna kill me with this emote xD
how do i make a for loop that puts specific ranks in a list or smth from played cards?
What do you mean? Puts ranks where?
you can do that??????????
Multibox descriptions.
Sadly not seal descriptions
Currently Belphegor for some reason is giving +2 instead of +1 at the end of each round đ«
key = 'belphegor',
pos = { x = 2, y = 1 },
config = {
extra = {
sleepypoints = 1
}
},
badge_colour = HEX('d80007'),
atlas = 'helluvaseals',
unlocked = true,
discovered = true,
no_collection = false,
loc_vars = function(self, info_queue, card)
return {vars = {card.ability.seal.extra.sleepypoints}}
end,
calculate = function(self, card, context)
if context.cardarea == G.hand and context.main_scoring then
return { x_mult = card.ability.seal.extra.sleepypoints }
end
if context.main_scoring and context.cardarea == G.play then
card.ability.seal.extra.sleepypoints = 1
card_eval_status_text(context.blueprint_card or card, 'extra', nil, nil, nil, {message = "Reset Sleep", colour = G.C.BLUE})
end
if context.end_of_round and context.cardarea == G.hand then
-- and context.other_card == card and context.individual then
return { func = function()
card.ability.seal.extra.sleepypoints = (card.ability.seal.extra.sleepypoints) + 1
return true
end }
end
end
}```
I'm also getting an error about repitition tables that is likely 100% related
can I get the player's steam ID
I'm not sure that even the C code has that information, let alone love
if steam stores it locally in any way then surely I can filesystem it?
I think I can actually
uhhhh I'm not sure there'd be a consistent way to get that information
or at the very least, it would make whatever you were doing instantly break on linux
It'd also be super invasive and unsafe
it's behind an opt-in feature on my mod's config along with the rest of my filesystem content
so I'd like to say that it's okay since you yourself enable these features
I'm only really looking into it as a more robust way of checking if a person is a person over profile name or profile folder name
still not amazing
Anyway the steam id3 is in Steam/userdata
i dunno if lua can check the name of a folder
it can
i'm already well versed in that regard
before I do that I want to do one other thing
which is to make the filesystem config reset to false when you update the mod
as an extra layer of "you opted in so it's your fault"
you could have it create a file named the mod version, and check if that file is present
and then if you enable it, you create that file
(or like, log it in a file)
(thats probably better)
đ€
yeah I can probably do that
<@&1133519078540185692>
I can read the metadata.json file to get the current version
thanks mods
I'll see if I can figure that out after the next content batch
So like
they turn on filesystems last update, so it created a folder called ver_log or something
and then it put the version number into it
and then when they update, you check if that file is there (if its not disable the config)
and if that file contains the current version (if it doesnt, disable the config)
and then if they enable it, create the file or append to it the current version
indeed
oh, and you should probably make it accessible to input a specified steam directory
so if they are on linux or are using a non standard file system they can still play along
i don't know exactly how to do that ingame, but I put comments in the files that say you can do that and outlined where to do it
if I can make a text input in the config I'll do that
that would be my preferred method
i mostly want to use the steam ID as a way of checking that someone is someone
that lets me make person specific effects which sounds good for jokebox
I wanna make a joker that gives X1 mult for each character you've beaten me with in a full match of guilty gear strive
lmaooooo
i've been doing stuff like this lately to try to manipulate the minmaxxers
if someone wants to get the most out of jokebox they will challenge me to strive and I get to play more strive and they get more xmult and we both win
Sorry for the LATE reply, i forgot to specify a list or smth just to check if 2s 3s 4s or 5s are a part of the played scoring hand
yes I know they can just change the file to do it, but that will always be a problem regardless of what I do, the steam ID is the best I can do at verifying it in a way that is difficult for somebody to decode without coding knowledge
it would probably be better to check the steam console log then
I don't know what that is
the nefarious sha 256 lua hashing in case they change it:
i don't know what that is either
Hi dilly
hi
if there is some way I can stop people from changing the filesystem lua files it would be cool
ah i found the best place to check i think
while I do attribute going into the mod and changing the xmult values to be the same as using debugplus to press "win the blind" not everyone shares that point of view
C:\Program Files (x86) (or whatever, its been a minute since ive been on windows)\Steam\config\config.vdf
its got a key "Accounts" which has their name and steam id
i have no idea how to read this in lua, but im sure you can figure out how to parse a massive file
(its really probably too large lmao, make your ram usage skyrocket for no raisin)
its such a big file kate didnt like me loading itt
i think i will just check the userdata folder to avoid a massive amount of ram usage whenever I access the value
thats fair
iirc love.filesystem goes line by line on reading files
i was looking for steam64 id which is the one you use for profiles, usually
that would take ages
but if you are just comparing it to one value it doesnt matter lmao
yeah it should be fine
mine was at line 500, imagine
Is there a way to make a joker show up more often without using a custom rarity?
yes
how so?
> refuses to elaborate further
genuinely I don't remember how
but I know for a fact that there is a way to do it
I'm pretty sure uhhh
maybe wait until N' is awake, lmao
saukhonghudecks
does it
i mightve spelled that wrong
but they have a tsaunami deck which makes splash more likely to appear
lmao???
it does other things
retriggers every played card 1 time for each splash you have
it has crossmod with tsunami (splash sleeve makes it work with splash fusions too)
so check there yeah
obligatory jokebox plug
-# you seem impressionable and subject to shock value humor which jokebox is good for
i mean i find it mildly funny
i dont necessarily want to play it
damn
does it make it show up more often or does it just make it be able to get dupes?
i mean the two would be separable, so it shouldnt be a problem
I guess I just have to search through all of the code now to look for it 
dis?
yeah, thats what i figured
its probably a part of the deck code instead
this is the allow dupes code, so yeah check for the deck code
this one?
idk where the code is for it
hello modders
ello
do you happen to know how to make a joker show up more often without using a custom rarity?
shop weight
i don't think it's an argument to jokers tho
SMODS.Rarity{
key = "supercommon",
default_weight = 0,
badge_colour = HEX('8c94a3'),
pools = {
["Joker"] = true
},
}```
supercommon
hell if I know
I never got it to work the way I wanted it to
scrapped the code and the idea

i wanted to make a beyblade joker that would play the beyblade song and spin for its duration and give benefits until it stopped spinning
the duration being in real world seconds
just stopped ?
damn
I didn't wanna do it if it wouldn't spin
kind of?
ask n' about it, joyousspring has better rotating code for defense position stuff
i just want a 45deg rotating
i rotate for fun and n' rotates for glory
Oh so it wont do anything in a joker then? so then is it impossible to show up more often without using custom rarity?
Well rip my joker idea
you can but it's weird to implement
this is simpler
Well for my joker idea a custom rarity wouldnt really work
I wanted the joker itself when you have it to increase the chances of you getting another
Maybe I thought of a workaround, is it possible to make a joker appear in the shop via a jokers effect
cus if so I could just make in a 1 in 10 chance or somethin then boom it shows up more often
you can spawn it in shop

like tags do
yeah that should work right?
yes
so how does that work exactly? I tried copying some of the stuff from the tags in vanilla remade but it wasnt working
Is it formatted different since its a joker not a tag
Is that a context?
in the wiki I only see reroll and leaving shop not enter shop
i think it's a state but there's a context for leaving a shope
surely there's a one for entering
just make it appear after one reroll
sounds reasonable to me
you could also add a chance to spawn for every reroll
rip the code from rare tag
not all of it
local card = SMODS.create_card {
set = "Joker",
area = context.area,
key_append = "v"
}
create_shop_card_ui(card, 'Joker', context.area)
card.states.visible = false
tag:yep('+', G.C.GREEN, function()
card:start_materialize()
card.ability.couponed = true
return true
end)
return card```
woops
add key="j_modprefix_jkey",
and your usual proba in context
it crashed
oh this may crash because of tag:yep
i think you can get rid of it
It crashed again even after removing that
what's the crash ?
Is there a reason why it's config = { extra = { something = "something" } } instead of config = { something = "something" } in Jokers?
it just works in extra some other game objects don't have an extra field like tags
Okay, got it
can i see your full code
why are you using your joker key as a set
set means a set of cards
like jokers tarots spectrals etc
I thought you said to swap them with the key?
What is the table with all planet cards again?
also fix your syntax it's cooked a little
wdym?
brother you question doesn't make any sense
align the elements better
are they not aligned already?
Is there no table with planet cards?
there's a set
All planet cards or owned planet cards?
yes
is this better
All planet cards
check vanilla remade wiki to see how you can fetch them
G.P_CENTER_POOLS.Planet
Right click > Format document
I see
Also this still isn't working
I'm trying to code a joker who enhances all cards on the last hand of the round (triggering as the same time as dusk)
Does someone sees a problem here ? It just.. don't work. It's not crashing, it's just doing absolutely nothing :c (pls ping me)
its not crashing anymore but its no doing anything
dusk triggers at hands left 0 no?
Yes, remove the return card and remove the card.states.visible = false
Hmm maybe idk honestly :/ but my joker would trigger anyway, just a hand too early, and now that's doing nothing
It's G.GAME.current_round.hands_left and it's 0
Also context.area doesn't exist.
It would be G.shop_jokers
ummmm
So if I want to spawn all planet cards it would be SMODS.add_card(G.P_CENTER_POOLS.Planet)?
it's working, thx
No, you would have to loop over it and do SMODS.add_card({key = v.key})
Oh, okay
its still not working
Use SMODS.add_card instead of SMODS.create_card
Okay its working now but its just adding a third card to the shop now? shouldnt it be replacing one of the other ones like the rare tag
No, it shouldn't because you're telling it to add the card to the shop slots.
I ripped all of the stuff from the rare tag so I thought it would
well how do I replace one of the slots then
Also why would something that doesnt exist be in vanilla remade?
Because it's a tag.
How would I make them not all spawn instantaneous but rather one after each other? Using delay() in the for loop doesn't work...
SMODS.add_card(planets)
end```
is it possible to make a joker impossible to debuff ?
Put it in an event.
Yes.
How ? ;; can't find anything about that
SMODS.current_mod.set_debuff = function(card)
if card.config.center.key == 'j_modprefix_key' then
return 'prevent_debuff'
end
end
and where am I supposed to put this ? In my joker code ? Or another place ?
Outside the joker.
You would hook Tag:apply_to_run
Oh can you only replace shop slots via tags?
Yes.
Like this?
SMODS.add_card(planets)
G.E_MANAGER:add_event(Event({
func = function()
delay(1)
return true
end
}))
end```
are custom tags hard to make?
No, put the SMODS.add_card in the event, and remove the delay.
No, what I meant was, it's possible with a joker, if you hook Tag:apply_to_run
Okay, it's still a bit fast then though...
Do you not know what hooking is?
no
Yes.
so how would I do this then if it does work?
You would check if context.type = 'store_joker_create' and next(SMODS.find_card('j_modprefix_key')) then return the created card.
what's the weight of the uncommon rarity
Is there any documentation/example code about creating a custom CardArea and displaying it in UI?
create a cardarea, save it in a global variable then put it in object in config of G.UIT.O
Well I overcomplicated it in my head then
Ty
Also is there a function that creates the entire deck or do I have to create one myself
i am very confused now, didn't have this issue with Nature's Assistence, but now im having trouble with a new mod.
The new mod "The Brutal City" is in the mod list, but isnt being detected by balatro
Is it in the mod list in-game?
no, i have it in the files but it's not being detected
this is the meta data for it
author has to be an array iirc
well... i know it's being detected now. got a game crash and from the looks of it, it's talisman
that looks like a card description has the wrong format
yeah i see the issue now
-# good thing i have another mod to look at to figure out what happened-
alright, it works now, thank you
Does anyone know, why this results in the sprites x to immediatley jump to 9 before just doing what it should do (0, 1, 2 etc.)?
if card.ability.extra.animation == true then
print(card.children.center.sprite_pos.x)
card.children.center:set_sprite_pos({ x = math.floor(G.TIMERS.REAL * 1) % 10, y = 1 })
end
end,
it's based on the time so it will do whatever sprite time % 10 gives you first
if you need to start at the beginning then you would need to keep a separate counter probably
How?
Because this just sprints through because update gets called every frame
if card.ability.extra.animation == true then
if card.ability.extra.frame > 9 then
card.ability.extra.frame = 0
end
print(card.children.center.sprite_pos.x)
card.children.center:set_sprite_pos({ x = card.ability.extra.frame, y = 1 })
card.ability.extra.frame = card.ability.extra.frame + 1
end
end,```
you need to only increment when some amount of time passes
And how would I keep track of that?
either with G.TIMERS.REAL or dt
What was the difference again?
Surely delay() would be the solution đ«Ł
But delay doesn't work there, does it?
i dont think its a good idea to delay for animations
it will delay everything else all the time
I gave the worst idea that I could think of
I recall seeing that delay is just a blocking event or something
timers.real is a timer while dt is delta time, so for the first you would have to keep track of the initial value while for the second you need to accumulate it until it reaches the time you want (also dt respects game speed)
Hey, this works :D
local frame_duration = 0.25
-- dt is the time since last frame (comes from engine)
card.ability.extra.timer = (card.ability.extra.timer or 0) + dt
if card.ability.extra.timer >= frame_duration then
card.ability.extra.frame = card.ability.extra.frame + 1
card.ability.extra.timer = card.ability.extra.timer - frame_duration
end```
I have a different problem TwT. Why does this sometimes result in an error?
delay(0.15)
G.E_MANAGER:add_event(Event({
func = function()
SMODS.add_card(planets)
return true
end
}))
end```
how could I remove all stickers from a joker
I just realized that I don't want it to respect game speed, can I change that easily or not?
you can use G.real_dt
ik you can do things like G.jokers.cards[i].ability.name_of_sticker = false
prolly not the best
this doesn't really help with modded stickers unfortunately
yeah...
Now my system doesn't work anymore...
Fixed it and all it took was some math >0<
What was fix?
im p sure main is for names and descriptions, while info refers to the info_queue boxes
I was not working with card iu this much, so every time I see this table it feels bad
same, same, but recently ive been working with card ui a lot so im getting used to it 3:
-# most notably the multi line, formatted info queue name shit, that took at least 5 years from my life span
well this is a first (i had vscode running with one dump file open)
Multi lines when you don't have access for smods kinda problematic
You have 2 options: use localize with type like 'descriptions', 'unlock', or literally copypaste part where localize function construct lines
iirc for the pr i added a flag for when info queues are created, then instead of using G.UIT.T in the name node it uses G.UIT.O instead đ€
i had to manually tweak the DynaText's scale until it looks pretty much identical to how the old G.UIT.T looked like lol
A lot of patching yay
true...
I have in my plans make a collection of UI components
Whih you can copy-paste and they will work
With room for customization, and docs
mmmm very interested in how that would turn out
Tbf I found this much more interesting than developing content or waste time try to position card area properly
I made a boss blind that debuffs a random rank avaiable in the full deck and changes every hand but for some reason it doesn't debuff anything, how can I fix this?
_ _
here's how i did it
Wait, maybe I know
how do you make a Joker that triggers on individual context not trigger on retriggers?
though Card:remove_sticker() is a function that exists and probably works better
I was wondering : would it be possible to make a deck where only my modded jokers can spawn ? if yes, how could I do that ? (pls ping me)
for k, v in pairs(G.P_CENTERS) do
if v.set == 'Joker' then
if (not v.mod) then
G.GAME.banned_keys[k] = true
end
end
end
would this work?
not what they asked for, this allows all modded jokers (as well as vanilla jokers modified by mods)
-# also this goes in apply
nvm it still doesn't work
why it doesn't debuff the cards from a random selected rank of the full deck?
How does updating the loc_text work in the update function
Would I be able to update specific lines by themselves?
now i need to figure out how to make the stickers not be applied in stakes its not supposed to... send help
i have a silly idea
reading the documentation :
yeah that worked ty
What was the code to load a file?
I remember it being something like
assert(load_file:
from there I get lost
assert(SMODS.load_file("file.lua"))()
Thank you!
wdym
uhh, where's the node.lua file? (this is the dump)
how would CardArea.FRAME be nil if it's defined in the Node:init then
dunno
ok wth??
still crashes
im confused
EF.CARDAREAS.blackjack_dealer = CardArea(
0, 0,
G.CARD_W * 8, G.CARD_H,
{
card_limit = 8,
type = 'title',
highlight_limit = 0,
}
)
{n = G.UIT.T, config = { text="Dealers Cards", scale = 0.75, colour = G.C.UI.TEXT_DARK}, nodes = {}},
{n = G.UIT.O, config = { object = EF.CARDAREAS.blackjack_dealer }},
when does it crash
when i call the ui function
function EF.FUNCS.UIDEF.blackjack_game(bet)
if not bet then error("where the hell is the bet") end
if not EF.vars.minigames.main_menu then ease_dollars(-bet, true) end
return {
n=G.UIT.ROOT,
config = {r = 0.1, minw = 15, minh = 8, align = "cm", colour = G.C.BLACK, padding = 0.5},
nodes = {
{n=G.UIT.R, nodes={
{n = G.UIT.T, config = { text="Dealers Cards", scale = 0.75, colour = G.C.UI.TEXT_DARK}, nodes = {}},
{n = G.UIT.O, config = { object = EF.CARDAREAS.blackjack_dealer }},
}}
}
}
end
this one
do you have that in a uibox
I might be missing something incredibly simple despite staring at the docs for roughly an hour, but my modded joker isn't showing up and I have a feeling it has to do with my localization files
for context, this is my en-us.lua file:
return {
descriptions = {
Joker={
j_j8mod_prophecy = {
name = "Prophecy",
text = {
"After {C:attention}#1#{} rounds,",
"sell this card to",
"create a {C:spectral}Spectral{} card",
"{C:inactive}(Currently {C:attention}#2#{C:inactive}/#1#)"
}
}
}
}
}
and this is the one Joker (doesn't do anything yet) I have in my jokers.lua file:
-- Prophecy
SMODS.Joker = {
key = "prophecy",
atlas = "j8-jokers",
unlocked = true,
blueprint_compat = false,
discovered = true,
eternal_compat = false,
rarity = 2,
cost = 6,
pos = { x = 0, y = 0 },
-- add draw function later
config = { extra = { prophecy_rounds = 0, total_rounds = 3 } },
loc_vars = function(self, info_queue, card)
local main_end
return { vars = {card.ability.extra.total_rounds, card.ability.extra.prophecy_rounds }, main_end = main_end }
end
}```
My mod `id` is "J8Mod" and my mod `prefix` is "j8mod"; idk if I'm meant to format the variables in the localization in a specific way
jokers still show up even without any localization text
youre probably just not loading the file its in
-- ## MOD SETUP ##
assert(SMODS.load_file("src/jokers.lua"))()
-- ## JOKER ATLASES ##
SMODS.Atlas {
key = "j8-jokers",
path = "jokers-temp.png",
px = 71,
py = 95
}
``` i am
hmmm
(this is j8mod.lua)
is j8mod.lua defined as the main file in the json?
{
"id": "J8Mod",
"name": "Forager Nonessentials",
"author": ["J8-Bit"],
"description": "Mostly shameless reference Jokers.",
"prefix": "j8mod",
"main_file": "j8mod.lua",
"version": "0.0.1"
}
I tried to send the "I love undocumented functions" image as a sticker
but it got blocked
so I had to send it has an emoji
How does rarity creation work? Trying to make something between Rare and Legendary
I've looked at the smods wiki and it's hieroglyphics to me
it has like a key
thats like half of the rarity
and the other half is the weight and colour
oh that sticker lmao
lol I guess out of context, what I said doesn't make any sense
i think the server has stickers and gifs blocked
well i mean, gifs from tenor and perhaps giphy
I knew about gifs
or whatever the hell it is called
Just didn't know it also blocks stickers
okay, im a bit confused about how i should go about telling my sticker "if card has eternal, then do not apply our sticker"
how can i go about that? and perhaps this is rlly simple but i just cant wrap my head around it atm lol
still no luck with this, I'm gonna try starting over, but I'm still not 100% clear on how I should name the keys for my localization file
the mod loads but the joker doesnt show up at all?
correct
can you take screenshots of your file structure?
did you change this to point to that main file
yeah I changed it to forager_nonessentials.lua
trying something simpler to start helped i think
tried a different simpler joker idea and I think it works
well. some things worked, some things didn't
looks like i gotta fix the card offsets too
it looks nice
-- jokers.lua
-- ## JOKERS ##
-- 69 Joke
SMODS.Joker {
key = "69_joke",
blueprint_compat = true,
rarity = 1,
cost = 4,
atlas = "j8jokers",
discovered = true,
pos = { x = 0, y = 2 },
config = { extra = { chips = 9, mult = 6 } },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.chips, card.ability.extra.mult } }
end,
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play and
(context.other_card:get_id() == 6 or context.other_card:get_id() == 9) then
return {
chips = card.ability.extra.chips,
mult = card.ability.extra.mult
}
end
end
}
--en_us.lua
return {
descriptions = {
Joker={
j_j8mod_69_joke = {
name = "69 Joke",
text = {
"Each played {C:attention}10{} or {C:attention}4",
"gives {C:chips}+#1#{} Chips and",
"{C:mult}+#2#{} Mult when scored",
},
},
}
}
}
ok i got it working
j_j8mod_69_joke was misspelled as "j_jmod_69_joke"
what would go into the UIBox? if feel like i tried everything that made sense but it just doesn't work
G.box = UIBox {definition = EF.FUNCS.UIDEF.blackjack_game(bet), config = {}}
something like that
creating a custom card area is proving to be quite torturous
whats the problem
is there a check or a context for when a seal is triggered?
i kinda realized that i have no clue what i'm doing when it comes to UI, feels like I'm walking on eggshells because I break the area whenever I try to tamper with it
wanted to do something about this
getting there
found out why the original crash happened to my card area, i tried to render it in main menu
wait that's not entirely true
it was this line....
why the hell did i pass 0 in the place of an element
there goes a few hours for stupid crap
-# bump
I mostly got my card area to work but when i try to emplace a card it just shifts the card area and it stays in this position forever no matter which deck i am trying to use
Code?
yup one moment
local start_run_ref = Game.start_run
function Game:start_run(args)
if not self.pactive_area then
self.pactive_area = CardArea(
0, 0,
self.CARD_W * 1,
self.CARD_H * 1.25,
{ card_limit = 1, type = "consumeable", highlight_limit = 1 }
)
end
G.pactive_area = self.pactive_area
start_run_ref(self, args)
if not self.pactive_ui then
self.pactive_ui = UIBox {
definition = {
n = G.UIT.ROOT,
config = { align = 'cm', r = 0.1, colour = G.C.CLEAR, padding = 0.2 },
nodes = {
{ n = G.UIT.O, config = { object = self.pactive_area, draw_layer = 1 } }
}
},
config = { align = 'cmi', offset = { x = 9, y = 5 }, major = self.jokers, bond = 'Weak' }
}
G.pactive_ui = self.pactive_ui
end
if G.consumeables and G.consumeables.config and G.consumeables.config.type then
self.pactive_area.config.type = G.consumeables.config.type
end
end
G.E_MANAGER:add_event(Event({
trigger = 'after',
func = function()
if G.pactive_area then
local c = create_card("taintedcards", G.pactive_area, nil, nil, nil, nil, "c_tdec_abyss")
c:add_to_deck()
G.pactive_area:emplace(c)
end
return true
end
}))
G.E_MANAGER:add_event(Event({
trigger = 'after',
func = function()
if G.pactive_area then
local c = create_card("taintedcards", G.pactive_area, nil, nil, nil, nil, "c_tdec_abyss")
c:add_to_deck()
table.insert(G.pactive_area.cards, c)
c.area = G.pactive_area
c:set_pos(G.pactive_area:get_pos(#G.pactive_area.cards))
c:align()
end
return true
end
}))```
Try this
oki
yeah i figured đ
i removed set_pos, everything works properly
thank you â€ïž
make the type jokers
I wouldn't figure this out on my own so
even if it's meant for consumables?
yes
alright
that one doesnt exist i dont think
ah

I thought it does
đ
hm this is weird.. my consumable is acting odd when in the new card area. Normally it's supposed to gain a "charge" at the end of a round but for some reason that functionality is just absent and I can't see why this would affect that segment
is there any guide/documentations for how to update text like the description of a joker?
"i wonder why it crashes"
my Object Node
local chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
for i = 1, 5 do
local rand = math.random(#chars)
res = res .. string.sub(chars, rand, rand)
end```
Return res in your loc_vars
what
loc_vars lets you pass variables to the localization function that can be substituted into your description
https://github.com/Steamodded/smods/wiki/Localization#loc_vars
what s gave you is a code snippet that generates a random string of 5 alphanumeric characters, which if it was in your loc_vars function and then you returned res as one of the variables, would create a new random string every frame and result in a constantly shifting gibberish description similar to misprint's
mmm huh.. I guess cards can't recognize end of round in the new card area
holy pain
im so fucking close to making my sticker work, img onna take a break for now since i literally cant think of anything else to try
are you using main_eval
yes
try not using it
Alright, I was using it primarily to avoid repeating actions
yeah if it works without it you can do not context.individual and not context.repetition
yeah it doesn't work regardless, for some reason
weird
if you want I can share the consumable's code, it's pretty messy so i'd guess things would break quite easily
yeah i can take a look
okih
figured it out 
how am i able to create an infobox/queue like this?
just add it in descriptions.other
in your localization
and then you can do info_queue{#info_queue+1] = { set = "Other", key = <key> }
i see
the only remaining issue is the use button being longer than usual but besides that everything works just fine :)
if anyone knows the fix for this please do reach out
hey so im trying to fix my balatro and this crash keeps happening, anyone know how to fix this? I've tried reinstalling the version.dll file and it doesn't work, thought it was the mods i have installed and its not it. I dont know
do you see like any mod that would conflict? because i dont
the crash is just happening before steamodded can put together its mod list
so i need to reinstall smods?
also pro tip everyone dont click on this person's server badge
for your own sake
honestly i should prolly remove it
it was for a different game leaking server
I've been getting that same error any time I launch with steamodded beta 827c
if I launch with 810a instead it works fine, aside from aikoyori's shenanigans not working
yeah because 810a is old
one of your mods just doesnt work with latest smods
for some reason
i presume
oh, apparently it was cryptid
cryptid should work with latest smods
you probably have a mix of latest releases and latest commits which can cause issues
so cryptid 0.5.11 is a bad version then?
cryptid 0.5.11 is just old
latest is 0.5.12a
so you should probably just go and update all your mods first
ok that actually fixed it, thanks
if i have a table within a table do i access it like table[1,3]
what is the alternative to modulo in shader code because it dont work lmfao
other than like a while loop imp but that seems slow
i'll probably do that for now i just hope that someone knows a faster way
couldn't you just
uint a = 24;
uint b = 7
float modu = fract(a / b) * b
but also why is modulo not working?!?! I don't know shader code well :)
why is riff raff creating jokers with stickers bro đ i cant wait to be done with this shit
i have no idea
amazing
i have no idea what i am doing for shader code so thank you
might need to use number though !!
i'll do that if it explodes
or maybe look at other shaders!!
this helped me
alright i have officially given up, if someone knows how to make stickers that actually work please @ me because id love to learn a thing or two
why does the game hate me (this is a voucher)
...
calculate = function(self, card, context)
if context and context.buying_card and context.card and context.card.config and context.card.config.center and context.card.config.center.key == "j_crp_bulgoe" then
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function()
if context.card and context.card.config and context.card.config.center and context.card.config.center.key == "j_crp_bulgoe" then
context.card:set_edition("e_crp_really_negative")
end
end
}))
end
end,
...
looks like an edition issue and not a voucher issue
SMODS.Edition {
key = "really_negative",
weight = 0.3,
shader = false,
in_shop = true,
extra_cost = 5,
get_weight = function(self)
return G.GAME.edition_rate * self.weight
end,
config = { card_limit = 3 },
loc_vars = function(self, info_queue)
return { vars = { self.config.card_limit } }
end,
crp_credits = {
idea = { "PurplePickle" },
code = { "wilfredlam0418" }
}
}
do you have a label for it in misc.labels in your localization
...
misc = {
...
labels = {
...
crp_really_negative = "Really Negative",
...
}
}
(yes)
these all work fine
...
labels = {
crp_overloaded = "Overloaded",
["crp_four-dimensional"] = "Four-Dimensional",
crp_zany = "Zany",
crp_mad = "Mad",
crp_crazy = "Crazy",
...
i'll try it nonetheless
still borked
...
e_crp_really_negative = "Really Negative",
e_crp_super_negative = "Super Negative",
e_crp_photon_readings_negative = "Photon Readings Negative",
e_crp_photon_readings_really_negative = "Photon Readings are REALLY FUCKING NEGATIVE",
e_crp_photon_readings_gone = "Photon Readings are Gone.",
why does the game hate me đ
i need an expert to help me out here i probably missed something super small
If no one else answered this, it's a function mod()
on another note, this crashes the game for some reason and i don't know why i just want my shader to use the same shader as the regular negative shader
SMODS.Edition {
key = "really_negative",
weight = 0.3,
shader = "negative",
in_shop = true,
extra_cost = 5,
get_weight = function(self)
return G.GAME.edition_rate * self.weight
end,
config = { card_limit = 3 },
loc_vars = function(self, info_queue)
return { vars = { self.config.card_limit } }
end,
crp_credits = {
idea = { "PurplePickle" },
code = { "wilfredlam0418" }
}
}
should it be like e_negative or something
What's the log look like?
says the value being sent is 'crp_e_negative'
don't know why it's try to start it with crp
any way to... not do that?
i could obviously make a new file in my mod that is just a copy of the negative shader and use that, but i would really rather not
unless it's the only way
Have you declared it as a new shader?
no, since i'm attempting to use a (presumably) pre-established vanilla shader
oh wait i'm stupid
it just occured to me what to do lol
wait no that wouldn't work nevermind
đ
Otherwise I'm not really sure? The shader field on vanilla negative is just "negative" as you have
yeah i think smods or something is automatically putting my prefix in front and nothing would really be able to change that
I have a theory, lemme finish cooking dinner
okay
aint prefix config a thing
on another another note, would this work? i forget what the function for finding if a joker exists or not is
extra_cost = SMODS.find_card("j_crp_statically_charged") and 0 or 13,
Prefix config is usually for the actual item key, I thought
like
prefix_config = {
shader = false
}
why do you think its a table
Strangely backhanded and passive aggressive statement. Try not to do that
okay hold on i just tested this and the extra price of overloaded (an edition) cards didn't go down to 0 when the joker was owned... why is that
...
extra_cost = next(SMODS.find_card("j_crp_statically_charged")) and 0 or 13,
...
That looks so cool
Hey! So a Joker in a mod I'm helping with has the functionality of when it's sold, it'll skip the current blind, provided it's not a boss blind. However, when one of this joker is sold, and two or more are held, every single blind will be skipped, including boss blinds. This is an issue if players in the run get the Showman Joker, since with it, they'll be able to replicate this and just win the game without really playing.
Any idea why this is happening?
This is the code
Where do localization for config tooltips go?
config tooltips? wdym exactly
oh i'm not sure
I currently have it under dictionary with the config item name
But when I try to call it it gives an error
sorry i didn't think it was backhanded but i will try not to do that
Thank you, apology accepted
Pain
dot
tooltip = {set = 'Other', key = 'helluvajokers_tooltip'},
},```
```Other={
-- Config
hbp_helluvajokers_tooltip = {
name = "Why.",
text = {
"Adds new jokers."
}
},}```
Okay got it working I guess I just had the wrong brackets earlier
how would i make it so that this creates a joker from the bulgoe pool instead of j_crp_bulgoe
SMODS.Voucher {
key = "bulgscension",
name = "Bulgscension",
atlas = "crp_placeholder",
pos = { x = 7, y = 2 },
config = { extra = { } },
requires = { "v_crp_bulgcrowd" },
loc_vars = function(self, info_queue, card)
info_queue[#info_queue + 1] = { set = "Other", key = "bulgoe-themed_joker" }
return { vars = { } }
end,
redeem = function(self, card)
local card = create_card('Joker', G.shop_jokers, nil, 1, nil, nil, "j_crp_bulgoe", 'bulgoverstock')
create_shop_card_ui(card, "Joker", G.shop_jokers)
card:set_cost()
card:start_materialize()
G.shop_jokers:emplace(card)
end,
calculate = function(self, card, context)
if context.reroll_shop then
local card = create_card('Joker', G.shop_jokers, nil, 1, nil, nil, "j_crp_bulgoe", 'bulgoverstock')
create_shop_card_ui(card, "Joker", G.shop_jokers)
card:set_cost()
card:start_materialize()
G.shop_jokers:emplace(card)
end
end,
crp_credits = {
idea = { "ScarredOut" },
code = { "Rainstar" }
}
}
also is there a context for when the shop is entered
starting_shop
for the other thing use SMODS.add_card{set = "bulgoe"}
that puts the card in the player's joker slots
then SMODS.create_card
How do I add a localization line that has a second line?
helluvacustomsuits_tooltip = "Changes suit names.","Clubs = Moons, Diamonds = Mammons, Spades = Crowns.", Doing this only shows the first line and gives an error for everything else. Putting brackets around it gives a "UI error" on the tooltip.
the create_card call
ok
what's this for
Config tooltip
how are you localizing it now
i mean what's the code you use that in
config = { tooltip = {text = {localize('helluvacustomsuits_tooltip')}},},
uhh bump since n' is online now and he would be smart enough to know why this is happening (hopefully) đ
never used this but it seems like text takes a table, you could add a second call to localize
like text = { localize('key1'), localize('key2') }
I'll try that
No change
config = { tooltip = {text = {localize('helluvacustomsuits_tooltip')},{localize('helluvacustomsuits_tooltip2')}},},``````helluvacustomsuits_tooltip = "Changes suit names.", helluvacustomsuits_tooltip2 = "Clubs = Moons, Diamonds = Mammons, Spades = Crowns.",
goddammit i'm cooked
that's not the format i said
Wait
Yeah I just noticed the difference
Now it works, thanks N!
Is it possible to have the tooltip show when hovering over the actual toggle button as well?
i'll just like repost again in case there's a wizard that can solve this
some and only some of my editions' labels are fucked and just have a red background with "ERROR" on them
here's one of the editions maybe i did something wrong
SMODS.Edition {
key = "really_negative",
weight = 0.3,
shader = false,
in_shop = true,
extra_cost = 5,
get_weight = function(self)
return G.GAME.edition_rate * self.weight
end,
config = { card_limit = 3 },
loc_vars = function(self, info_queue)
return { vars = { self.config.card_limit } }
end,
crp_credits = {
idea = { "PurplePickle" },
code = { "wilfredlam0418" }
}
}
...
misc = {
...
labels = {
...
crp_really_negative = "Really Negative",
...
}
}
...
key = 'tarotsHELLUVA',
set = 'Tarot',
path = 'helluvatarots.png',
loc_txt = { name = 'Helluva Tarot Cards',},
display_pos = 'c_star',
original_sheet = true,
localization = true
})``` ```descriptions = {
alt_texture = {
alt_tex_hbp_tarotsHELLUVA = {
c_chariot={
name="Stella",
text={
"This {C:attention}bitch{} enhances",
"{C:attention}#1#{} selected card",
"into a {C:attention}#2#",
},},},},}```
I'm trying to set up alt text for a malverk texture so it only shows when the texture is actually on but for some reason it's not working.
I know for seals I had to add _seal at the end so maybe you need to add _edition to it
No.
That's for seals only.
Seals have to be special
Does anything stand out to you as wrong for my malverk alt texture localization?
It was the loc_txt disabling it
Another quick thing; I'm trying to make all the cards in shop reduce in value and do the little "juice" animation, and while they go down in value correctly, they're not playing the animation correctly. I don't know if the return value of my function is correct since I'm mostly copying this over from another Joker of mine, but what would I do to get that effect?
-- jokers
for index, shop_card in ipairs(G.shop_jokers.cards) do
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function()
shop_card.cost = math.max(0, shop_card.cost - card.ability.extra.price_reduction)
return {
message = "Reduced!",
colour = G.C.EDITION,
message_card = shop_card
}
end
}))
end
returns like that dont work inside an event
idhushdishdh i was about to be like âyay my solution was solvedâ and then its just 
try using SMODS.calculate_effect({message = "Reduced!", colour = G.C.EDITION,}, shop_card)
Alrighty, thanks!
Should I just return true in that case or do I not need to return anything at all
yes return true or the event will keep repeating
alright, thanks!
-# also real quick is there a handy place I can find all the vanilla sound names
Yes, resources/sounds in the extracted exe
sup, is it possible to have the hello text to be anchored to the bottom of the column?
(the code is what i tried)
Heyo - I'm sure you all get this all the time and sorry, I tried searching around.
I'm just trying to make a silly little surprise texture pack for my SO - I'm not good at programming (just a graphic designer here đ ), so sorry in advance!
Using emihead's template.
It's been working great for me so far, but now that I'm on to "Enhancers" and they refuse to load. I tried to search here and the internet and can't find out why. It's likely because I'm, uh, not the smartest cookie.
This is the line from emiheads lua
local sprite_enhancers = SMODS.Sprite:new("centers", tpt_mod.path, "Enhancers.png", 71, 95, "asset_atli")
Thanks for any help, and sorry again!
SMODS.Sprite doesn't exist.
That is a bit confusing. The other textures are working and seem to use the same structure. Bleh.
Did you mean just Sprite(...)?
Alternatively, use the SMODS.Atlas registration with raw_key set to true?
SMODS.Sprite existed in an extremely old version though.
I'm sorry, I'm really not sure. I'm just trying to make a texture pack for their birthday and I thought it was simple enough when it just seemed to work until I got here.
Is there an updated template I can use? I'm just trying to replace the textures, literally nothing fancy.
Yes, Malverk
I was looking at that and... well, maybe I'm stupid but that seems complex and I have all the images placed and ready to go this was the last step. Thanks for the help, I'll try to figure it out.
I don't suppose there's an easy way to mass rename all suits in the game?
I'm manually changing them in my localization for a mod but it doesn't currently cover ones that are variables in cards.
No, there isn't.
How would I check when a joker destroys itself? I'm guessing a hook into Card:remove(), but I don't know what I'd do in there.


