#💻・modding-dev
1 messages · Page 193 of 1
in what sort of situation?
you don't need to set message for mult/xmult, it'll just do it for you
actually there's one key where it doesn't do that, that might be it, idk
just return mult = ... and xmult = ...
🤷♂️
isn't cryptid on some ancient version of smods
it was until earlier today yeah
oh they updated, that's cool
does this work with the talisman stuff
still, generally i found using cryptid as a reference created more questions than answers
this is adding something IN cryptid
oh lol, good luck
huh, apparently if your Mult is negative, the UI doesn't display it
does it not?
how do we retrigger jokers, anyways? we did see the optional_features flag and set that to true, but when we try and do something like this, having a joker with the edition retriggers all cards played, not the joker itself.
okay, the joker retriggers, but it's still retriggering any playing cards with it. tried a if context.cardarea == G.play and context.repetition and not (context.retrigger_joker_check and context.other_card == card) then on the playing card check, but it didn't work. uh. what do?
🤔
can i used G.jokers.cards to access a cards config
what's this transparent blank pack used for in the boosters.png of base game? is this just a template?
G.jokers.cards is just an array of joker cards, you can do anything with the cards inside that you can do with cards anywhere else
so if i do
if (card.area == G.jokers and G.jokers.cards) then
if card.is_d20 == true then
(Button Ui stuff)
end
end```
would that work
what would the check for G.jokers.cards accomplish here? you're checking if an area exists after you've already assumed the card is in it
fair point
its for when they're undiscovered
ohhh ok thanks
idk why i didnt remember that
this did not work
if its true then its not nil
not card.is_d20 is evaluated first and always a boolean
card.is_d20 ~= nil is what you're looking for
or not (card.is_d20 == nil) with parentheses
i keep forgeting about ~=
but as it stands, not takes precedence
hmm still didnt happen
question for the shader knowers in here: when it comes to making a shader, GLSL Editor HATES any mention of extern. which, given the name, we assume is because it's a command to make an external statement that GLSL Editor couldn't care less about. how could we like... substitute that?
(code is just pried from ionized.fs from the edition sample, will obviously be editing it to be unique once we have everything setup)
besides if it's true, it's clearly not nil
so the second check is just straight up unnecessary
Hello, I am currently trying to add a hook for add_to_deck as part of functionality for checking if any Joker has been added/removed (without using update). This would be used to check for the total Joker slots avaliable. Looking at some of the methods, while self.added_to_deck is used to check if it has not been added to the deck yet, apparently it's nil, thus yielding a crash involving an attempt to index global 'self' (a nil value) if I decide to add in a card (such as a consumable) using debugPlus.
local addHook = Card.add_to_deck
function Card.add_to_deck(from_debuff)
if not self.added_to_deck then --This is where the problem has occurred
print("Joker added")
if jokers[self.key] then
print("found Joker")
for _, v in pairs(G.jokers.cards) do
if v.key == "unik_happiness" then
print(v.key)
-- do s--t here
end
end
end
end
local ret = addHook(from_debuff)
return ret
end
Another note is that I loaded in the hook via NFS.load(mod_path .. "data/hooks/addremovecards.lua")().
Replacing Card.add_to_deck with Card:add_to_deck gives a runtime error involving self.ability in card.lua (line 784) being nil.
function Card:add_to_deck(from_debuff)
but if its not defined wont it try to check for boolean on a nil value?
no
oh
nil just is not equal to true
ok but still doent explain why it doesnt show up
Card:add_to_deck(from_debuff) is syntactic sugar for Card.add_to_deck(self, from_debuff)
similarly you need to pass self through to addHook, so local ret = addHook(self, from_debuff)
then that's on you. how are you setting the value and how are you confirming it's there?
that's a value set on your center, not the card itself
then how do i access that
card.config.center is the center
of
so card.config.center.is_d20
conifg
I believe I didnt pass self through to addHook prior, hence the crash involving self.ability in card.lua (line 784) being nil before when I did try Card:add_to_deck initially.
I followed above and now the hook (in its basic form) does work now upon a card being added
(now i'll focus on doing stuff in it properly for now)
ok this is not good
that sounds like something is wrong with your ui code
hope you packed a few days worth of rations
i dunno if i correctly understand this, does Blind:set_blind with reset = true only recalculate debuff on playing cards? not even jokers? why?
is this only used when adding cards
...but why is every playing card recalculated when you add one card
I've been trying to make a modded challenge for a modded Joker but every time I hover it the game crashes and I don't know why it's happening
drop a crash dump and maybe we can help
let me know if you also need my code
that is the second time I've read a 12 as a 14 today
do i do it from the github?
yeah just fetch the latest main
the alpha?
https://github.com/Steamodded/smods just go here, top right Code > Download as Zip
should i buff this?
i was thinking about having it gain 1X
instead of 0.5X
but 1X seems to be exclusive to legendaries
could go for x0.75 ala glass joker
ok i updated it and re-did the crash
hmmm do you think that would make it better?
Hmm, I've not had any issues with the extern keyword. Alternatively however you can use uniform, which I believe is functionally identical while extern is depricated
it feels like glass joker atm
it is good for getting rid of stone cards
but it also feels a little weak
def will need a source
I put the challenge and Joker in the same file
the Joker works fine in base
after swapping extern -> uniform and manually add in the float precision, we get this...
why would it be that (genuinely asking)
smods prefixes everything you create with your mod id
so it would be the top folder name down to the id?
--- MOD_ID: JOKERP5 this, although i'm not super familiar with the old header
it'll be the first 4 characters if a prefix isnt defined
would do you mean?
also you misspelled Thief in the mod_name, not relevant but it bugs me
lol thanks
nah, theif is the new rouge
been working on a surprise mod for my internet buddies and I FINALLY FIGURED OUT CODE INJECTION!
ok after changing the mod id ( and mod_name) it still doesn't work
you have to change the joker id, not the mod id
to include your mod prefix
if your joker's key is foo and your mod prefix is mymod then the joker is j_mymod_foo
bruh
ULL
it says pull but i want it under the card not witht he sell button
also we love d20s in this house
how do i force a certain booster pack to be in the first shop of the run?
seeded?
regardless of seed i want it to be in the first shop
would it be a bad idea?
key = 'P5JokerMod',
your joker's key is P5JokerMod
so I think it's j_JOKE_P5JokerMod based on what Eremel said but i'm not certain
still not it, the error says something about center and having a nul value
that's the symptom
the cause is this line
{id = 'j_P5JokerMod', eternal = true, pinned = true}
},```
get the id right and the problem goes away
unsigned long long
?
do you not c what he's talking about
Oh damn
long long? chinese dragons?
-# no I'm an idiot
98% of lua programmers can't C
Is it a c++ joke that I don't understand
Out of curiosity, what program/plugin is giving you these errors?
The implementation of GLSL in Love2D aliases a lot of stuff and isn't fully equivalent
Just got around to looking in here and saw the ping. Was this done? If not could you please tell me what the context is?
it's just GLSL Editor in the browser. is there like, a better program we should be using for this?
the thing is love doesn't use standard glsl
I can't seem to add mult to a playing card? I'm trying to make a consumeable that gives permanent mult to the card; but i've tried a bunch of different stuff and it never seems to give mult...
error readout told me there's an 'unexpected symbol' on line 40 near '}'. does unexpected symbol typically mean a syntax error?
your for, if and calculate are missing an end
does unexpected symbol typically mean a syntax error?
yes
got it, ty! was guessing it'd be smth like that lol
yeah you're missing ends
Guys, how do I check the key of the card being sold in context.selling_card?
If there's even a way to do so
lmaooo sorry sir 🫡
xdxd all good
is this in the wiki?
uhhh, what tool would be better to use then? :o
don't worry, even if it looks like so, there still undocumented stuff
I mean, at least there is documented stuff
i'm in the process of making a booster pack, but the text here is not what is expected (it's meant to say Buffoon Pack), is there something i'm forgetting in loc_txt?
another read the docs moment
fuck
thanks my brain wasnt registering that line of text
i looked over docs like 30 times LMAO
why is everyone using old header and loc_txt instead of a localization file :v
using old mods as a reference probably
?
such is the dire consequence of cryptid being the most in-depth mod despite using a painfully old version of smods until Literally Earlier This Morning
also loc_txt is easier to manage getting started because everything about an object is in the same place. it just doesn't scale well, which is why most larger mods switch to loc files at some point if they don't start out using it
cryptid does use localization files obviously but it does also use the old header
and i might say one thing, if <2 months is already painfully old, imma show up with some back in my day etc
number goes up too fast
i called 1220a that someone was using here ancient
pretty sure i started off a few months ago on a slightly older version
the reason it feels old is because there has been so many changes within those 2 months
the issue isn't necessarily the time, it's the amount of updates in that timeframe. smods and talisman updated FAST there. ;P
psychic link achieved...
I guess now you're 5 people instead of 4
better calc was one of the largest changes in terms of impacting mods that we've had in a while for sure
ik when we got started we spent like an HOUR trying to figure out why our sample mod wasn't working... Literally every time, it was that something was out of date. Even Lovely. ;P
most mods made the jump fairly quickly, but cryptid had the misfortune of being caught up amidst a major refactor of their own
sooner or later something will have to be named a stable release
we're at a point where most mods are over old calc, so at the very least i'm preparing a beta release
i envy the new modders in 2026 who will have stable releases, surely
unless you know
thunk releases a dlc
that breaks all the patching smods relies on
python developer
there's been an ongoing debate of which will come first
the gameplay update or a stable smods release
it'd be pretty funny if thunk reformatted his code drastically and every single patch breaks
tbh if i were thunk i'd sit back and wait for better calc
literal mountains of free labour over here
I expect a decent amount of breakage in that update once it hits
thunk should drop the update in the middle of exams tbh
it's been cooking for a while and we'll probably wait a good while longer before it's finished
if 1.0.1 was a straightforward update for steamodded to adapt to, 1.1 might hit me (us? let's be fair, mostly me) like a truck
depends on what even the update is
what if 1.1 is just built in the smods api
maybe it's just an official joker pack
I didn't, but here is the relevant part of the code
SMODS.calculate_context({modify_scoring_hand = true, other_card = G.play.cards[i], full_hand = G.play.cards, scoring_hand = scoring_hand}, effects)
SMODS.trigger_effects(effects, G.play.cards[i])
for _, eval in pairs(effects) do
if type(eval) == 'table' then
for key, eval2 in pairs(eval) do
if key == 'add_to_hand' or (type(eval2) == 'table' and eval2.add_to_hand) then splashed = true end
if key == 'remove_from_hand' or (type(eval2) == 'table' and eval2.remove_from_hand) then unsplashed = true end
end
end
end
just at a fundamental level
1.1 will have steam workshop mod manager deck buidler joker buidlker support on god!!
this is like two branches of a codebase diverging over the course of a year
I'm currently trying to create a joker that will trigger an effect for the first card of suit, what would the best way to do this be?
there can be a lot of backend changes just by means of thunk realizing the thunkiness of his code
thunk installs an auto formatter
🤔 the way Blind:set_blind is patched really doesn't lend itself to altering vanilla blind behaviour does it
Nah his formatting is actually pretty good, at least compared to the atrocities of formatting I see get posted here.
98% of balatro modders cant press shift+alt+f
^ most of the bad formatting in the dump i see is from misformatted lovely patches
tbh i prefer lovely patches when theyre not formatted since you can clearly see whats patched in and whats not
except for ui code
ok fair
we need a better way of doing ui
formatting is by far the smallest issue around ui code
its actually atrocious
yeah after running a formatter the UI definitions file goes from 6k lines to 10k
sorry to nag, still taking suggestions for shader tool thingamabobs, preferrably ones with LOVE compat & preview just, in-box. is GIPS any good for this?
bite the bullet, visual balatro ui builder
if in 1.1 thunk decided the code was too bulky and ran all the code through an uglifier to save on space
better yet
phuck no
precompiles everything
yeah let's just kill all modding up to this point for good
lmao
i mean that just means all mods stay on 1.0.1 indefinitely until someone insane enough to reimplement 1.1 in smods comes around
im very surprised nobodys taken advantage of the unsafety with balatro mods
with how depraved people are these days
who knows
there's been people trying to distribute exe replacement mods on this discord
yeah who knows at that point
sorry if this is a bit of a rookie question - i've never programmed in lua, i've only ever done very basic c++, and lua is pretty wildly different - is there a way to access each card in a played hand as an int value or something - how does it work? i can't seem to figure out how to use scoring_hand to make a joker trigger on, for example, the first and last card of any played hand
well cards are not ints so
ah i see what you mean
I take it this just goes in the calculate function of the card?
sure i understand that but i'm thinking of their positions in hand rather
idrk how the game handles that either way
context.scoring_hand[1], context.scoring_hand[#context.scoring_hand]
(yes, lua is 1-indexed)
it was a shock to myself as well
i don't know how i feel about that
we feel like there's a real shot that we get a mod that ports all 1.1-exclusive content to 1.0.1 before then. like what happened with minecraft 1.19 stuff getting ported to 1.18
we're talking about basically the same thing, slightly different way of getting there
you take that back
i won't
that is depraved
it took me like 3 seconds to get used to it
it's just breaking with a convention that really doesn't need to be broken
thank you! i'm assuming #context.scoring_hand gets length
yuep
no no, i'm totally used to it and fine with using it
that doesn't stop me from actively thinking that this is wrong
correct
fantastic, appreciate it everyone :)
That is one thing I do like about lua. Very easy and intuitive to get array lengths
i mean i understand the idea of like yeah they didn't really need to break that but like it's not really all that big of a deal
yes, but only for the consecutive numeric part of a table (pretty much every data structure is represented by a table, it can be indexed by anything except for nil)
very intuitive to get "array lengths" until it doesn't work because table is a monstrosity
lmfao
and a downright crime against humanity
it's just that arrays don't actually exist in lua, they're just part of what makes a table
it's just a listmapobject that's all but none
under the hood, it consists of an array and a hashmap
honestly this biggest thing I've found I don't like in lua is not switch case
ah. out of the frying pan, into the fire, etc.
(shamelessly using the mosaic shader from cryptid as our guineapig but using foil out of the actual balatro code does the same error)
for preview, your best bet might be the game itself or setting up some dummy love game
you can use debugplus watch shader feature
just watch shader Mods/your mod/assets/shaders/yourshader.fs and a card with the shader will pop up, whenever you save the file it will update
and any errors will show in the ingame console
is smods considering at any point replacing the massive, horrible if/elseif chains that check ability names entirely with a reimplementation of balatro as smods objects
i'm at a point where i have to rewrite the base game blind code so hard that i might even be willing to contribute that bit
but i'd rather not start contributing it if the stance is to leave the spaghetti alone
similarly i've noticed that smods has a good reimplementation of booster pack code but for some reason the core booster packs are not patched to use it, even though it works even better than vanilla (vanilla booster pack code can't handle 7+ cards in a booster pack)
...Booster packs are set up to use SMODS API instead of vanilla.
Done via take_ownership_by_kind
yes and no
Is there anything special needed to replace a vanilla texture with a modded texture
the packs themselves use SMODS code but the UI after opening the pack does not
I’m assuming if you claim ownership of a joker, you would be able to edit it’s art
create_UIBox?
something to do with that, yes, i'm looking at my patches right now
i had to patch out some vanilla spaghetti which made vanilla booster packs hit smods code instead
I have been wondering if booster pack states conflicting with SMODS booster UI could cause issues
i don't have a dump right now that's not patched but i'm pretty sure this bit directs vanilla booster packs away from SMODS UI code in Card:open()
if self.ability.name:find('Arcana') then
G.STATE = G.STATES.TAROT_PACK
G.GAME.pack_size = self.ability.extra
elseif self.ability.name:find('Celestial') then
G.STATE = G.STATES.PLANET_PACK
G.GAME.pack_size = self.ability.extra
elseif self.ability.name:find('Spectral') then
G.STATE = G.STATES.SPECTRAL_PACK
G.GAME.pack_size = self.ability.extra
elseif self.ability.name:find('Standard') then
G.STATE = G.STATES.STANDARD_PACK
G.GAME.pack_size = self.ability.extra
elseif self.ability.name:find('Buffoon') then
G.STATE = G.STATES.BUFFOON_PACK
G.GAME.pack_size = self.ability.extra
end
the particular problem was that the vanilla UI code doesn't seem to have any flexibility for booster pack sizes so after 7-8 cards they just leave the screen
while SMODS booster pack UI code seamlessly handles cryptid amounts of cards per pack
would've been nice if i was sure about this, some comments sure would've been nice mr author "baliame" who committed it "last month" :V
yeah just take ownership and replace the atlas and pos, i'm pretty sure
how would i check how many jokers of a certain rarity there are in the joker area?
Can SMODS.Joker handle the soul effects like for legendaries? It doesn't immediately appear to be on the wiki, at least
wdym the soul effects
or like hologram
where the joker face sprite is separate from the body of the card
Yes
for _, joker in ipairs(G.jokers.cards) do
-- check joker.config.center.rarity here or do w/e
end
ok, thank you
I don't think thanos snapping this is save enough to do since there's likely Balatro logic to not touch that depends on one of these states, but I can set the state checks for the booster pack UI to if false then
Also I wanna know more about this. SMODS is (at least supposed to) ensure that for these if-else logic chains are ignored if a SMODS function returns something before the if-else chain actually starts.
well, time to scour the smods source files then
Generally if SMODS needs vanilla logic to change they just use take_ownership and not touch the original logic since it's designed so we don't need to.
I don't doubt something is hiding somewhere but I will say this: I thanos snapped it over a month ago, played plenty of games since to playtest the mod and have not come across anything out of the ordinary
seems to be cracking a bit around blinds, as far as I can see for example, in Blind:set_blind(), SMODS logic and vanilla logic would run if I were to take ownership of, say, the Eye
the point is kinda that we mostly have the framework to redo what vanilla does nicely, and i'd actually propose cutting down vanilla spaghetti, so not only take ownership but also provide a base take ownership (that reimplements the vanilla logic) and patch out ability.name == "foo" spaghetti
Do you want to make a texture mod or just change the art?
reason I'm thinking about this is actually that I'm working on something that could potentially bring multiple blind effects into the fold but as it stands it is either insanely messy or all vanilla blinds have to be turned into SMODS blinds, which made me find this issue
FYI L Corp does something like that
and this is my next point ^
I got multi Blind code from it (playing against multiple Blinds within one Blind)
right now if multiple people do this I'd say it almost inevitably conflicts
just the art of the card, but im hoping i can make it so i can toggle it like how mods are able to be turned off and on
In that case my suggestion is to make it a Malverk mod
Malverk is a texture pack manager mod
okay, thanks
While I support extending the vanilla Blinds, it’s unclear what would be useful to multiple mods or not
Hello, im new to modding and i need some help. Is there a way to detect if a lucky card has failed to trigger any of its effects?
I do think that both adding an info queue to Blinds and passing the current Blind as a variable instead of a global would be good starts
to flip this on you, it's pretty clear to me if there's anything that reimplements any center or game object from vanilla as-is, it should be SMODS or smods-adjacent
Well, Lucky Cat detects if it succeeded, so maybe do the opposite
this discussion isn't technically about blinds themselves
it's about moving the vanilla spaghetti logic into smods objects
I disagree with the “as is”
I don’t think there’s much benefit to endless “as is” modifications that could be added to SMODS
I think only the ones that could be interesting to multiple mods are worth adding
Especially the ones that could cause conflicts otherwise
as-is is very valuable because if any one mod wants to rely on as-is, right now, they have to reimplement stuff as-is, which in on itself conflicts with anyone's not as-is behaviour
Not necessarily
tell me about the benefits of having effectively two systems in place (if it's not an SMODS object, fall back to if-then chains)
And again it’s not very valuable because there’s a myriad of “as-is” modifications and finite work, time, etc. not to mention maintenance and efficient implementations
Doesn’t break when Balatro updates
see that's also not guaranteed
we're relying on exact text matching, i guarantee to you the smallest change to any line will break half of SMODS
Yeah but keeping the vanilla implementation working is more likely to work
Because you don’t need to reimplement anything vanilla
that's incorrect, it's more likely to (at all) follow what the base game does, but it's less likely to work, by reimplementing as-is you're pinning the version
But you don’t want to pin the version, you want to update it
which does come with its own problem but it actually makes anything somewhat less likely to break
let us not actually pretend that all the lovely patches will continue to function if any vanilla update happens
it breaks on something as simple as thunk running a formatter
Some of them might break but I imagine most will only need to find the correct place to patch into rather than being reimplemented
okay, this is a silly as hell question. we think we have our shader looking more-or-less good enough for right now, but uh, how do we call it? this... this got mad for some reason.
but your argument breaks down as soon as any effort needs to be made to follow an update
The effort to update SMODS to a Balatro update should be less if we don’t reimplement Balatro code
or at least the way I see it everything hinges on undetermined amount of effort that needs to be made in case there is a vanilla update but you yourself just admitted that there is an unquantified possibility
also I'd like to point out better_calc effectively reimplements vanilla scoring which already may be subject to such a problem
even though it refers back to vanilla sometimes
die is already cast from where I'm standing ¯_(ツ)_/¯
better_calc at least makes sense as something that will see widespread use
Also it’s unlikely that thunk would heavily change scoring to the point that it needs to be refactored
By its nature, updates to scoring should be easy to be added in as they should go on top (as it’s not fixing anything that is likely change)
let's also not pretend there's going to be a "middle ground" update, like the last patch, any upcoming update is either going to be 1.1 which fundamentally breaks everything, or something like 1.0.1f which is mostly a change to the extra value of joker defs
And as I said any update will break your proposal more than it would break the current methodology
not really
Yes really
I mean I already explained why yes
good for you 👍
ok so I got the challenge to work
i had to do id = 'j_1234_P5JokerMod_joker' with 1234 being my mod id and P5JokerMod_joker being my joker's key
okay, what are we not seeing here. it says "The shader's key, file name (without extension) and the shader name used in the GLSL file must be identical." but like. isn't this doing exactly that? so why is it giving this error?
key = 'faded_foil',
path = 'faded_foil.fs',
}```
this works so I assume your path needs the extension
Ah.
hey guys so I wanna learn how to make a mod n shit because I think it’d be fun but I have like Jack Shit knowledge of programming outside of like the basics from an AP comp sci class which was just JS lmao
do ya’ll know of any resources I could use for like installing/learning lua and whatnot :]
I wonder if something like this is planned, but they're waiting for the update to vanilla Balatro so they don't have to re-rewrite stuff
i just looked up "learn lua" on google and theres already a couple of sources you can learn it from
https://www.lua.org/pil/contents.html
https://www.codecademy.com/learn/learn-lua
i think it's good idea to learn how computer does its thing first
i dont think theres a need to go low level if all they're gonna do is learn to make a balatro mod, lua is easy enough to learn anyway
not in low level
just simple
?
computer do things in steps
n stuff
you kinda need basic programming knowledge to work
yea im aware but what are you on about
please disregard my messages
alright then
what does the crash text say
aaaaah i'll figure it out what's the worst that can happen
ill send it in a sec
my computer when I somehow manage to delete system32 trying to add +4 mult
ok i just recollected myself so what i meant is that i think jumping head first into programming something complicated is a bad idea without knowing fundamentals first
which yeah i'm probably way over my head lol but i'd like to try
wdym by fundamentals though, basic shit like how binary works, abstractions, etc. or more?
variables if else and loops
does it not crash when you remove your own mod? cuz that's a whole lot of mods that might cause a crash
it doesnt crash when i remove it
are you trying to loop through a string?
no
I think I have a decent idea on those from JS, while im sure not a 1 to 1 translation between the languages im sure the idea of it is the same
how the hell did i do that lol
happens to the best of us
okay if you know how to write a different programming languages i think you'll be alright
two hours of my life trying to find the issue with my code
the evil brackets:
even then i'd assume learning any programming language starts with being taught the fundamentals of programming in general
okay, its no longer crashing but it doesnt show up lol
like there's hardly any cases i can think of where it assumes that you already understand fundamentals
you never know
someone could just be like
"this is cool i wanna start writing some code too"
where is bro (hdr be fucking up screenshots)
officially finished my first custom joker 🥳
hdr balatro
can you check
the mod menu
hello mr john lovely
My first joker, i plan to make a few more or even a full mod themed around the Pokemon Trading Card Game.
wait, i think ive got it
What’s the latest steam modded version?
worst case scenario, but pretty easy to come back from
just time consuming at the end of the day
One question, is there a "balatro mod creator" mod? or anything like that?
https://www.balaui.dev/joker is a good start!
nvm lmao
Oops! The game crashed:
main.lua:1266: module 'lovely' not found:
no field package.preload['lovely']
no 'lovely' in LOVE game directories.
no file 'lovely' in LOVE paths.
no file '.\lovely.lua'
no file 'Z:\home\deck.local\share\Steam\steamapps\common\Balatro\lua\lovely.lua'
no file 'Z:\home\deck.local\share\Steam\steamapps\common\Balatro\lua\lovely\init.lua'
no file '.\lovely.dll'
no file 'Z:\home\deck.local\share\Steam\steamapps\common\Balatro\lovely.dll'
no file 'Z:\home\deck.local\share\Steam\steamapps\common\Balatro\loadall.dll'
Additional Context:
Balatro Version: 1.0.1n-FULL
Modded Version: 1.0.0~ALPHA-1420a-STEAMODDED
LÖVE Version: 11.5.0
Platform: Windows
Stack Traceback
(3) global C function 'require'
(4) main chunk of file 'main.lua' at line 1266
(5) global C function 'require'
(6) LÖVE function at file 'boot.lua:323' (best guess)
Local variables:
c = table: 0x00c0d8d8 {identity:false, version:11.5, accelerometerjoystick:true, modules:table: 0x00c0d928 (more...)}
openedconsole = boolean: false
confok = boolean: true
conferr = nil
(7) global C function 'xpcall'
(8) LÖVE function at file 'boot.lua:362' (best guess)
Local variables:
result = boolean: true
(9) global C function 'xpcall'
(10) LÖVE function at file 'boot.lua:377' (best guess)
Local variables:
func = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
inerror = boolean: true
deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"])
earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
bro i need to get back to writing code
I don’t know what could be the problem then
Yeah not worried about it either, it was just to support a greater point
it just hit me, i dont think i got the json file
It's funny that localthunk running a formatter would incur the modding apocalypse 
I'm crying
i think this is better than many other games where you just have to figure shit out every single minor update if you even want to mod
--- MOD_NAME: Yonkagor
--- MOD_ID: Yonkagor
--- PREFIX: YNK
--- MOD_AUTHOR: Flote
--- MOD_DESCRIPTION: Hoping this works
--- VERSION: 1.0.0
--- DEPENDENCIES: [malverk]
AltTexture({
key = 'YJoker', -- the key of the texture
set = 'Joker', -- define the object type that you are retexturing, see wiki for full list of types
path = 'Joker.png', -- the filename of your spritesheet, saved in assets/1x AND assets/2x
loc_txt = { -- [NYI] Localization text for tooltips displayed in the texture selection screen - can be added to a localization file under [descriptions][alt_texture]
name = 'Example Texture',
text = {'Jokers are replaced by bananas'}
}
})
TexturePack({
key = 'YonkagorArt', -- the key of the texture
textures = {'YNK_YJoker'}, -- a table of keys
loc_txt = { -- Localization text for tooltips displayed in the texture selection screen - can be added to a localization file under [descriptions][texture_packs]
name = 'Yonkagor Based Jokers',
text = {'Youre like pop music or something'}
}
})
Has anyone had this issue?
I agree. That's why Balatro being source-available is such a nice thing. We can just diff the two updates to figure out what changed instead of needing to reverse everything from 0.
There is value in Lovely having a semantic patch which can match against the lua syntax tree
It would in theory be a lot less brittle, but you would also have a lot less flexibility in where things end up
ITS WORKING
Also the pattern syntax would be disgusting
no they just removed it
@glossy dagger
I seem to be having an issue could someone help me?
thanks :3
Ah this is bedrock. I was seriously confused for a sec there
they wouldn't touch modding on java
Yeah it doesn't kill it entirely but that is a serious hit to the modding community.
i feel like they know better than just messing that up
yeah modding on java has been so embedded into like its history that just messing up modding on java is likely a terrible idea
Yeah but this is Microsoft, so who knows
whichever one would lead to it
it will just kill the game
i just did this today as well, nice job!
it was rlly difficult but it's fun
peeps in modding dev helped :D
modding keeps the game alive beyond its age
even with official updates ceasing mods will still be around to add more stuff
yeah it means there will finally be a modern minecraft that everyone can target
(but why do that when 1.12 exists)
how i change the description?
sorry, why do that when 1.7 exists
7 years old
😭😭😭😭😭
sorry, why do that when 1.19.2 exists
🔥 🔥 🔥
you don't even get the new swimming
sorry why do that when 1.8.9 exists
ok this is more respectable version
What exactly does it mean, no lovely in love game directories?
why play modern minecraft at all when beta 1.7 exists
no lovely dll in game files probably
FR
they wouldn't be getting that error message if they didn't have lovely installed
is this your code @white spade ?
I'm a modern Minecraft person
i always play the latest releases if possible
modern mc is fine other than it running like crap on servers
I like it but I have a hard time finding the motivation to play it.
probably nostalgia since I bought the game in the beta era
Yes apparently I’ve been getting this feedback
@gaunt thistle
i think it's also kinda crazy that you can upgrade mc words from alpha to latest version
the only reason anyone playing an older version would make sense is cuz of mods or 1.8 pvp, playing older versions cuz one thinks is better is just ???????? why
are you require("lovely") anywhere?
theres no way its not boring
just trying to figure out what you're trying to do
hey, i have a question
it's cozy
I downloaded lovely
I put version.ddl in the right version I don’t know what else is happening
- yeah i miss starminer mod
- 1.8 pvp sucks IN MY OPINION so no more of that for me
- i think they add a lot of things in recent version
also better than adventure is incredible
make sure that you have the latest lovely version
0.7.1
I do have the latest lovely version
That’s the issue I don’t know what’s going on
i feel like people wouldnt have stayed behind in 1.8 for pvp if 1.9 didnt butcher it so bad and leave a bad reputation for pvp post 1.9
nah 1.9 combat is terrible but later versions refine it so that its actually good
are you making a mod or just trying to install mods
no clue i dont remember playing much back then
Just installing them
I have steam modded and lovely
Balatro in minecraft when
Wanted to put this here to ask for help (I have no idea where else I could);
I'm getting an error printout of " Error processing file Jokers.lua:489: unexpected symbol near '}' " when I'm trying to run this joker. If any of you could help, I would greatly appreciate it
does anyone know how i could find the ranks in both the two of a kind and three of a kind in a full house
Is +mult available in context.before now?
Just return { mult = x }
I don't suppose it's possible to set a joker's enhancement gate to be a set of possible enhancements without patching? At least it doesn't seem that way based on the definition of SMODS.has_enhancement()
I.E. you mean it has multiple? That would be via using quantum enhancements
I mean if having one of two enhancements in your deck makes the joker findable in a run
@stable agate You’re missing an “end” to close the calculate function
Oh I see what you mean
i.e. it becomes discoverable if you have a lucky card in deck or if you have a gold card in your deck
for _, v in ipairs(G.playing_cards) do
if v.ability.effect == "Lucky Card" or v.ability.effect == "Gold Card" then
return true
end
end
end```
Seriously? Huh. I'll try that. Which line should it go on?
Use the pool function with this condition
that's fair
Below the last end you have — that end is closing an if statement
Got it
My plan was to edit this to loop through v.enhancement_gate as if it were a table, for each enhancement and return true once one of them was found
add = nil
for kk, vv in pairs(G.playing_cards) do
if SMODS.has_enhancement(vv, v.enhancement_gate) then
add = true
end
end
else```
That's definitely harder than just using joker.in_pool() yeah
But it would allow me to define enhancement_gate = {'m_lucky', 'm_gold} in the SMODS.Joker declaration, on more than one joker
if I have more than one joker that could have multiple cards that clear the gate
I suppose, but the actual in_pool() code is so minimal that you really don't need to
oh wait
wow
nevermind you're totally right I missed that that was a field for smods.joker entirely
yeah I'm going with that then
thank you 🙏
me when I forget to read the docs, apparently
So pro: I got it to run.
Con: it doesn't work
The way I'm trying to get it to work is by doing repetitions similar to sock and buskin, but only if the hand is all Jacks. Hence the #jacks == 5 statement. Gonne try debugging about why it's not working, any help appreciated as mentioned
that kind of code shouldn't be in an event
This is my first go around with jokers, so forgive what must seem like a stupid question, but where should it go?
Okay let's start from zero
a joker that repeats all scored cards once would look like this
calculate = function(self, card, context)
if context.repetition and context.cardarea == G.play then
return { repetitions = 1 }
end
end
from that you can add your other conditions for those repetitions to trigger
or change what kind of cards get retriggerd, for example G.hand instead of G.play for cards held in hand (like mime)
I'm learning. I see. So if I wanted the retrigger to only play with a full jack hand, would it look something like this?
return { repetitions = 1 }
end
end```
yeah, tho I'd put the jack counting inside the if context.repetition and context.cardarea == G.play to avoid extra calculations
Would what I had here work for counting jacks?
local jacks = {}
for k, v in ipairs(context.scoring_hand) do
if v:get_id() == 11 then
jacks[#jacks+1] = v
end
end
if #jacks == 5 then```
Okay so
Is there a way to make it so that a joker can check if a specific joker is next to it
I've trying to modify blueprints code to do it but I can't find a way to make it look for specific jokers directly next to it
first you need to loop through G.jokers.cards and find the index of your own joker
then just check if G.jokers.cards[index + 1] exists
or - 1 if it has to be to the left
and to check if it's a specific joker you can just do other_joker.config.center_key == 'j_modprefix_key' for example
Tried to add this new line. Got " "Items/Jokers.lua"]:481: unexpected symbol near '}' "
that means you have syntax errors
since you're using vscode i recommend getting the lua extension
this one
let me see if I can find it
but to begin, the func = functionthing was for creating an event, it shouldn't be here
you have a random }) at the end from the remnants of the event too
So remove those?
I tried that and it didn't work I don't know if I'm doing something wrong
That did it. I'm free
remove your and context.other_joker
and also you need to check that other_joker isn't nil first, because if your joker is all the way to the right it won't find any other jokers
Guess I should look more into what actually needs to use events. I got like, ten more jokers to code :feelshondaman:
tried that and it gave me this error
boop
also it's not finding anything because you're comparing G.jokers.cards[i] == self which is never true
use card instead of self
card is your actual joker, self is the center
oh my god it finally works tysm
well, I think I've finally implemented everything I wanted for my mod
Now I can sleep
Hey you guys know any good guide i have a idea that uses other joker that are in your hand and adds mult or something like like baseball with out using just uncommons
just loop through G.jokers.cards and check the rarity and add the mult?
While I managed to implement much of the functionality for my Joker and "Positive" Edition (shader will come later), I'm still have trouble figuring out how to have the text change depending on the card type the edition is applied on. It should be "-1 hand size" on a playing card, "-1 Joker slot" on a Joker and "-1 Consumable slot" on consumables
I've mainly followed the lovely patches in SMODs for reference and have "partially" succeeded in terms of managing to get all 3 to have the same badge, but only the Jokers with the edition display the text.
Where should I patch or hook to have the text display for consumables and playing cards?
Heres the TOML code (in txt file so it can be visible on discord) and the lua localization below. I'll supply more toml or lua if needed
Edition={
e_unik_positive={
name="Positive",
text={
"{C:red}#1#{} Joker slot",
},
},
e_unik_positive_consumable={
name="Positive",
text={
"{C:red}#1#{} consumable slot",
},
},
e_unik_positive_playing_card={
name="Positive",
text={
"{C:red}#1#{} hand size",
},
},
thinking about refactoring my jokers into one file like this
put all of your code into one file for peak simplicity
fantastic idea just don't let your main file hit 7000 lines
worst mistake of my life
mine mad it up to checks notes 2912
also a true story, the latest version (unreleased) of my super paper mario mod recently broke over 7000 lines in mod.cpp and i'm terrified of splitting it up. i tried doing it one time and i broke the game very many times in terrifying ways 
not nearly as long lol, but that's the full mod so
nah bro the more lines over 7000 you have the more "mod points" you get which gets converted to dollars and gets sent directly into your bank account by localthunk
you guys just have to trust me on this
guess I better pump my numbers up then
holy shit i believe you and everything you say
time to triple the scope of my mod
forgot to include this bit: i would initialize the jokers as a table, and then I'd sort them by rarity (then alphabetically)
reminder: pull request
guys the release of mistigris is cancelled
it's gonna remain in permanent development hell
new lifehack just dropped: hold the enter button to create many line breaks a second. local thunk will go bankrupt in a matter of days
anyways, is this a good idea
ok noted
i'm still trying to figure out the best organization style lmao
cuz I'm still on the "joker files separated by rarity" scheme
you guys are separating your files?
each joker or related set of jokers as its own file is probably "ideal"
i will look out at you idealists from my 90000 line joker file tho
and i will laugh
you either have to search your one file for the thing your looking for, or you have to search for that one file that contains the thing you're looking for
its ok i know the order of all my jokers
coding if it was even worse
one of these things keeps me from having a million tabs open, and the other one lets you switch between lines of code without having to jump up and down every 3 seconds
its one big table that has keys and values in it
then it initializes them like SMODS.Joker(jokers[jokers[i]])
i have a bit of apparatus around how my mod registers objects but thats fundamentally what it does
only at 1864 lines in LooksLikeTheJokers.lua, smh
what did you do to jb rider?
if it walks like a joker and talks like a joker
all of my modules have stupid names
it's a jester
realized VSCodium had way better Lua support
jetbrains tragedy
these are my four VSCodium jokers
what I should have done was check if vscode has a prettier formating for Lua (which it probably does)
it does not have Prettier for Lua but the Lua Language Server is good enough
and there's also things like Stylua
where's the xmult?
I'm actually really surprised it doesn't have one
for the most part this works, but for whatever reason, having this edition on a joker causes every playing card scored to retrigger... what're we doing wrong here?
Aikoyori Colours isn't on VSCodium 😔
fix that
grumble grumble grubmel grumble grumbl fINE I GUESS i can just add these and not do the center overrides maybe they're not horriblew
(theve been disabled because i couldnt get a purely cosmetic feature to work
)
Minecraft pickaxe
implement all of your jokers as a single contiguous patch
with no comments
patch them into SMODS
just patch them into the engine itself
patch them into a dll file
patch them into engine/ui.lua
imagine somebody who actually does this
wdym? is there another way of adding jokers?
nope, this is the only way
im surprised nobody has made a modding api yet
nonsense, they'd never go for it
ok I am genuinely considering doing this again
trying to patch the temperance loc_vars in common_events.lua, however smods already alters it, how do I know what text patch?
this may sound really dumb but how do I peep at the code post-lovely? 😅
Friends. I can now read the cards description of the cards in the shop. I have been fighting against that for like 3 weeks now. Im very happy. I think my twitch overlay mod is now actually fisable
try card.config.center.loc_txt.text
? I mean i got it by other means. But ill take note.
Look at my repo on the SMODS.context_change hook
I did get the text. Its just a bit convoluted
is there a tool that adds the sheen animation to blinds?
is this the best way to word it?
Seems pretty straightforward
its animatedsprite.lua i think, located in here
no i meant like
is there a python script or something that converts the still image of a blinds icon/texture and creates the sheen animation spritesheet out of it?
...i dont think so, or at least, i have never heard of it before
Does it need to be manually created?
needs more LINES
please dont remind me of the past 💔
Played cards with
Spade suit give +5
Mult when scored
P
l
a
y
e
d
c
a
r
d
s
w
i
t
h
S
p
a
d
e
S
u
i
t
that's my suggestion on what to do with it
unless you're adding smt else
fun fact, i actually started working on the pages stuff since one of my jokers finally managed to completely flood the screen vertically 💀
Honestly the pages is a great idea
to the point you actually cant even see the "Rare" badge anymore
brilliant, thank you kind sir
o
7
just make one page for each letter
😭 thats wild
Thanks, i don’t need it cause my mod adds no assets to the game. But very useful info none the less
should this be turned on by default? if its unticked, then you would need to highlight a joker to turn its pages
sorry to nag, any pointers on this? we KNOW the issue lies on the playing card check, since commenting it out means it does properly work for only jokers...
(idk why you would untick it, but just to make sure)
Get rid of the first if block completely
by completely, do you mean even the stuff inside of it? :o
Hi! Do you guys know how to remove vouchers in the Betmma mod? I keep getting crashes when using the Real Random Voucher, so I wanna remove it from the mod. The Github page says that I can, but I have no idea how. Some help would be greatly appreciated :")
oh, that just worked altogether. huh.
Play
ed
card
s wi t
h Sp
ad es S
uit
what the fack is that 😭
oh uh, just remove the vouchers folder inside it
inside the Betmma mod folder is like, multiple sub-mods that you can freely disable/delete
ok it looks like the general populous doesn't like the idea
Yeah, but I just wanna get rid of one Voucher from the mod
Oh God-
How do I do that? I have no experience in code-
The page says to do it like this, but I can't find that
How'd you do that so easily? :0
OH MY GOD, THANK YOU
you didn't know of the %AppData% shortcut?? :o
Do I just delete the line of code now?
I didn't know about that one specifically!!!
just turn it from true to false
Ah, gotcha gotcha
That's one thing I do remember from school lol
It still appears in the collection. Does that what I did just mean it won't spawn in anymore?
Nevermind!! It's gone now!!
Again, thank you so much!! It's been driving me crazy all day
Good luck on your Star Rail mod!!! <3
toml
depends on if you're British or not
if you're British it's toml
otherwise it's toml
@rose dragon
google translate lady (australian) says it's pronounced "tom-el," and, of course, the google translate lady is never wrong
thank you :D
we can only dream
question; how can we make it so a line of text in a card's description only appears if a config setting is enabled? was thinking of adding an "Origin:" section since a LOT of our cards are obscure/obtuse references but wanted to have a setting to hide it for those that already know/just want the card's effect.
tho i wish they all don't look like star rail pass
im not an artist so the art is being done by my friend rn
but im making progress far faster than him so yeah 😭
art is hard
true true
face reveal
didnt know you are ngl
yeah
forgot to resize to 2x
What's the easiest way to enable the Plasma balance behavior outside of the specific context that it occurs in vanilla?
either through generate_ui or just put it as #1# or something, THOUGH it will leave a pretty big gap there if the "#1#" is no text
i can only think of those ngl
man
i went to hanoi (big city in my country) once and saw machines similar to those
cool asf but i didnt know how to play lol
if it helps, for visual aid for what we mean, we want to do something like this, and have the "Origin:" section be able to be hidden if a setting in config.lua is enabled. we're probably gonna head to bed soon tho so uh. if it takes a bit to implement you know why
yeah so uh, how do i make it so the second row has only 4 objects again?
oh nevermind im freaking dumb, scrap that
Lua is
cool, sometimes
cryptid has a joker that triggers a plasma balance (Sync Catalyst), maybe try looking at that?
context.final_scoring_step
Been stuck on this on and off, I'm creating a Joker that will split a Pair or High Card into equivalent pairs but with halved ranks, and I'm having trouble with handling the destruction of the original cards after it splits.
If I put a start_dissolve inside the event manager, then it'll create ghost cards when they get destroyed, and I'm not sure how to use context.destroying_card for this specific case, any insights?
uhhhh this is really dumb but how do i add a round counter to my joker, ive tried to read the documentation and cant find anything
you'd have to handle destruction with context.destroying_card and somehow hold on to those cards until then. However I don't see the need to destroy any cards at all? Can't you just modify one set of cards and then copy it?
It's for balancing reasons
If I split a 10 card, then the 10 card gets destroyed and turns into two 5 cards, currently the unsplit and split cards all go back to the deck
no I'm saying you can functionally do the same thing without destroying any cards
turn one 10 into a 5 and then copy it
seems like the cleaner way to do it
Though my past attempts of trying to rank up and down a card hasn't been very clean, very painfully vanilla and prone to inconsistent crashes
storing cards in a card's ability table always seems a bit jank for saving. which is fine here i guess because there's no saving in the middle of scoring but I still dislike the idea
yeah i see that. though in the general case the idea of halving a card's rank doesn't make a whole lot of sense
there's no practical difference though?
you're making two modified copies and destroying the original, I want to modify the original and then copy it once
if you take UnStable with no other mods that add ranks, its 1 rank has an ID of 17 and its 0.5 rank has an ID of 16, yet clearly 1 should half to 0.5 (with your current approach it will half to a 9)
isn't your idea technically cloning the card twice then killing the original

I am too tired to think right now
what I'm saying is IDs don't really mean anything
mr john steamodded
is it possible to calculate joker individual effect even if a card is debuffed
as in
no
I'd go with something like this for getting a rank that is closest to but above half the affected card's chip value (it takes advantage of the fact that the ranks table is sorted in ascending nominal order)
local new_rank
for _,k in ipairs(SMODS.Rank.obj_buffer) do
if SMODS.Ranks[k].nominal >= playCard.base.nominal/2 then
new_rank = k
break
end
end
then you should use SMODS.change_base to apply the rank instead of the jank card key manipulation you're doing
so this doesnt get buried
smods handles it explicitly, you could patch something into this function to add some degree of debuffed cards being scored
make a config value get incremented in context.end_of_round and context.main_eval if you want it to count up on blind defeated
if it's on blind selected, count up in context.setting_blind instead
yeah thats what i figured
how would i patch steamodded in lovely :P
?
Shows an example of how patching SMODS is targeted with Lovely.
uhhhh does this code seem ok
oh i didn't realise that was a message link my bad
card.ability.extra.spn_strng instead of trying to use it as a global
ahhhh
and i don't really like the reused local card, but seems good otherwise
i was wondering why it wasnt working
ahhhh
i just posted a PR for set_blind to respect ownership
and then i looked around and realized half the blind functions don't respect taking ownership
yeah blind functions are a mess
well, i kinda need this so big patches incoming i guess
regex my beloved
here's my question cause that's not clear to me
does lovely replace every match
cause yeah i could collapse that but it wasn't clear to me
yes, unless you tell it not to
it does mean you have to be extra sure of everything it will match
does regex match full lines or can it match partial lines
anything
that's going to be extra fun if an elseif already exists
thats an equal sign its just blurry
alright well
i changed it
you're still using it like a global
for i = 1, (spn_strng) do
doesn't look very changed to me
i'll be back in seven million years with something that regexes
i might be stupid...
why is your square so good john
i am in the 98% 😔

wait i can't regex this, what if the end is for something completely unrelated
i usually use regexed vscode search to make sure my patches aren't hitting weird things
What is SMODS's way of finding the same suit between multiple cards
I don’t know if there’s a native implementation
What do you want to do?
I figured that I'd go back and revamp all my old vanilla ways of checking for ranks and suits to account for modded suits and ranks, and I wonder if SMODS has anything for checking similar suits aside from SMODS having a way to change suits
If not then I still use G.hand.cards[i-1].base.suit == card.base.suit where [i-1] is just for checking the suit of the left card of a selected card
I don’t think it’s hard to check if there are same or different suits
But it depends on the desired check IMO
in the localization file, what would i need to do to detect whether uhhh, those tables have "boxes"?
there's no smods utility for that, but maybe there should be
what's the native smods way to fix my parents marriage
idk why i replied to that message
i currently want to access such information from a function
the most "correct" way would be to make a table indexed by suits and call is_suit with each one and keep count
from the top of my head, G.localization.descriptiobs.Set.key.boxes
i can relate 😭
I don’t know if it should exist
lovely does not support zero-length lookarounds :v
Because I think the best way to do it depends on the desired result
@merry raven for example, when counting the number of suits, I do something similar to what aure suggested, except I handle effects that grant all or no suits
end\n[ \t]*(?<a>if self\.name == '[^']*' and not reset .*?then) seems to catch the set_blind stuff exclusively
so
I looked around
and it's pretty much okay to catch all of them except the one for The Pillar
end\n(?<indent>[\t ]*)if self.name == '(?!The Pillar)(?<ability>.*?)' I tried this but lookahead is not supported
technically it would be okay to catch the one for the pillar too
just match the pillar and fix the mess with a second patch
Oh I have a number of different effects that requires checking for suits and ranks
- An enhancement that ranks up cards adjacent to it per hand played while it's in hand
- An enhancement that changes 5 cards to its suit when played
- An enhancement that ranks up 3 of the lowest rank cards in hand for every time this enhancement has been played before it gets destroyed in a 1 in 4 chance
Would that require vastly different methods of checking for suits and ranks or just cardfromhere.base.suit == cardfromthere.base.suit would be fine
usually just checking base suits is not fine due to cards with any/no suit
also smeared
I mean that method works but it’s not always efficient
Ranks is different
Because ranks
Damn
What's the proper way of doing so that can still cleanly support modded ranks or suits
Both for checking ranks and suits
ok the value is incremened by all copies of the joker
like having 5 of them will increase the value by 5 on all
that's because your end_of_round check is wrong

For suits there’s is_suit
I don’t think there’s an utility for ranks but you do have to beware
Ah man
I do tend to handle all/bone suits/ranks separately for efficiency
But it depends on application
And :get_id() is just an inefficient way of doing so?
it's no more or less efficient than doing it some other way. due to quantum enhancements, all jokers need to be asked if the card has no rank
It’s more about mechanics than efficiency
I think the efficiency is about minimizing the number of calls to find out a rank/suit
Which is application specific
Ah
My main concern is just my code not supporting modded suits or ranks
Efficiency, I'll cross that bridge when I get there
I think the general algorithm is something like what aure mentioned
You keep a table of seen ranks/suits, either containing a Boolean, a number, or the cards (depending on application)
You might need some of the functions described in SMODS.Enhancement
To check for all/none suits/ranks
And handle accordingly
If only is_rank() existed
that would become a thing if we ever do quantum ranks
-# i'd make an argument for adding it now, and making it (more) "functional" later (that way ppl's code is futureproofed :? )
ok so hypothetically
would it be possible to add gradients to mod badges? because i think that would be cool for Mistigris :3
but then you'd have to go over all the basegame code that'd need to be swapped to it
and if so, how would I accomplish this?
whar
yes. you can do this by making a hook to Game.update or anything else that runs every frame and change the values in your mod's badge_colour
[1], [2], [3], [4] are red, green, blue and alpha respectively
I mean a gradient doesn't have to be changing right?
i'm going for something like this
yeah that's an actual gradient then
what'd be the best way to accomplish this within the limits of the game?
no clue lmao
yeah so im tryna separate my description into boxes, but currently theres a bigass white background behind them too, how do i remove it?
oh uh, forgot to open the for loop in there
maybe what's making the background white is that you have the colour specified as background white
really? i thought its the background for the new boxes
oh i just got what you were saying
lemme see
I would probably try to copy how ortalab does it
