#💻・modding-dev
1 messages · Page 37 of 1
Aaah okay that's a bit safer then
except people are dumb most of the time
Still would prefer Discord didn't allow them at all, but as long as they show the real link before loading any of the page they're at least making an effort I guess
oh shoot i need to patch my mod
They should allow markdown links but not to spoof links
Check if it looks like a link with regex or something
maybe i should put all the badge colors into G.C...
Guys is it ease_joker_slot or ease_joker_slots?
Negative Joker
I think you just change the number of joker slots manually
i can't find it in your source code
Epic Jokers.lua
hello, sorry if this has been asked before, is there any resources or documentation for developing the mods? im having trouble understanding the example mods
don't look at example mods, most of them aren't updated
look at Lua documentation for how the language works, and the source code for Balatro and other mods to know how a mod works
where can i find balatro source code?
you can unzip the exe file
then do 7zip --> open archive
thanks! i'll check it out
do i just remove ease_joker_slots
ok
final product
this is my yellow deck joker suggested by denver
Imma sleep
Is this an issue :: WARN :: DefaultLogger :: Duplicate Mod prefix joke used by JokerSellValue, JokerDisplay
Because my game is not loading JokerSellValue in-game and I can't figure out why. But Lovely is acknowledging its presence in the terminal
Do you have a defined mod prefix?
If you don't it'll use the default which would match with JokerDisplay (if it also uses default).
My mod doesn't add any content that would use a prefix though
Steamodded still checks anyways.
That wouldn't be the issue of strictly not loading my mod in-game, would it?
That's what happens when a mod triggers this type of error.
How do I implement my own prefix?
--- PREFIX: asdf Add this to the main mod file header
That fixed it. Thanks!
I think this might be worse
Is that Monika
Just monika
she just a goofy goober
She’s a goofy goober, yeah
another fluorescent iteration
wait are chips usable like self_ability_mult
found out that it's called self_ability_extra
Lol no thats just the config
Used to change the values in jokers at a glance
But yeah it does the same thing
as chips
Well im pretty sure the game uses self.ability.chips
Also why are you putting underscores instead of periods
betmma told me to
Even if it doesnt you still just, yk, can
Or you could make extra = {chips = value}
When you use underscores the game thinks its one parge variable
ok
Periods indicate that its a series of variables inside each other
Also im pretty sure using self.ability is weird in steammodded, you could hse self.config or card.ability
You are approaching this completely wrong
First, learn lua, that is not how in pairs works
Second, just use campfire context in the calculate function so you dont need to hook
Oh also you are saving a variable to uhhhh absolutely nothing whatsoever
yellow_deck_joker has not been declared at all in the code so jokers becomes nil (the absence of any meaningful value, different from 0 or false)
i seriously can't with this
I gave him the literal lua book https://www.lua.org/pil/contents.html#P1
i read that
Im not sure he has read any of it
Ok what is a boolean
That was the sixth page
based
fine you want me to read ill read
Ok
and take notes
Great idea actually
how far into the book should i go
so far i am at chapter 2
Right now, chapter 5
ok
it happened again
I just copied the load line and changed it to load the Zorro file, and put 01_Zorro.lua in the jokers folder
if I delete the load line from main file, the game loads perfectly
line 202 is load(NFS.read(SMODS.current_mod.path .. 'jokers/01_Zorro.lua'))() just after -- JOKERS
is your Zorro file the same as your others?
also missing curly bracket on config
missing end in your calculate function
I read chapter 5
why did my code trigger 12 times
G.E_MANAGER:add_event(Event({
func = function()
local card = create_card('Joker', G.jokers, nil, nil, nil, nil, 'j_madness')
card:add_to_deck()
card:set_edition({
negative = true
})
card:set_eternal(true)
G.jokers:emplace(card)
return true; end}))
G.E_MANAGER:add_event(Event({
func = function()
local card = create_card('Joker', G.jokers, nil, nil, nil, nil, 'j_riff_raff')
card:add_to_deck()
card:set_edition({
negative = true
})
card:set_eternal(true)
G.jokers:emplace(card)
return true; end}))```
(the if self.effect.config.deck_insanity then does end but it's after this part of the code)
and it decided to now work fine?
i made it log when the functions were called and the "This is an info message" message doesn't exist in the code
sendInfoMessage("deck_insanity function called", "InfoLogger")
G.E_MANAGER:add_event(Event({
func = function()
local card = create_card('Joker', G.jokers, nil, nil, nil, nil, 'j_madness')
card:add_to_deck()
card:set_edition({
negative = true
})
card:set_eternal(true)
G.jokers:emplace(card)
return true; end}))
G.E_MANAGER:add_event(Event({
func = function()
local card = create_card('Joker', G.jokers, nil, nil, nil, nil, 'j_riff_raff')
sendInfoMessage("Card Created!", "InfoLogger")
card:add_to_deck()
card:set_edition({
negative = true
})
card:set_eternal(true)
G.jokers:emplace(card)
return true; end}))```
it's a thing that's either true or false
I need to get better notes of that
Its the label for the data in the table
When constructing a table, its the first part, {index = value}
alright
How do you do concatenation?
a = hello
bascially the ..
Oh ok
if x > 2 then
y = 5
else
if x > 1 then
y = 2
end
end
How would you make this with only 1 end?
i need better notes of that
Its contained inside the book
Maybe try visiting the page for the things that are making the ends neccesary
Well im glad you know lua a bit more
Maybe you might be able to figure out why your syntax isnt correct
I would reccomend you try looking at the game code again with your new knowledge
You might understand a lot more
???
The crash reports?
Or is it the debug messages
Those are on the lovely command screen that pops up
it doesn't work for me
What isn't working?
debug
Debug mode?
ye
Is there an fps counter in the top right?
Oh
I thought 1.0 enabled debug mode by default, but if not, I know debug plus works on it as well
do i just download the source code
Yeah and stick it in the mod folder
Try holding tab
nope
What's the folder for debug plus look like?
DebugPlus-Master
Make sure it's only one level
now it has one level
now it works
back to work
could rocket be a good base for the yellow deck joker
Yup
What are you using it in?
Ok the big joker table doesnt have a curly bracket
And you have an unnecessary comma
You should maybe try to pull your ease dollars code from a joker that gives money directly
like golden
Yup those are your issues
You need a little more critical thinking with finding syntax errors
The crash log gives the exact line that the error is occuring in
So you should just double check everything around there
it says 115
You didnt give me the line numbers
ah
Yeah
Instead of asking us the instant something goes wrong
Look at the line number on the crash log
I also see a few issues with it's effect in general
what is it supposed to do in the first place
Give 12 dollars when boss blind is defeated
Oh i kinda realized
That needs to have the blind defeated context
i saw it
yeah you don't need line 115 in that case
that would make it scale by +12
plus ease_dollars was hardcoded so it won't even do anything lmao
Try to steal code smartly
Dont just completely take an entire jokers code, take only the pieces that are relevant
okay
Isn't there a payout api for this?
calc_dollar_bonus iirc
Does anyone have an example for modifying an existing joker? None of the examples modify existing and I can modify the calculate code I can’t manage to change the description for a card
For Steamodded 1.0 or 0.9.8?
Working on 0.9.8 but either would be helpful
for 0.9.8, you need SMODS.Joker:take_ownership('joker'):register(), then modify whatever you need inside SMODS.Jokers['j_joker'], where j_joker is the key of whatever joker you're trying to modify
to change the description, you can set a loc_txt on it
it's slightly different for 1.0, you don't need the register call, and whatever changes you need on the joker go directly in the call as a second argument
SMODS.Joker:take_ownership('joker', {
loc_txt = {
-- description text goes here
}
})
Tysm I was so confused why I was able to modify the code but not the description but that makes sense
for 0.9.8 only, you can also change the description text directly via G.localization.descriptions.Joker.j_joker
that's thunk wonkiness
G.GAME.blind.boss is converted to a boolean for some reason
you need the config object instead
that is G.GAME.blind.config.blind.boss
so put config.blind
How do I test if the round's current Boss is a Showdown Boss?
I thought the value of G.GAME.round_resets.blind_choices.Boss.showdown would tell but it didn't
is there a thing called G.C.MONEY?
what does this mean?
I know its a syntax error
but still
Probably your ide thinks the variable G is not defined
just during the Boss blind or for this ante?
G is table that contains the table C that contains some value YELLOW that corresponds to a color defined by thunk or yourself
For the ante
I want to reroll if it's not a Showdown Boss
G.GAME.round_resets.blind_choices.Boss.config.boss.showdown, probably
if I know anything about blind choices having a config which is the proto blind object
but I was just going to bed and won't bother confirming
bruh but what makes
I thought it would've been Boss.showdown because the return of get_new_boss() is stored there, which I thought would've been an object with that attribute
probably G.C.YELLOW doesn't exist
how can i make it exist?
I don't think blind choices work like that
wait maybe it's Boss.boss.showdown
You need a curly bracket after yellow
But also
Your return is broken
What do you mean?
also neither of ours worked
how so
dollars
saying that money isn't thing
makes that true
no, like, you're just making up variable names randomly
the code can't read your mind
oh
you have to give it precise instructions
if you ask it to do something using something you haven't told it, it will break
if you give it instructions formatted in a different way to what it expects, it will break
the colour isn't the main problem
the _mod
the _mod, the money, the brackets, the return
almost everything else
the colour is fine
brb
@frosty dock No config. It turns out G.GAME.round_resets.blind_choices.Boss is just a string and one needs to use that string as the key to G.P_BLINDS to manually retrieve the data
how could i make the _mod
look at how the game already does similar effects
I mean, it won't complain at you using money_mod, it just won't do anything
New Joker:
Champion's Belt
X2.5 Mult
Bosses are harder!
wait is the message even needed?
why don't you try and figure it out yourself?
New Joker:
Lvl. ? Death
X3 Mult if level of played hand is a multiple of 3
@solemn coral's Joker reminded me of DotA 2's Doom's old ability which was a reference to a Final Fantasy ability
I'm sure these jokers are great but none of your videos load for me
newest steamodded alpha does this on startup, it worked with the version from like a couple weeks ago, is there any quick fix? (btw whats happening is that the main file tries to load a different file in the mod directory with require)
Skill issue
But sometimes I also have Discord video loading issues
especially on mobile
I'm pretty sure require needs to be replaced with NFS.load
hm i guess thats new
thx for the answer tho, ill try it out
yup that fixed it
thanks a lot!
Wasn't even thinking of that when I made the joker, but I love the reference!
Funnily enough, TWEWY has a reference to that same ability with Minamimoto's Level i Flare, which hits all targets whose levels are divisible by i (which would be any number real or imaginary)
When I'm in a field and I try to divide by a nonzero number:
I thought the requirement of being level 2 was interesting though difficult, which quickly led me to think about Doom's old ability
Yeah I'm debating about changing my requirement to any level 2 or greater instead of exactly 2
Still different enough from your idea that I'd enjoy playing with both!
I think 2 or greater makes it too easy. Well, maybe not too easy, but less interesting. I think making it a multiple is a good middle ground. I don't know what I would advise you—if you think 2 is too hard, 2 or greater is fine
Multiple of 2 feels too similar to your idea. Maybe keep it at exactly 2, but scale it up to x2.5 Mult?
I mean I don’t mind it being similar if that’s what’s bothering you
Nah, I just want to jokers that force you to approach them in different ways
I think that making it exactly 2 is more interesting if you can reduce levels
For example
Anther Joker idea which I have to port to 1.0.0 grants 2 levels to a random hand and -1 level to another random hand
(IIRC Bidoof gets Moody)
Oooh, good idea about reducing levels. I'll try to throw in a joker or two that does that in my mod
Localization options: English, Portuguese, and French!
Is there a way to use the create_card(_type, area, legendary, _rarity, skip_materialize, soulable, forced_key, key_append) to create a playing card of a specific rank, but still with a random suit?
If not, is there a way to make one with a specific rank and suit, and I'll just manually randomize the suit?
Yes
Do what the Numbers Spectral does but for ranks
I mean, the suits are already random, so actually
Just copy Grim
Oh duh why didn't I think of looking there
Balatro modders when they want to mod: “wait that’s already in-game”
It’s me I’m Balatro modders
Luckily I didn’t fall to that trap earlier today when I noticed I didn’t need to inject into the boss reroll function to make it free
Has anyone else had an issue where lovely patches would keep being active even when they shouldn't?
how so?
I wrote some lines in a patch, tested them and found they didn't work, deleted those lines (but not the whole patch), and when I'm reloading the game it's still giving me that error
did you save the patch??
Yes, it says it's all saved
weird
Okay, it's working for some definition of working
Blinds are starting to get on my nerves.
I'm trying to make a joker that sets all cards in Standard Packs to your last played high card value, and I think something went wrong.
How are you creating the effect?
pattern = '''card = create_card((pseudorandom(pseudoseed('stdset'..G.GAME.round_resets.ante)) > 0.6) and "Enhanced" or "Base", G.pack_cards, nil, nil, nil, true, nil, 'sta')'''
position = "at"
payload = '''
if G.GAME.twewy_playmate_beam > 0 then
_suit = pseudorandom_element({'S','H','D','C'}, pseudoseed('playmate'))
card = create_playing_card({
front = G.P_CARDS[_suit..'_'..6],
center = G.P_CENTERS.c_base}, G.pack_cards, nil, nil, nil)
else
card = create_card((pseudorandom(pseudoseed('stdset'..G.GAME.round_resets.ante)) > 0.6) and "Enhanced" or "Base", G.pack_cards, nil, nil, nil, true, nil, 'sta')
end
'''```
(Right now it only creates 6s, I'll get it to read the actual value soon)
add the super thing to your process_loc_txt
Super thing? The 'k_na'?
That's in my en-us.lua file.
Also loaded with the same key in D6 Jokers so even if it failed it should show up anyways.
Uhm
Is there a issue with this on Steamodded yet?
This should probably be addressed xdd.
not that i'm aware of
hey myst
LMFAO
can you help me with something that is currently outside my current skills in lua programming
just. say what your issue is.
Card is capitalized, it should be card
post your entire code around line 29
so remove the name?
You remove the if statement that checks for the name
Everyone- don't use self.super, it's actually wrong. use the explicit name of the class
self.super is the superclass of self, which could be a deep subclass of your object's class
chat how do i check rarity of cards
i thought it was this but it aint doing anything when i have a rare card
even taking out ability dont do it
Have you tried the card's center?
That should have the rarity.
G.jokers.cards[i].config.center.rarity
.
ohh ok i can try that
that makes more sense
it didnt 
im using steamodded 0.9.8 btw idk if its different on that
Are you sure it's that line that's the problem?
It's basically how Baseball Card does it but context.other_joker would be the same as G.jokers.cards[i]
ah
So it should work unless something else is wrong
What is the effect btw?
x2 for every rare but that might be too strong 😭 but im at least trying it
heres the full thing
last thing is just checking if its debuffed
when i didnt check for count > 0 it would display x1
so it still gave the mult it was just not getting any count
¯_(ツ)_/¯
ty tho 
YOO
yo???
I'll probably not show the mass of steamodded stuff that happens before it can show, but then it shows all logs temporarily as it happens
Also this lets me do this for free
Should I enable the log showing thing by default?
How do you access the class of self to access its subclass then?
you don't- the class of self is always constant. you'd write SMODS.Blind.super.process_loc_text(self)
or similar
superclass*
But what if you don’t know the class of self and it’s not a subclass of Blind?
if it's not a subclass of Blind, then your function wouldn't be called in the first place
actually, it might not be SMODS.Blind depending on what Myst meant to do. if it was for an object of class Blind then it'd be SMODS.Blind.process_loc_text(self)
but, the main point I wanted to say is that self's class is whatever it is, so self.super is always wrong and can cause an infinite loop if you're not careful
It won't cause an infinite loop, since self.super is never the object's own class
however if you extend a class that uses self.super in a function, and you don't change that function in the subclass (as is the case with SMODS.Center.process_loc_text, for example), that function will be called twice
e.g. the method on SMODS.Joker is called, then self.super refers to SMODS.Center, which has the same exact method declared
I keep forgetting that objects are actually different from classes, unlike javascript
the way they are implemented means they are
but super doesn't change on objects
I mean, super on an object isn't the object's class, it's the object's class's superclass
in javascript it's just a chain of prototypes
specifically the way Balatro's object code is implemented means the relationship between an object and a class ends up different from the relationship between a subclass and a class
use getmetatable and you get the same javascript relation
there's differences in how underscore methods are handled in the two cases
bunch of subtle details
the metatable chain goes object -> class -> superclass, while super cuts directly to the superclass
Question about data being saved between exiting and reloading the game - I was told that anything you write to G.GAME would be safe and stay there even if the game was closed and reopened. However, I'm looking at the Codex Arcanum mod to see how creating temporary cards works, and it looks like they're writing to G.deck.config. Is that also a safe place to write to?
Aha, makes sense. Thank you!
I want to make a temporary card API because temporary cards are a bit unintuitive
AFAIK temporary cards need a variable to track that they’re temporary, and you can’t remember specific cards, but I haven’t looked at how Codex does it
I mean, not that they need it, it’s just that the obvious alternative doesn’t work very well since you can’t remember specific cards
I also wanted a shader for temporary cards
can't you just have some flag like card.ability.temporary?
That’s what I said
ah alright
Oh I would love that. Right now it looks like what CA is doing should be working, but definitely having a full API for it would be better.
I wasn't sure what you meant by not being able to remember specific cards
card.ability.extra.memory = some_card
ah
doesn't that also have the issue of no longer being temporary if the other card is sold
that's unintuitive at best
No?
When round starts, create CARD
When round ends, destroy CARD
It’s very intuitive it isn’t destroyed it the source of the effect isn’t present
if phrased like that, it is
The way CA makes its temp cards is with its Alchemic Cards, which don't really exist to be present at the end of the round since they're consumables.
So I wouldn't really find that intuitive
if cards are created with a temporary property, their source shouldn't matter
Create a temporary CARD
is different from the aforementioned effect
ik
But I don’t know a good way of implementing it
i mean it can be a sticker
And by good I mean O(1)
I was just going to staple a shader on top
And make it not copiable by default
I was thinking if I needed to show the effect I could look at the badges that LobCorp uses for some jokers like the ||Wee Witch's Gifts||
by that I mean using the sticker API
it can't be O(1) if the source matters unless the card knows its own source
What for 🤔
whatever
I wanted the source to know the card. The card knowing the source isn’t O(1), it’s still O(n)
because it may be wanted behavior to destroy the card even if the source is destroyed?
Then you don’t need to remember the source
And it doesn’t need to be the card, it can be the game rules destroying the card
by the card destroying itself, I mean an effect initialized by the existence of the card, not the source
if you take it too far, it's always the game rules doing something
I think saying that a card does something if its calculate function is ran it’s intuitive
And likewise for other functions like set_ability, etc.
But otherwise it’s another game object
in the same way there's calculate_rental called from end_round
this is sort of comparable
I wasn’t thinking of implementing calculate_temporary but maybe it makes sense
I figured more complex end of round behaviour could piggyback off Enhancement API
Like cards that are temporary but last multiple rounds
any of you know where the code is that causes that little popup on the side to show up when you unlock a joker/deck?
Hey myst how do I modify hand size?
thanks bud
G.hand.config.card_limit
or something like that
Ok
the manacle actually uses a function for changing hand size
wait i wanted to click that
that was fast

that's a horrible idea
obv a scam of some sorts
le scamme
it's funny as shit though
nah im sure that person had my best interest in mind
Don't you remember yesterday
they had intrest in collecting intrest from your bank account
please don't
i do remember yesterday
Ok painted jonkler works
why adding consumable to joker slots can't work and why G.jokers.cards[5] isn't nil but G.jokers.cards[i] where i=5 is nil 😭 MAGIC
i love lua jank
lua won't give you an error for getting an invalid index of a table. it will give you an error for trying to use it as if it weren't nil tho.
look at this, card5 outside loop isn't nil but car5 inside loop is nil
you cropped out part of the error
ohh you changed your name
guys feel free to ping myst on reply
i am going to kill you
the error is because G.jokers.cards[5] is nil
okay but looking at the error is helpful
card5 is not nil
how do you know?
what?
card5=G.jokers.cards[5] is executed out of loop and its value is not nil
so jokers.cards[5] exists before loop
but when i=5 jokers.cards[5] becomes nil
no
that wont create an error
variables are allowed to have nil values
the issue is trying to index them, since nil isn't a table
you can do if card5 ~= nil then ... end
then it could be another nil value
what is another nil value
I mean it could be another expression in the loop that is nil
the error only says line and that a nil value was indexed
not which expression held the nil value
so the assumption that card5 is nil is not the only possible meaning of that error
wait why is it i or 0?
if car is nil it prints i otherwise it prints 0
yes but why
im just testing if car5 is nil
so somehow car ~= nil, but is chain of custody is from G.jokers.cards[i], and yet G.jokers.cards[i] is nil?
and the result is this
car isn't nil from i=1 to i=4 and when i=5 car and car5 are nil
the dump u just gave says the exact opposite
no
do i just remove the boss from this to just make it work for blinds
wait lemme check first
ah right, I was reading it as car~=nil not car==nil
because usually that's what you do with a cond and v or d expression

also I'd be sus of reference equality being used to classify things that could be cloned/proxied
isn't it possible to just do something like for index, card in pairs(G.jokers.cards) and see what index value is when it hits 5 in the loop
(Idk lua just guessing from what I saw previously)
i use for i=1,#G.jokers.cards do because previously without my loop game crashed on line 501
so I added a loop to test
aside: ||not usually a good idea to use pairs unless the metatable is made so that the __pairs is deterministic iteration order||
I mean for debugging
and just now I removed local effects line and car5 is not nil
assuming the cards field is an array sort of thing then ipairs will work up to the first nil value
# can technically report any value
so actually G.jokers.cards[4]:calculate_joker sets G.jokers.cards[5] to nil
not necessarily the last non-nil contiguous index from 1
surely that conditional never passes
.
I'll trust what aure says, I have no idea about how the game's internal model works, I'm just general purpose lua
but generally reference equality is a bad idea
the game tends to use reference equality for cardareas
like context.cardarea == G.jokers
it should use an enum/id system instead :(
too bad,
moment™️
but if one thing is a card area and the other one is a table that looks like { min = 1, max = 10 }
they will never be the same table
same thing
you have two objects
one is of the class Blind
one is of the class CardArea
they have different metatables, so they surely aren't the same thing
do i have to put the card name
oh yeah?
local a = context.cardarea
for k,v in pairs(a)
a[k] = nil
end
a.min = 1
a.max = 10
setmetatable(a,Blind)
how much would the game die
also this worked for yellow deck joker
I'm telling you it didn't
crash guaranteed
IT DID
what the fuck
i tried it
does your "DID" mean "didn't crash" 🤔
it works because context.cardarea and G.GAME.blind.config.boss were both nil

anyway if this is true then you can't do those actions in a loop
u will need some kind of concurrency policy
i know and the fourth joker isn't mine
SUS
<@&1133519078540185692>
<@&1133519078540185692>
okay you didn't need to ping them again
ok
kil
🔫
kil
🔫
ty
anyways
yeah discord was wigging out in actually delteing message after ban
thank you discord very cool
As it does
maybe we need to ping one more time, just for good measure
very discord of it
😈
Did you know
yes
If you ping mods three times in a row really fast you unlock a secret sticker
you become Perishable
if context.cardarea doesn't work
and will be sold within 5 seconds
no way
perish the thought
then does self.ability.name work?
Anyway, I'll leave so y'all can get back on topic
cya egg
ping me if anyone manages to make a Joker with the word "tetrated" in its rules text balanced
I'll use debug and make myself eternal instead
🥚
cryptid stakes: 😈
[lobcorp mod spoilers in case someone cares] how much do you bet this works first try
it's balanced if you are confined to the open unit disc in the complex plane (http://davidbau.com/conformal/#iter(z'^z%2Cz%2C6))
I'll bet 2 jimballs
i'll take your two jimballs because it worked first try
⚾ ⚾
wdym i won
damn
i also kinda reimplemented the compat ui because the one thunk implemented is... really inefficient for some reason
ive created a blind which permanantly messes with your deck
🧩
jimbo sticker 
might make them randomize upon draw as well to combat abusing these cards for held in hand effects
and note puzzled is compatible with editions, enhancements, and seals so you can't ever remove it from a card
+50 chips. lose the game when your mult is tetrated
nvm i found an edge case
time to die
tetrate your mult only if your mult equals 1
Tetrated Joker - +4 Mult
@frosty dock is there a standard for that in the mod community?
e.g. let's say a joker modifies other jokers
it should probably wait for some kind of event to do that
instead of immediately
btw I don't play this game, I'm just musing on like general lua mod API stuff
i changed it from self to card and it works
just putting it in an event should do
well
dagger works like this
it doesn't crash but no fool
if it did it immediately then that can result in an infinite frametime
like recursive effects that don't cache eachother
game just crashes due to memory swell/hang
that kind of thing
right so the idea is to have a standard for it
cus clearly that joker[4]
isn't doing a nice thing
dear god why does context.individual have a different return format
(asssuming that was the correct conclusion to make)
||better_calc||
actually it's not the joker[4], it's joker[5] the consumable card and it destroyed itself
i think
okay but that assumes everyone who plays my shit also switches to that branch
well idk your debugging strats are not getting clear results
I would be putting a breakpoint there but supposedly that's evil or smth here
how do i make it give a specific tarot
just wait for it to get merged 
I don't think trying things over and over is gonna get you very far
u should try to figure out how the data is structured
i am
I feel like I might have done something a bit wrong here...
LMAO
legalised money printer
I want to make the effect of when clicking play button, use consumable cards in joker slots on the hand first, and then play the hand. However after consumable cards are used the hand area pops up strangely. My expectation is after using the tarot the hand area pops up, and when the hand is played the area moves down again. So how to control the movement of hand area 🤔
how do i buff editions?
good old context.individual
always there even if you don't need em 😌
infinite money, i dont see the problem.
How can this solve the problem 😭 (not fully solved since highlighted cards are removed after tarot cards are used but hand area moves perfectly)
why nest event?
¯_(ツ)_/¯
moment
🪨
really
Idk
is this a deck
betmma doesn't have to do anything
yes
i know that
i wasn't seriously gonna force them to do it
i know nothing about deck 😔
ok
decks, you say?
yes
but instead of this being random im just gonna make diamond do that
i also don't know how to make decks
🎉
Jimbo nooooooooo
F R E A K Y deck
Imma die
he also wants it to be compatible with betmma's vouchers
so how the hell do i make a deck?

What the hell
That's cursed
Betmma decks confirmed?!?!
Is that a song reference?
ye
kind of
i wasn't aware ngl
Now how do i make all (insert suit) into (insert enhancements)
Just try to use your head
Where in the code might you find something that checks if a card is a certain suit?
Where would you find something that gives a card an enhancement?
What's a good key bind to toggle the console preview thing (as seen here https://media.discordapp.net/attachments/1233186615086813277/1255387692401950750/2024-06-25_23-01-54.mp4?ex=667cf265&is=667ba0e5&hm=c3ab5703146d69b2169124ae0a18cbb7c26b46a0324db68d07887b4db8f08030&)
C is duplicate card
is L unused?
P is a built in thing idk what it does
L is unused
Also ` is open the full console
that works then, as in log
` is nonstandard on international keyboards
It's the default source one
whatever then
Maybe I get rid of the live test and make it space
(Cause live test doesn't seem useful to non
people)
I'll have to see how it feels too
maybe T
should play 15 cards in the final hand 🤔
T could be good
could stand for terminal, good enough imo
good enough
True
Maybe I just make it slash like slash commands and then I go and implement a command runner
also my 'restart game' shortcut of holding q should maybe get changed to not conflict with cycling editions
again, ideally working through lovely and not steam
I mean I've pretty much taken up the entire left side of the keyboard
Also the cycle editions isn't a hold action
ik but it's still the same key
not too important though
doesn't apply to mine
R would be good if it wasn't already restart run
I would have already liked to have R for reloading mods
I mean on title screen it could
which reminds me that reloading mods can break sometimes during a run and I need to fix that
/run Minecraft
it doesn't exit to menu before reloading because events
Also would people be interested if I made an api for mods to implement commands for the console?
Or should I just make it only eval lua code
I guess I could include a few commands like setting a few variables and such
command API is useful if there are commands at all, I guess
wait does that mean SMODS-independent APIs?
@royal ether what do you think of this
Yeah this would be a debug plus api
But I'll make sure it plays nice if debug plus isn't around
maybe ill do more smods stuff if i can use a console on it 👍
woohoo
yippee
L Corp
where do i find the tower within the game files
Actually not sure
card.lua maybe
search for mod_conv
?
how the heck can i apply it to every initial heart suit card within the deck
Find where the deck is stored as a table of cards, then use a for loop to loop over each card in the deck.
If the card is a heart, make that card a stone card.
you don't. do what parchment said instead
back.lua
ok
i copied from checkered
I feel like your missing a function definition or smth there
You could try to look at cryptid’s enhancement decks
ok
someone has these functions ready?
function createRandomPlanet()
function createPlanetForLastHandPlayed(normal or negative)
or do I need to search the base code?
vanilla code has these -> high priestess / blue seal
thanks
Am i allowed to steal borrow jellymods code?
jellymod is the last mod you should learn from
its incompatible with every single mod
then just make it compatible
ok
sound perfect for ai gen goku then (:
dude
Anyways back to making enhancements
wait are editions made the same way as enhancements?
and if so where can i find it within the game files
how can I have my jokers' probabilities be changed by cards like Oops all Sixes?
Have fun making the shader
dude i'm the coder not the artist
Right now this is my Joker
SMODS.Joker { -- 01.1 Mercurius
key = 'Mercurius',
loc_txt = {
['default'] = {
name = '{C:blue}Mercurius',
text = {'Creates a {C:dark_edition}Negative','{C:blue}Planet{} card for','played {C:attention}poker hand','{C:green}1 in 3{} chance to create two'},
unlock = {'{C:red}Evolve{} the previous','Joker to unlock','this one'},
},
},
Oh wait are you applying an edition
ye
New problem dropped in your favourite thread #1252643810853523577 message
Why have you copied the set edition function into your calculate function
i was just testing it
Testing it for what
idk compatibility
and it doesn't crash
do you have a way to properly implement editions?
what are you trying to do
make an upgraded version of already existing editions
are they replacing default editions?
with a certain voucher yes
Have fun making a shader
^
I mean you could yoink the base game shaders…
Can you take ownership of editions?
yes
Then it's probably not that hard to change behaviour or whatever?
I'm not sure if you could trigger taking ownership off a voucher purchase
I mean you just take ownership and then in calculate, if voucher is acquired, then do new behaviour else do default
calculate with editions is still super jank
Well it also needs to change the name
although I haven't looked into the better-calc branch yet, maybe that fixes it
I think having an alternate edition would be a better solution
and then you'd just need to do a simple swap to the new edition when you look at what poll_edition returns
if you have the voucher
but I would argue the first step to wanting to make an edition is to learn how to make a shader
And when buying it, changing existing ones too
yeah you cuold do that too
what's the shader key?
the key for your shader
like the color?
im reading them
Why do editions have an atlas?
for display in the collection
Oh
where shall i place the config?
i read some of the instructions and i think it should look like this
you see all those squiggly lines?
that means you haven't read the instructions carefully enough