#š»ć»modding-dev
1 messages Ā· Page 201 of 1
basically I just want the decks function to go through and use a function to set_base a specific number of times, then remove the rest
š
š it would be very helpful, I can somewhat understand how code is laid out but don't actually know any languages lol
Well I don't think there's any sort of tool like that unfortunately
OHKO (i couldn't figure out how to make it transition smoothly to the win screen without the game drawing cards to hand smh)
On the bright side though, if you really wanna commit to it, Lua isn't too tricky of a language to pick up, even for a beginner
you want remove instead of remove_card
what if you make the consumable add one hand to your current hands and then force it to play an empty hand
What exactly was your table designed to do? Because essentially what Iām trying to do here is create a blind that randomly changes its effect to a different blind every time you play a hand
how would one accomplish that (besides the 1 hand to current hands part)
And the idea was to create a separate instance of a blind in the background to call the methods from
I cant tell if I'm unlucky or if my code isn't working because whenever I play any hand with a pair it isn't leveling up
in my case it just checks for any instances of new tarot/planet/joker/spectral cards and adds their ids to keep track of how many unique cards the player has encountered
so just G.playing_cards[i]:remove()
wait nevermind
I'm pretty sure, yes
for debug purposes, make the odds 1 in 1 then
Good point
I have an auto-win function in my mod, you need to be in the selecting hand stage
behold this longboye of a description
Would be really nice if someday someone just had a comprehensive list of the functions
i tried that but since the consumable makes the game go into the PLAY_TAROT stage it just doesn't execute it, it just uses up the consumable
At this point, Iām wondering if I can just find a way to create the blind when I load the game instead of storing it, because I can at the very least store its name which persists between reloads
oh that's probably something you need to patch then
unless i can just make the game go into the selecting hand stage
Okay yeah this code just isn't leveling up any hands
i wouldn't even know where to start there tbh
i also totally forgot about this part
let me see
i assume you're going the same route as space joker, right?
Yeah, I used most of the code from there
oh wait i see your issue, you're not returning level_up = true nor the message. wrap those two lines of code in a return{} block
I uhh donāt know that I have that? The documentation on how to do this was pretty sparse
oh oops
Ohh okay
init_game_object is where the variables are created
in that scenario you're just setting level_up to true but it doesn't do anything
I mostly just wanted to make some inside jokers (ha) for my friends so I'm not sure I want to dive into the whole language itself š I tried copying and pasting stuff from other jokers and seems to work mostly besides crashing when the effect happens, it will roll for 50% if it adds x1 when a blind is selected but crashes if it works
actually i think that the jokers sample mod has a castle implementation that explains this process way better than i ever could
i like how it explains hooks
hooks are your friend
i love hooks
how do i access my joker's config attributes from the lua?
ok, a bit hack-y but what if you put the effect into an event with 0.6 delay. It would occur after the play_tarot state is reverted
Instead of changing the joker itself, you should change a variable you create that the joker holds onto
yeah that's what i was gonna say
so i should make my own variable inside the lua?
no. this is what the igo hook is for
hrmmm
thanks! I'll have to take a look at this then
igo?
this bit
for instance, i have a joker that works similar to to-do list but with xmult rather than money, so i created a variable in init_game_object that stores the name of the hand (by default 'High Card') and then change its value to any of the game's hands in reset_game_globals
so every round it picks a random hand
ah, thank you both!
gotcha
and I basically need that but on a per-hand basis. And storing a blind instead of a hand lol
+4 Mult if hand contains a High Card
why do you need to store the entire blind again?
so instead of resetting it in reset_game_globals you likely do it while calculating your blind? idk i havent touched custom blinds yet LOL
Here's my code for picking out a random hand type in a reset_game_globals as a reference. You can ignore anything relating to a stop sign or a challenge lmao
I probably don't, the name itself is probably enough but then I still need to figure out how to create it when the game loads and you're still inside the modded blind
It still does it, is this what you had?
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.6,
func = function()
G.GAME.chips = G.GAME.blind.chips
G.STATE = G.STATES.HAND_PLAYED
G.STATE_COMPLETE = true
end_round()
return true
end
}))
thank you very much!!!
š
what are you doing š
making a mod manager for Balatro
0 days
LMAO
LET ME HAVE FUN DANGIT
oof
when making a challenge, to call one of my modded jokers, will just putting the key as is for id work or do I need to add a prefix or something?
j_[prefix]_esper is what you want
sweet, thx

Does anyone know where the run info button and the poput is made.
-# Psst. (And how do I hook/patch it)
ui definitions
what if you try
if G.STATE ~= G.STATES.PLAY_TAROT then
if G.STATE == G.STATES.SELECTING_HAND then
G.GAME.chips = G.GAME.blind.chips
G.STATE = G.STATES.HAND_PLAYED
G.STATE_COMPLETE = true
end_round()
end
return true
else
return false
end
i didnt try it tho
(inside the event I mean)
back to putting almost the entire 200 strong Joker list into the banned_cards table 
do your stuff, maybe it turns out better than what's already out there haha
-# there are 15 competing standards
days since
...what does every other mod manager do 
-# ACE is planned to remain a CLI, mostly because tkinter scares me
oh hey, something that no regular user will dare use
unfortunately yeah
i'll make it look pretty i swear 
Okay so quick question
When making a legend like Joker
Does the background and the Joker itself have to be two separate sprites?
If so, hwo do i load them togather?
-# i don't think we had had a mod """manager""" until #1339375696254074942
Yeah skyline's is pretty neat
hopefully this one won't just randomly delete mods 
you are expecting a lot from people who can't read
fair point
it just softlocks
yes. you put both sprites on the same atlas and use pos for the bg sprite and soul_pos for the floating sprite
Okay thanks
damn well then patching might be the option lol
-# i like your lack of recognition of faroquin
Ace will do a lot of the heavy lifting by automatically downloading lovely and creating the mods directory, provided that the person actually has Balatro installed and started it once, if not, it will tell you
they are still going to struggle to use whatever you have made
i don't know that existed
can't blame me for that
-# How do I patch?
-# use lovely
Okay so is there any easy way to put things across several luas in the same mod pack or does that involve a lot of complicated coding
btw aure were you responsible for the get_straight override or was that someone else? I'm trying to hook it and I'm lost lmao
i guess like what would i even patch? end_round()? the state itself?
like having a seperate lua for decks, jokers, etc.
CLI, you might be cooking...
-# But how? Docs? (Can i do it with smods?)
holy based
Oh god the CLI nerds have arrived
where is that
hey whats wrong with liking cli tools
i say """CLI""" loosely here because there're planned to be little menus to navigate in order to get more details on a mod, similar to those that you would get in-game via smods
forgot to add /lh
Can I do it with Smods?
if its still on a terminal to navigate stuff thats called a tui
idk what you want to do
then yeah it'll be a TUI lmao
dont worry i knew it wasnt fully serious
so can I just throw assert(SMODS.load_file('jokers.lua'))() into the main lua or is there a special context i have to do
if you need to see the terminal screen to install most people will be scared
you can just do that
afaik yeah thats all u gotta do
š
gulp... a t-t-terminal??!! i have to ..... type words into this scary terminal?!!!! iumn gonana break my copmuter...............
-#
more like pressing a key, then enter, then pressing another key, then enter...
I'm going to assume some people are still scared of task manager
yes
if you're a Windows user, you have to know Task Manager.
ive seen like a post of some computer science teacher who had students who didnt even know how to create a folder in windows
and then they see lovely where the console is always open
Edit the size of the Run info and options, so that i can put my own button above it that creates a popup with check boxes
the iPad kids are becoming iPad teens
so many people are becoming technologically illiterate because everything just has convenient user friendly uis and does everything for you
(ahem phones)
skill issue?
got a small idea but still struggling on how to do this properly.
im not entirely against of having stuff be convenient but like its an issue when people stop knowing how to do stuff because of it
i have audio firmware issues
i still have arch installed on my pc i just don't use it
might need a little help
just saw that function, you need to patch with lovely
you can ovewrite all of it but that's going to cause problems with other mods probably
or wait maybe not
If I patch with lovely can smods disable that?
?
yes
you can also modify the return value of create_UIBox_HUD without patches probably
im assuming you have pipewire and its just a hardware thing cuz ?
just hardware thing
i was using pipewire
in fact any audio backend has the same issue
that issue being
yeah saw that just not sure how to properly code it and then get it to work
That sounds insanely hard
would it be something like this? used some of a template i saw from one of my other mods with a blind in it
use debugplus to reroll the blind
i see
you can just go to blind collection hover on blind and press 3
oh really
actually first i want to see if it actually registers in game though
it will change the boss blind to that yeah
if G.jokers.cards[i].config.center_key == 'j_hpfx_cyanosis' then
is this how i would check if this joker is the effect being used
this is not Minecraft you don't need to manually register it again
yes
the irony
the code's actually correct? i didnt mess up?
well, I don't know the context but it looks correct
and for me i also got the code right? if so then thanks
just gotta do some more things now
if it didn't crash then yes
balatro said this part of my code caused a crash anyone see the problem here?
what did it say
yeah that would be me
one moment let me find the crash report
but I've thought about maybe 10 different implementations of straights recently, so I'm not even sure of the original anymore (and i'm well aware it kinda sucks)
Alright cool. I ask cuz I've been staring at it for a long while and I cannot for the life of me figure out how it ticks. I've added this little bit to it (right after the shortcut check) and it's causing any 5-card hand to register as a straight. Any ideas? Has_face_filled always starts off as false, and this implementation is in a hook that basically clones the base override function
Ouch
ill be back in a bit to check something out
I think it's telling you the problem it's in another one of the files that you load but idk
With ui modding how do I create a new menu, kinda like the main menu? (Or is it easier to just create a popup?)
I'm not entirely sure what you want but look into G.FUNCS.overlay_menu
Smods?
no, that's a base game thing
I will, big G
i'd have to do the ID and display name things right?
(No pun intended)
so I got my first joker to work! but I'm having an issue where instead of incresing xmult (x1 becoming x2 etc) it just stays at x1, any advice?
show code
just stop having syntax errors 
i think the game should stop expecting '}'

Why are you doing that in an event manager?
what's the effect supposed to be?
I just copied stuff idk whats going on tbh š the effect being 1 in 2 chance for xmult to increase by x1 when blind is selected
just realized you're using a G variable too. Hoo boy
what even is G.GAME.current_round.Xmult supposed to be and where did you see it
you should be storing your mult in the same place you're storing your chance
it creates it so it should work, but the return doesn't have xmult either
probably from ai, I copied stuff from other jokers and tried messing with an asked an ai so thats probably where the issue is lol, it will do x1 it is a success but won't effect it so if xmult doesn't exist that would make sense why nothing happens lmao
ai will not yield good results
I figured since this is pretty niche š
you should also read the docs https://github.com/Steamodded/smods/wiki/calculate_functions
š«” thank you sorry for being dumb fsdsfd
that documentation def needs some work tho
I think it's fine
the first part literally explains the kind of effect we're talking about
Documentation? In my SMODS?? Nooooo neverā¦
oh yah i mean the page you linked is probably the best one in the wiki so far
I agree with that
Finished one of my legendary pokemon consumables
no idea why it shows an error badge under the joker rarity tho
is this how the set_perishable function would be used?
G.jokers.cards[i]:set_perishable(true)
chat what do we think of this fella?
the function in the source code is function Card:set_perishable(_perishable) self.ability.perishable = nil if self.config.center.perishable_compat and not self.ability.eternal then self.ability.perishable = true self.ability.perish_tally = G.GAME.perishable_rounds end end
so how would I use this function to set a joker to be perishable? what would the format be
i'd personally use the SMODS way
which is?
new error
amazing
aka SMODS.Stickers["perishable"]:apply(card, true)
Interesting but I donāt quite see the theme
so SMODS.Stickers["perishable"]:apply(G.jokers.cards[i], true)
it's a hurdle, makes your life harder short-term but rewards you long-term
when i played around with it those negative fools are clutch to keep around
Yeah but why Negative Fools
You could overcome a hurdle and get any benefit
Why that one?
i just thought it would be a cool effect and one worthy of increasing blind size
you can get the hurdle while you're strong and save up the fools
which can become any other tarot card later on
i could just make it a random tarot if i wanted to nerf it
Iām not saying itās not any of that, just that Iād maybe change the name and art for something else thematic
But you donāt have too of course
Also Iād word it differently
what if it was any tarot card so the fool itself wouldn't interfere with the theming?
Huge fan, would recommend rewording 0.2 to 1.2x
x1.2 I suppose
Concept is fantastic IMO
Yeah
true
Iād use the same template that I used for Champion
Not Championās Belt; Champion is different
That works I suppose. It depends on what you want
nice, it's actually my favorite joker that i've implemented yet, its really fun to pickup in a run
there we go
i was advised to do this earlier, do you guys know what the best way to store the last mult would be? (on that line)
i'll change the formatting later if i feel like it's needed
oooh yes I like this
i wonder how much of a headache coding this will be

Actually for just Lucky cards you could hardcode it
But for which effect?
both
Maybe take ownership of them
or maybe just mult iunno
1 in 5 yeah
thats what i was thinking
Still weak for a Legendary
funny though
i could maybe just set odds for both to 1 in 1 lmao
I think thatās weak too
The issue with both is that you donāt have Lucky Cards
but you can add them to your deck
100 dollars a hand is not weak
If you assume you have Licky Cards then yeah guaranteed is OP
But if you donāt have them itās weak
Better than Chicot still
so it's contextual
lucky cards aren't that hard to achieve though
How do i check for every scored card's chip number
triboulet is useless for a hack run
not all legendaries need to be op all the time
How do i know how much chips a playing card has
yea
I donāt think they need to be OP, but I do think the design of Legendaries doesnāt match how you get them well
Thatās why I prefer Legendaries that change how you play the game
And Iād rather have a Super Rare rarity for stronger effects
thing is this mod also has more ways of getting legendaries :v
there's a rare booster pack that can give you legendaries
base plus bonus
Maybe get chip mod helps
In that case itās turning Legendady into Super Rare
the effect itself shouldn't be too difficult to add as long as you can take ownership of the lucky card center
haven't worked with taking ownership of objects before so i might get a bit lost
i guess, doesn't 100% align with vanilla but it's not really meant to
Itās be like creating an Enhancement but you only need to define the new calculate function
Itās fine Iām just relating it to what I had said
fair
this is how unstable does it for fib for example
same as all other joker additions
Since Legendaries are hard to get, I donāt think they should be āconditionally goodā in the sense that the condition is having the deck be built a certain way
But they should be conditional on playing a certain way
You donāt need this much if you donāt want to change this much
But ye
yeah just gotta change the calc function right
or maybe even just the config
gotta check the vanilla code
ik, it's just a piece of code that i had on me
how would i go about using smods to add a new palette to an existing collab deckskin?
calculate_effect iirc
@clear epoch did you implement Hurdle yet
i mean yeah the screenshot i sent was from the in-game collection
so if i do this i could toggle the cat flag on/off to guarantee lucky hits when the joker is in deck?
I mean you can have the Joker in-game but not the art
How did you increment the Blind size
maybe using find_joker
either that or have the Joker set a global variable
"global"
i'm doing a global var rn, didn't know about find_joker
Yeah I think a find_card would work well
by "global" I mean per run
forgot to explain what the joker did. basically whenever you lose scoring mult (think the flint), the joker gains ten times that amount of chips. (eg: you lose 8 scoring mult, and the joker would gain and give 80 chips)
would be much easier
key = "hurdle",
loc_txt = {
name = "Hurdle",
text = {
"Increases blind size by {C:attention}X#1#{}",
"{C:green}#2# in #3#{} chance to generate a {C:dark_edition}Negative{}",
"{C:attention}Fool{} upon leaving the shop area."
}
},
config = { extra = { increase = 0.2, chance = 2 } },
rarity = 2,
atlas = "Jokers",
pos = { x = 4, y = 0 },
cost = 5,
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.increase + 1, (G.GAME.probabilities.normal or 1), card.ability.extra.chance } }
end,
add_to_deck = function(self, card, from_debuff)
G.GAME.blind.chips = G.GAME.blind.chips * (1+card.ability.extra.increase)
G.GAME.blind.chip_text = number_format(G.GAME.blind.chips)
end,
remove_from_deck = function(self, card, from_debuff)
G.GAME.blind.chips = G.GAME.blind.chips / (1 + card.ability.extra.increase)
G.GAME.blind.chip_text = number_format(G.GAME.blind.chips)
end,
calculate = function(self, card, context)
if context.setting_blind then
G.GAME.blind.chips = G.GAME.blind.chips * (1+card.ability.extra.increase)
G.GAME.blind.chip_text = number_format(G.GAME.blind.chips)
end
if context.ending_shop then
if pseudorandom("hurdle_j") < G.GAME.probabilities.normal / card.ability.extra.chance then
local new_card = create_card("Tarot", G.consumeables, nil,nil, nil, nil, "c_fool", "obs")
new_card:set_edition('e_negative', true)
new_card:add_to_deck()
G.consumeables:emplace(new_card)
end
end
end
}
the code can probably be optimised a bit more
but it does work dynamically(instantly changes the blind size if u sell mid-round)
- I recommend changing the wording to start with "When Blind is selectedā¦" since it doesn't shrink when selling the Joker;
- You can use the same animation I did if you want.
Bunco has a different one
oops I skipped that part
my bad
this might be the first joker i've ever made that has no calculate function
although I think the shrink doesn't quite work unless there's extra code elsewhere
does it win if you shrink under your current score
still getting this error even after making sprites
that's what I meant by "doesn't quite work"
It's unintuitive IMO
but anyways
I think if you can get the benefit and then sell the Joker then it's not much of a Hurdle
i mean its easy to fix, but its to punish not knowing when to sell out of it
you lose out on 1 dollar
I don't think it's punishing. It just looks like a bug
uses a joker slot, and its a 1 in 2 chance only
unless you have a judgement its quite punishing to sell midround
I was gonna say that if it's a random Tarot it could maybe be every hand
It's not punishing to sell mid round
that's a legendary joker level effect
but if you had sold it earlier, you still lose out on the joker slot for the round
I guess a Negative Tarot is still quite good
Not if you sell even earlier
Selling mid-round isn't punishing. Entering the round with it is punishing
Selling is rewarding because the Blind is easier
balatro itself punishes the player by having them waste the joker slots with junk, this is the same design philosophy
what do you mean
rental riff raff
That's not junk
you take it and sell it before the round ends, you didnt lose money, but you won't always take it because of how precious slots are
and there's a big chance it does nothing at all
and I'm just saying that the punishment in your design isn't in selling it, it's in having it as the round starts
How do i remove -1 hand from the player
i don't see how this is dfferent
see burglar
if you had sold it before the round, you could've bought something else. If you sell it during the round, it's easier than keeping it during the round
So at no point selling is punishing
Keeping is punishing
Because you neither buy something else and the Blind is higher
I don't think vanilla has situations in which I'd consider selling a punishment. It's almost always the out for a worse consequence, like the cost of rental at the end of round
I went and looked at some other jokers and added some stuff seems I may have broken it more though š
General lua question, does the # operator for length on tables not work if the keys for the table entries aren't numerical indeces?
what do you mean by "not work"
G.GAME.current_round.hands_left
it doesnt count table entries that do not have numerical indices
they should use ease_hands
G.GAME.round_resets.hands if you want it as a permanent effect
that works too, i never knew that was a function lmao
Shit, okay. Does that also mean it would "miscount" the length of a jagged array. I.E. your table is [1], [3], [5], it would list the length as 5 despite only three entires?
which AFAIK is the intended behaviour, so, like, it works by the definition of the people who made it
I think that would be 1
not 5
not sure
1, 2, 3, and 5 would be 3
i've never seen the field indices matter with the #
@chrome widget also # isn't the array length operator. It's the "last entry" operator, except more like "last sequential integer entry starting from 1".
I think they need to be sequential
hence 1 not 5
but it might be 5 as it's the last (non-sequential) integer entry
point being, for a non-indexed table, I need to get the length manually
@clear epoch anyways both my mod and Bunco have different animations to change the Blind size
learn something new every day
well it's not an array
I'm..... aware? But because every data structure is basically a table, you need to use tables as arrays
i'm fine with just a chip text change
you could construct your own arrays, either using tables or Idk if Lua allows some more basic object
everything is a table its the most basic object
the reason for this question is because G.GAME.hands is not indexed, and I'm just making a simple batch_level function to which black hole would pass that in
Zermelo and Fraenkel:
i don't know if there's a built in function for that, but worst comes to worst you can always loop throught ipairs() and do it the hard way
ĀÆ_(ć)_/ĀÆ
like yeah, I gotta. It's annoying, but w/e
yeah ipairs is indexed pairs
what about SMODS.PokerHands
I didn't know that was a thing until you just told me
How to detact chips from every card played
I pull from vanilla code most of the time
I cant find a joker that does that
see what's the signature for Enhancement calculate functions
same, i found it more helpful to learn the balatro src code than the smods code
forgot to pass the card into the calc function 
Help
There we go, fixed now
this is how hiker does it
i think just setting ability.extra to something negative should work the same way unless it's hardcoded somewhere else
And if I want to do mod compatibility, I can take the functions of other multi-planet objects and feed them to batch_level_up(). Really the only reason I did this is because I have a card that scales mult with planet levels and I didn't want it to give 12 independent +1 messages for each hand, having added a context for hand upgrades
So batch level up exists just to give a single update that says [x] hands were upgraded [y] times so it an say +12
but looking more, it should work just finea
card.ability.extra can be both a number and a table.
Table is just more useful since it allows multiple values
for hiker it's a number so
ĀÆ_(ć)_/ĀÆ
i was just talking about that specific case
@clear epoch do you have more Jokers
yea but i'm currently working on the sticker examples mod
this looks awesome as hell, I'm love
Joe's reference
is that a mf jojo reference
i've started jojo 2 days ago
had you made this joker a little bit faster i would've missed out on the reference
that pixelart's gorgeous
big thanks to Cauthen, he writes a JoJo fan manga and has been a huge help on the project
That looks awesome. Interesting effect too
Show some later when I'm not about to go to sleep
Inherently all three of the equivalent ones block Ecto yeah
And like yeah negative is really good, but is also the least common. So it's a risk to take one of these
why is Foil Perishable
i think poly + eternal and holo + rental would be better
Just where it stands rn. we talke about swapping Foil and Holographic
but it's your call after all
I think Peri + Holo and Eternal + Foil would be better
also, you could try to make it a selectable joker instead of a random one
Foil is the weaker Edition so tying it to Eternal makes sense
because both eternal and perishable are very very distructive
Poly is stronger so either Rental or Perishable works
ultimately Polychrome is with Rental b/c we considered Rental to be the worst of the three IMO
makes sense
wtf...
Rental is super difficult to work around especially early game when even small xmult bonuses are really strong
I like the concepts behind the Spectrals. Very clever
You tell me. I have a Joker designed around it and I hate it the more I look at it
i have a personal vendetta against eternals, i've never ever seen a non eternal acrobat on gold stake š
But yeah we might switch Holo and Foil. It kinda depends on your opinion on Eternal. IMO I think eternal is the sticker I choose the most, whereas I pass up rental and perishable far more often
I think Eternal is the only one that can be an actual upside. So it's the strongest one
So if it's the least risk, then it should probably be given Holo, but also my personal experience with bulds leads me to focus on mult far more than chips a lot of the time, so I end up with a lot of mid-late game build that only get chip bonuses from planets
I.E. a foil bonus is still "strong" to some degree mid-game
But ofc that's anecdotal
I could also just be playing wrong most of the time, it's Balatro š
I think gaining Chips is the weakest effect, and it's weaker mid-game
Late game, I can see the argument towards either Chips or Mult being better; both are outclassed by xMult anyways
How do I even salvage this š
Mmm, yeah
Arguably that makes Ichor the one with the least risk in the late-game too, because if you have decent economy at that point, you're able to circumvent the cost of a guaranteed polychrome
But you gotta get there first
At that point, yeah, probably
But if you don't have editions on some stuff late, it probably won't hurt
just add 2 new editions, problem solved 
cuz honestly neither chips nor mult will ever make the perishable worth
and unless you can target the eternal i'd also never use it
I think Perishable is neutral
It just tells you that you can't keep the Joker long-term
i have no idea why this happens or how to fix it
and that might already be the case
not at all, especially if it is random
i'd never risk my best joker just for 50 chips or 20 mult
We might make em targetable, but I'm not sure. We have another Spectral that does specify the leftmost joker and I'm not really sure why it's the odd one out, except that the ideas were floated by different people
The random does make it more situational
Although this one does inherently make more sense to be targetable anyway
During the demo, we had the most broken seal except since it was random it was garbage
You know it can just target a selected Joker right?
why make it the leftmost one?
Wasn't written by me. The person who made it probably wasn't aware that it would be easier to highlight it
that makes sense
I'm the lead programmer, but not the sole creator of content for the mod
So people sometimes make assumption about what is/is not easy to implement
you could suggest this, just for qol sake
what's the mod about
It's a collaborative mod for the JoJo's Bizarre Fanworks server, which is a hub for JoJo fanfic/fanmanga/fangames. In addition to some baseline canonical JoJo content (courtesy of BarrierTrio, co-creator of Cardsauce that will also feature some JoJo content), most of the content is stuff from various projects made by the server members, including my own
how do i check for a specific joker when retriggering jokers? im trying to make a joker that retriggers retriggers only specific jokers, so i need a way to check that context.other_card == <specific joker> when retriggering
I think JoJo changed my approach to fictional powers/abilities when I found out about it
this is my personal favorite addition so far, which is based on an arc in a fic called Streetlight Pursuit where the characters get trapped in an arcade cabinet (Cabinet Man). Unfinished, ofc
look for the other Joker's key
That's a good song
i have no idea what the fuck im doing in the slightest 
dude this is SICK
i presume thats something like context.other_card == j_joker for example?
or is it context.other_card.key, or something im not sure
that's so insane for a joker mechanic, and feels so in line with jojo. that's rad
how did you even manage to pull this offffff
Instead of checking for count, just put the find_card call in a next() wrapper
I think it's like context.other_card.center.config.key?
https://github.com/nico-abram/LuaNES Courtesy of LuaNES, an emulator by Nico Abram
not sure about the other of center and config or if it's config and not something else
I basically rewrote its main function to instead use the joker as a frontend, and draw the overlay on the screen, + feeding in input from Love2D
And then it checks certain ram locations to gauge whether or not you've win or lost
I knew about the old mod that just put this game into Balatro so I wasn't as surprised ^^'
that's insanely cool
Yeye I got the idea from the Super Mario Bros mod/love2D implementation, and then Keku, from Cardsauce, also attempted to use it for a tetris-playing joker before just saying screw it and writing tetris from scratch since it's not a very difficult game to write anyway
so does this mean that balatro can run doom...
probably,,,,,,,
I remember Donkey Kong
if we tried hard enough
Regardless, it also plays TMNT II: The Arcade Game and Dragon's Lair, but neither of those are finished yet b/c I was busy on other stuff. I'm gonna have to use a hex editor or something to find some decent ram mapping for the latter which I'm not looking forward with but I guess this is my first foray into romhacking now

Bucky when he uses his ult
Bucky?
who's bucky š
(this is a marvel rivals joke)
ah i don't play many shooters
just fortnite because of miku(deadass)
based
a few years ago I was writing down so many Stand ideas
Well if you're interested in throwing stuff around with people, the server's a welcoming place
Otherwise, this mod'll be public when it comes out! Hopefully it'll have a decent amount of canon JoJo content too for people not familiar with the fan stuff. That's just more guided by the Cardsauce team than by me
I did get interested but I've been away from it for a while @_@ maybe I join and lurk idk
š
I'd need to find out how to join
thank you
when I first started Mistigris, i underestimated how hard it would be to develop something like this
i was only able to do it with the help of Aiksi
wait that is so peak
crazy how the free reroll part is x10 easier than the condition itself
Wait, does Bucky have an iconic ult in Marvel Rivals? I don't have an effect yet for the Winter Soldier joker, so I guess a retrigger is a good option š
Yea
oh no the free reroll part was the hardest
especially when it comes to having multiple of this Joker
wha
In Rivals he jumps up into the air and does this big tentacle attack with his arm. He can do it multiple times in a row. The first time it activates he says "ARMED AND DANGEROUS", and all subsequent times he says "AGAIN"
can't you just increase G.GAME.round_resets.shop_rerolls or however that field is called?
After looking at this for a while, I still don't quite understand how this works or how to use it to do what I'm trying to do š
why does bucky have a tentacle arm
SMODS reworked this to be less annoying so nah
I assume it's something related to Hydra actually having some kind of basis as a tentacle monster cult. I'm not familiar enough with it
You call SMODS.change_free_rerolls and pass how many to add/remove
cant get it to work, ive got if context.other_card.config.center_key == G.P_CENTERS.j_blueprint then (im trying to copy blueprint in this) and ive also tried ... == 'j_blueprint', any other ideas maybe
i am reasonably confident its supposed to be config.center.key from searching this channel at least
cool, then it should be even easier. i mostly go off pure source code
The issue is that beforehand you'd have to inject since the code to make it work for Chaos would override any changes you'd make to it.
just use the key itself(aka "j_blueprint"), don't call p_centers
card.config.center.key == yeah
I checked just now
I feel like 'j_blueprint' should work
also yeah it should be center.key not center_key
i presume you mean if context.other_card.config.center_key == 'j_blueprint' though i tried that earlier
yeah thats what i had at first
as I just said
context.other_card.config.center.key == 'j_blueprint'
thats what i have now, doesnt seem to work
ill try debugging a bit maybe its going wrong somewhere else
do you have center.key or center_key
and why does it not work? does it crash or just nothing happens?
Hmm, I guess I'll CA:Winter Soldier a retrigger joker, and see how I can make it fit the flavour of a tentacle arm and jumping up in the air.
center.key
nothing happens
if nothing happens consider putting a SMODS.juice_up_blind() after the if
it might be the code afterwards that is faulty
not the if itself
currently checking for smth like that
oh if you're doing joker retriggers you should probably send over the whole code block since that's a SMODS only feature
and unless you've enabled it as an optional feature it won't work
i've had a similar issue before as well
ive done that already it can retrigger jokers fine
its just trying to tell it which ones im struggling at
ill send my calculate though
if context.retrigger_joker_check and not context.retrigger_joker and context.other_card ~= card then --if triggering another joker
if context.other_card.config.center.key == 'j_blueprint' or context.other_card.config.center.key == 'j_brainstorm' then --if it's a blueprint/brainstorm
if card.ability.extra.retriggers < 1 then card.ability.extra.retriggers = 1
return {
message = localize('k_again_ex'),
repetitions = card.ability.extra.retriggers, --retrigger it
card = card,
}
end
end
end
end```
previously i just had it retrigger any joker but itself but im reworking it a bit now into just blueprints/brainstorms but it never seems to actually pass a check for them
I might be stupid but all of a sudden everything that uses a hand level in my code stopped working, was .level changed in the latest SMODS update ?
For the sake of example : mult = G.GAME.hands[G.GAME.last_hand_played].level, this used to work, now it doesn't
in theory this should not depend on SMODS, it's vanilla code chunks
check something else that might've broken
hmm now that I think about it, can something like Talisman break things up ?
I installed it recently to add x_chips to a joker I created
but that's the only thing I can think of
how can i make a joker that gives money depending on specific cards you play (like golden ticket or rough gem)
this is for a joker im working on that has buffed gemstone joker abilities
how can I make card_eval_status_text happen right when the function is called? is that possible?
The joker I'm making has an event triggering outsinde the normal contexts, but when I call the function it's waiting till whatever context is put in. to display the text
is there a context that means "now"
yup, disabled it, now the problem is gone
if context.individual and cardarea = G.play then
if --- check for suit/enhancement --- then
return {
dollars = ...
card = context.other_card
}
end
end
ok ive figured it out, i just removed the if check after the blueprint/brainstorm check and it works perfectly
idk how that ended up broken but at least i caught it
thanks for the help ^^
something along those lines
ohhh! i've just been doing card = card, that might be why it isnt working
what's context.individual
used for effect on each playing cards individually
ah
a return in this context is used directly on the playing card, baron does that
does anyone know what I can do for this
fixed it I think, adding :to_number() at the end seems to work
ohhhhh i think ik why
u used card.ability.... not other_card
so that bit of code messed up
cuz it was checking for repetitions on the actual joker not blueprints
oooh that figures doesnt it
rip
nvm, the issue was that i used money = card.ability.extra.money instead of dollars = card.ability.extra.money
ah well glad it works XD
yep, all card = card would do wrong would be that the money from of the joker not the cards
made the same mistake in the beginning too
one more question though if i may, how do i get the "Again!" message to actually appear on this joker?
both card = card and card = self put it on the joker being retriggered (or on a card triggering the joker effect like arrowhead)
card = context.other_card
literally the same thing
no change
this joker (the one that causes the retrigger) isnt even juicing actually
for reference my return{} is currently
repetitions = card.ability.extra.retriggers, --retrigger it
card = context.other_card,```
it might be due to how the retrigger contexts work
your code works during the joker retrigger check phase
hm you might be right
for retrigger jokers being copied it does kinda work as one would expect
maybe itll just be like that
not the actual retriggers
i think the retrigger phase happens once for all jokers then the retriggers happen equal to number of repetitions to each individual joker
as opposed to card repetitions which they all are seperate from one another at all times
so is this not a thing that exists
I'm digging around source code and I just can't find anything
Anyone know if there's an easy way to force a single or group of custom boss blinds to appear for each ante, Ignoring the default boss blinds. or removing the defaults from the pool?
I know the Balatro Multiplayer mod does this, but scrubbing through their code I can't seem to find out how. š
don't know about forcing blinds but if you want to ban a blind you can do G.GAME.banned_keys["bl_psychic"] = true (replace psychic with any boss key)
at this point, I think it would have been faster for me to implement the blind effects manually..
if there was any way to like create your own context or something
that would be valuable
SMODS.calculate_context({context_name = true})
make a lovely patch or a hook
wait so I can't just use that in the mod main lua?
you can, you'd just have to make a hook
how do I do that
essentially my goal is to have
card_eval_status_text(<custom context here>)
This is more than helpful! Gives me some other ideas as well! Thank you! ā¤ļø
you're welcome
remember that it works with any key not just bosses
sorry if this is a bloody stupid but the smart one in this project is currently out and i cannot for the life of me figure out why it eats a card when it doesn't trigger
calculate = function(self, card, context)
local destroyed_cards = {}
if context.cardarea == G.play and #context.full_hand == 1 and context.full_hand[1]:get_id() == 6 then
if pseudorandom('roulette') < G.GAME.probabilities.normal / card.ability.extra.odds then
for i = #context.scoring_hand, 1, -1 do
destroyed_cards[#destroyed_cards + 1] = context.scoring_hand
end
return {
message = "BANG!",
--repetitions = 5,
card = card,
}
else
return {
message = "click...",
card = card,
}
end
end
end,
how can i get jokers from game values? Like a table for them
I'm still just trying to figure out the thing I was on 3 hours ago
is there a list of code for the descriptions of jokers? for changing text color/showing stats/showing current accumulated stat
This is off the top of my head but If you want the table of jokers you currently have on hand it's G.jokers.cards
I might just have to give up on my joker having ui when it upgrades

i literally just want it to trigger card_eval_status_text when I call the function rather than it waiting on a context and it's extremely frustrating that I can't find any way to just do that easily
That's for the jokers in the players card area, I'm looking for all of the jokers like where collection stores them.
no thats the other guy
perman't
perman
does anyone know if theres a place to ask things relating to Lovely injector specifically? im trying to figure out something relating to patching
here
but yeah, #š»ć»modding-dev is to ask everything relating to dev
this works for me
G.E_MANAGER:add_event(Event({
func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_upgrade_ex')}); return true
end}))
change self for what the card is
- is it only possible to load patches from the mods directory
- how does the mod loading order of steamodded work? is it random or is there any way for a mod to influence its own ordering
tldr im trying to figure out how a balatro modpack and save instance manager akin to something like modded minecraft's prism launcher and i theoretically know how a love2d game's save/mods directory can be switched but im not sure how id actually execute that
you can change the priority in the metadata.json
Lovely patches need to be in a lovely.toml file in your mod's top level folder or inside a lovely folder if that's what you mean in the first question
hmm okay rip thats what i was worried about
like tbh im not even sure if a mod could execute this because if it has to be in the mods directory then at that point it might already be too late in the mod loading process
like the first mod loaded by steamodded then switching the mods directory seems unsafe at worst or ineffective at best depending on if it stores that directory to reference beforehand
i see development has resumed indeed
the best thing might be using .lovelyignore like smods does to disable mods depending on the profile
the chaos never ends
š¤ interesting, where can i find more information about .lovelyignore? or where does smods do this as an example
that's still got a bunch of delay
it is done from the mods menu :)
like it's waiting till the joker is triggered again
i think that might be a problem with your code
mine triggers instantly, I hooked into card:highlight to make it display the msg every time i click it
if not context.blueprint then
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].ability.perishable then
if G.jokers.cards[i].ability.perish_tally == 0 then
G.jokers.cards[i].ability.perish_tally = -1
G.E_MANAGER:add_event(Event({
blocking = false,
delay = 0.25,
blockable = false,
func = function()
play_sound('tarot1')
card:juice_up(0.3, 0.4)
card.ability.extra.x_mult = card.ability.extra.x_mult + card.ability.extra.x_mult_gain
card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_xmult',vars={card.ability.extra.x_mult}}, colour = G.C.RED})
return true;
end
}))
end
end
end
end```
hmm wait, can mods be toggled with steamodded per balatro profile?
It's supposed to triggere whenever another card perishes
and it does, everything but the card_eval_status_text. the sound, juice_up, and ability effect trigger when it happens
no afaik
ohhhh yeah calculate is only called on context
either make your own or make a hook somewhere to trigger it instantly
homestuck reference spotted
is there a list of code for the descriptions of jokers? for changing text color/showing stats/showing current accumulated stat
this includes summing up all the base chips of all the cards
why does everything else trigger when it's supposed to?
this explains it https://github.com/Steamodded/examples/blob/d43316d97bc927f3de431dd84c0283d41e69761a/Mods/ExampleJokersMod/ModdedVanilla.lua#L37
its funny to see how common homestuck references have seemed in balatro mods lol. it hasnt been a lot but definitely an above average amount
i can only guess the card aesthetics lured people in lol
i got into homestuck from balatro
oh nice
its not complete til i have triple the basegame's joker count
true
stupid question but have you tried removing the delay
its delaying so much because it's triggering on EVERY CONTEXT
yeah also
yeah
couldn't find a context that would just trigger it when a perishable joker perishes so I just have it running constantly.
have you tried printing the context when it triggers to see which one it is
is that just print(context)?
print(inspect(context))
okay nice found where the ui writes this and where mod loading reads it https://github.com/Steamodded/smods/blob/main/src/ui.lua#L920, https://github.com/Steamodded/smods/blob/main/src/loader.lua#L243. this seems like a pretty good reference point for understanding how the loading is being done.
you could try to integrate that directly into smods honestly
it's probably being called in context.end_of_round now that I see it
or maybe not but something just before that
i thought about writing a feature request or something just to have stuff about the idea written down somewhere that other devs could maybe think about but tbh i have been a bit stuck on knowing if smods could even do what im trying to do. although i guess it could maybe if it made configuration per profile aand then made it so switching profiles reloaded all mods but idk yet if that kind of thing is easier said than done
the point is that you need to make your own context
I tried for like an hour
hmm okay for more clarification is priority handling a thing in steamodded only or can direct lovely mods also have some priority ordering to them or is it mostly just dependent on where youre patching into in the order of code execution
(like having to patch somewhere earlier in balatro's initialization or something for example)
lovely patches can have priorities
oh i see, im blind lol
guess thats not surprising it makes sense for a patch system to have that
local card_calculate_perishable_ref = Card.calculate_perishable
function Card:calculate_perishable()
card_calculate_perishable_ref(self)
SMODS.calculate_context({card_perished = true, card = self})
end
try that
I'm confused how #1# and #2# are set in config, is it just the order of things in config or is there something I'm missing? also thank you!
where would I put that?
in the function or somewhere else
its the order of values returned from loc_vars
somewhere outside in your main code
then use context.card_perished
if context.card_perished and not context.blueprint then
yeah I did that and it just did the same thing as here
where it doesn't trigger the text when the mult is being added, it waits
I deleted the delay as well
still does it
weird, let me check
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].ability.perishable then
if G.jokers.cards[i].ability.perish_tally == 0 then
print(inspect(context))
G.jokers.cards[i].ability.perish_tally = -1
G.E_MANAGER:add_event(Event({
blocking = false,
blockable = false,
func = function()
play_sound('tarot1')
card:juice_up(0.3, 0.4)
card.ability.extra.x_mult = card.ability.extra.x_mult + card.ability.extra.x_mult_gain
card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_xmult',vars={card.ability.extra.x_mult}}, colour = G.C.RED})
return true;
end
}))
end
end
end
end```
ok so for example
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.mult_gain, card.ability.extra.mult } }
end,
mult_gain would be #1# now and mult would be #2#,and I'm guessing more values can be added after to?
sorry for the noob questions š thank you all
yes
thank you!
just realized that I forgot to check the perish tally but that's probably not the problem
well yeah it also works the same if I do end_of_round
Everything except the display for the upgrade is working as I want.
For some reason that's lagging behind significantly no matter what I do.
I might just remove the 'cards drawn facedown' effects from the pool instead of figuring out how to make this work
if not G.GAME.blind.disabled then
return G.GAME.blank_obj:stay_flipped(area, card)
end
end,```
works for me
how can i make it so certain jokers dont appear in the shop? similar to how legendaries dont appear in the shop
what's different?
in_pool = function()
return false
end,```
tyty
can you send the code as text so I can copy paste and see if that works
local card_calculate_perishable_ref = Card.calculate_perishable
function Card:calculate_perishable()
local prev_tally = self.ability.perish_tally
card_calculate_perishable_ref(self)
if prev_tally == 1 then
SMODS.calculate_context({ card_perished = true, card = self })
end
end
-- in calculate
if context.card_perished then
return {
message = localize("k_upgrade_ex")
}
end
WE LOVE NAMING HOOKS AFTER THE FUNCTIONS
WHAT is that notation
snake_camelCase
i reserve the Case for putting in the "ref" part of the local
because they're unique compared to others
no the colon type notation??? ive never seen that in lua in my life
this is in my .luarc
It's just a type hint display, the text isn't actually there.
oh... kay.....
i thought regular lua didnt support those
weird
maybe ive been doing it wr
oh wait
u said tyhe text isnt there
š
the text isn't actually there haha
yeah oops LOOL
Well it's working. I guess this is one of those "if it works then just don't think about it" moments
Cause I already spent enough time thinking about this lol
Will doing something like this count the number of scored cards in a hand?
should do!
Oh my yay
try it out and see what happens
I now have The Blank "working"*
- could not get the card-flipping blind effects to be compatible
- it still breaks if you exit in the middle of it, reload, and try to play a hand. It fixes itself if you do this, and then use a consumable or sell a card, which apparently retriggers the blind
I don't know what about selling or using a consumable re-enables the blind effect
maybe it's some sort of context update
if context.selling_card then
if card.key == self.key then
G.GAME.current_round.indomitable_currentMult = 0.7
G.GAME.current_round.indomitable_increment = 0.15
end
end ```
I did this to try and reset the counters on my joker when the card is sold but that didn't seem to do it, what is the better way to identify if the card being sold is my card?
if context.selling_self
derp
card.key doesn't exist
I entirely missed selling_self when going through the list
maybe if I can figure out where it sets the blind from on load save, I can add a check to see if it is The Blank, and then trigger the secondary blind effect? š¤
isn't it just blind:load
is there a command for debug/debugplus to just add a certain joker?
go to the collection and press 3 over the joker
thank you!
https://github.com/unkwntech/indomitablemod
My first mod is officially live!
Thanks for the help
i'm trying to very briefly change the y value in a the soul_pos of a joker i'm working on for a fun little visual effect - in the calculate function, is changing card.config.center.soul_pos.y correct?
GG !
Would G.Game.blind.boss.name give me the name of the current boss blind?
hello all. im having some difficulty getting the modding API to work at all. im trying to understand the guide, but i think i need someone to walk me through while im doing it. i have the balatro mod manager installed, but i cant get steammodded moved to the right place or the right file where it needs to be
This aint really a support channel, but you need to place steamodded in %appdata%/Roaming/Balatro/Mods
if the property actually exists, then yes
But i dont think .boss exists
whats the context for a opening a booster like this? ``` if context.booster_open then
-- add mult
end
thx
BMM should be able to install Steamodded for you. Like luma said, it should be located in %AppData%/Balatro/Mods
like
calculate = function(self, card, context)
...
card.config.center.soul_pos.y = 2
delay(0.5)
card.config.center.soul_pos.y = 1
do i need to do something like force a redraw of the joker, or... 
...maybe card:set_sprites(card.config.center)?
this was right - i had to do it by adding event manager events:
G.E_MANAGER:add_event(Event({
trigger = 'immediate',
delay = 0.01,
blocking = false,
func = function()
card.config.center.soul_pos.y = 2
card:set_sprites(card.config.center)
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.3,
blocking = false,
func = function()
card.config.center.soul_pos.y = 1
card:set_sprites(card.config.center)
return true
end}))
return true
end}))
What is the context for "taking a joker from a booster pack"?
if im making a basic lovely patch on its own do I just need ModFolder/lovely/patchname.toml?
without steamodded
yes
hmm okay whats the best way to verify whether a patch is being loaded or not
check lovely/dump and find your code
hmm im getting neither so i guess that answers that question
i should probably test this in a regular setup first before moving it over to my jank wip modpack setup
Not sure why this is happening. I got a similar error to this before when i was missing the info_queue parameter in loc_vars, however this seems to be a different reason.
... fsr the images arent uploading
key = "mediocre_settlement",
atlas = "mediocre_settlement",
rarity = 1,
cost = 2,
unlocked = true,
discovered = true,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = true,
config = { extra = { mult = 4 } },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.mult } }
end,
in_pool = function(self)
return true
-- return G.LOBBY.code and G.LOBBY.config.multiplayer_jokers
end,
calculate = function(self, card, context)
if not self.debuff then
if context.other_joker then
if context.other_joker.config.center.rarity == 1 and self ~= context.other_joker then
G.E_MANAGER:add_event(Event({
func = function()
context.other_joker:juice_up(0.5, 0.5)
return true
end
}))
return {
mult_mod = card.ability.extra.mult,
message = localize { type = 'variable', key = 'a_mult', vars = { card.ability.extra.mult } }
}
end
end
end
end
and the error message was INFO - [G] 2025-02-28 11:31:42 :: ERROR :: StackTrace :: Oops! The game crashed [SMODS ChipOverflow "ChipOverflow.lua"]:86: attempt to index field 'extra' (a nil value)
(line 86 is return { vars = { card.ability.extra.mult } } if thats helpful)
make sure to start a new run
Also two things, self is not a card, it's the center of the card, and you don't need to check if your own joker is debuffed
calculate won't be called if it's debuffed
hmm okay i can confirm my patch works so i guess its an issue with how im trying to get lovely to detect the custom mod directory so far, darn. i think im gonna try forking lovely to get its logging to match the mod-dir location to actually verify its recognizing the directory
question, if I have two mod metadatas in one folder would i be able to have two mods or would it break
I would like to make two separate versions of a mod, one only containing balanced content and one containing unbalanced content
wait I could probably just make that a config nvrm
yeah I was gonna suggest that
also is it possible to change the mod badge per object?
maybe using this
did some more work, got some progress and now i'm onto ranks. i see that this is for one specific ranks but how would i go about making it multiple ranks?
is it not possible to combine {s:#} and {C:inactive}?
yes that would work
i think it's just { value = '2' }, { value = 'J' }, etc
ill try that
yes
just put them in the same {} separated by comma
just read it again, this is probably not true lol
ok to be fair i should clarify it is possible because yes is a vague answer
-# omg hoshino ai
good thing i stopped
okay this actually helped me exactly how i was hoping, it let me know i was specifying the mods-dir to the wrong location (GamePath as opposed to GamePath/Mods as it shouldve been). i now have a basic test that successfully sets up a modpack instance directory separate from the default balatro directory and loads it
...... now i have to do the hard part of making a functional UI
from what I'm reading you need a debuff_card function
Aikoyorinsanity
also how do i get different blind sprites to work properly, when i tried it combined the two example sprites into one instead of making it separate
damn i made three consumables today (they had similar effects)
5 of them are sinful jokers lmao
with placeholder art and possibly placeholder names lmao
oh yeah btw i was meaning to ask you
ohno
do you know how rarities work for like consumables?
you have to have a consumabletype set up with rarities
Oddity api in AMM has an implementation of this
i did that part and added rarity to each of my battle cards but it seems to only generate the default consumable (which is a one up since that was the first one i made)
really? is there a github i can follow so i can see how they did it?
oh wait you can do that for individual consumables?
they do have that if you look at their forum post https://discord.com/channels/1116389027176787968/1331462654732144721
AMM also has perma mult/xchips/xmult/hchips/hmult/hxchips/hxmult, suit levels, graveyard, aspect card layer, bottles, joker stamps, subtitles on card names
having an odd issue. this joker calculate function loops over all ranks, and subtracts 0.5 xmult from itself for every unique rank. I have an identical setup for suits that works perfectly, but this doesn't. basically for every rank, it loops over the scoring hand and, if it finds that rank, breaks from the inner loop and moves on to the next suit (after subtracting the xmult)
the first two prints fire correctly- but even if it prints 'Found: 8' and 'Looking for: 8', it'll still never pass the check to make sure they're equal
are you comparing a string and a number
oh wait i see what you mean, but maybe i could make it so shop rate scales with rarity š¤
ahh okay
does anyone know a good way to destory suits for a joker effect? I tried to play with the "paranoia" code from paperback but it seems a lot of paperback relies on the altas from that
on my way to attempt to understand the entire G.FUNCS.evaluate_play in order to make one singular boss blind effect work
would you want it to be like destroy all of the cards of that suit in the deck or in the hand? cause those are two different things
hand or played, also thank you for replying!
i've literally done something like this before, lmao. Here's an example of the code I used (you don't have to do this word for word, just an example)
if context.destroying_card and context.cardarea == G.play and not context.blueprint then
local not_heart = false
for i = 1, #context.full_hand do
if not context.full_hand[i]:is_suit(card.ability.extra.suit) then
not_heart = true
break
end
end
if not_heart then
return context.destroying_card:is_suit(card.ability.extra.suit)
end
end
you can do something similar for cards held in hand by replacing G.play with G.hand, though you'd also have to switch context.full_hand for G.hand.cards i think
can we take it ?
(begging)
(though destroying_card also functions like context.individual so you can also just target one card destroy_card and test if that care is of the suit)
thank you so much! I'm guessing this would destroy all non-hearts so I would just need to switch that around to fit my needs?
Would hand_name = context.poker_hands, card.ability.extra.ellie_mult = card.abilitiy.extra.ellie_mult + G.GAME.hands[hand_name].level add the current hand level to the mult modifier?
actually, it tests for if there is a card that isn't a heart in the hand and then destroys every heart card in the hand if that is the case, really the code can be simplified down to
if context.destroying_card and context.cardarea == G.play and not context.blueprint then
return context.destroying_card:is_suit(card.ability.extra.suit)
end
oh ok! thank you š I'll play around with it!
np!
I'm not sure what the 'unexpected symbol' is here
it's the comma after poker_hands
doesn't work. it only does the first one in the {} before the comma and ignores everything else
{s:0.9,C:inactive}
Okay, so hand_name = context.poker_hands doesn't seem to work. Is there a better way to go about getting the int value of the current hand level?
ahhhh no space, thanks 
-# # -# omg miku
you need context.scoring_name
i have a custom suit that i've removed from the pools for initial decks, but that removes it from the randomizer pool for erratic deck too. is there a way I can make erratic deck still start with 52 cards but have my suit be in the random suit pool?
I think I might be messing up somewhere, I'm still pretty new (just started today) the joker loads in fine but when it activates it crashes
the syntax is very incorrect, what are you trying to do?
oh? and destroy clubs and spades either held in hand or played when a hand is played
in your return lines, you should just have
return context.destroying_card:is_suit("Spades") or context.destroying_card:is_suit("Clubs")
