#š»ć»modding-dev
1 messages Ā· Page 81 of 1
oh i see
is there an smods.suit or is black magic required for custom suits?
yeah I found the code, lol
there are plenty of suit mods to steal code from though
whoops, sent illegible screenshot
yeah, I'll have to give them a look
oh that actually looks really easy
Trying to remove all vanilla content from card pools
At least... obtainable from shop/pack wise
Oh I achieved this
Thought failsafe options will show up
just patch the failsafes /hj
god, why did I decide to allow soul sprites to be added to any card T_T
how do I set the debug info level so sendDebugMessage actually shows in the prompt?
mod button -> (steamodded) config
ohh I've been looking for some kind of flag in the scropt, that works thanks
That's fine. i'm making stakes of them rn
Idk what's wrongf
you should probably check how SDM did it? that way you won't need to enter each banned key
Lol is it giving you touble now?
I can't dm them and I don't wanna ping
So, i need help, someone can show me a example of take the ownership of a vanilla joker please
Im very noob on that things
I'm just trying to make the selector look pretty š¢
ah I see
and it's not letting me add soul sprites to those texture selectors
the actual functionality in game works fine I think
But soul works like a legendary joker texture right?, so the texture will by 97x idontrememberthesizelol
And change that entire texture
should be documented on the steamodded wiki here: https://github.com/Steamopollys/Steamodded/wiki/03.-API-Documentation#taking-ownership
Okay well regardless, how do i fix my problem?
Thanks larswijn
made a high-res screenshot of a large amount of le cards file at https://mega.nz/file/wINnxbpI#078Uafl5xgYFtkAchBKYCWETIbUvigzCX8OciEkkVR8 (to bypass discord compression if you want to download it for whatever reason)
Can you send it here in a zip, mega dont work in my country
sure
discord still compressed it
original zip is over 40 MB
hm
meh still plenty of quality
its like 10000 pixels wide so unless you compress it to hell and back itll still look alright 
I have a question, you have windows right,
Because windows do these things with the size o the files
kinda goofy of windows
Example, the 8gb usb drive, but you put it your computer and is 7.4gb
not sure tbh
Yooo Ortalab stuff I see
could possibly be some kind of prefix shenanigans
i kinda wish ortalab didnt have like 12 jokers that just did nothing and had the locked appearance
might be fixed by renaming the stakes to start with your mod prefix?
Got it
that worked???
wow the stake prefixes are broken
you might want to let the people in https://discord.com/channels/1116389027176787968/1209564621644505158 know haha
... what did you change it to?
I guess changing the above_stake to include the mod prefix would've also worked
OH
game_object:523 should probably have a mod prefix attempt though
I understand why the ortalab one's are different now
...anyone have a clue as to why putting a get_straight(hand) function in my mod's lua file doesn't override it like it used to? still getting used to steamodded 1012b
or whatever the current version is
It's megabytes vs mebibytes
The ones that are 1024^2 bytes are actually technically mebibytes
True megabytes are 1000000 bytes
.
oh understandable
it... should just work?
I don't recall SMODS' overrides loading later or anything
can you send the code?
local get_straight_ref = get_straight
function get_straight(hand)
local base = get_straight_ref(hand)
local results = {}
local can_loop = next(find_joker('Superposition'))
local target = next(find_joker('Four Fingers')) and 4 or 5
local can_skip = next(find_joker('Shortcut'))
local skipped = false
if can_loop then
sendDebugMessage("Superposition detected.")
end
if can_skip then
sendDebugMessage("Shortcut detected.")
end
if not(can_loop) or #hand < target then
return base
else
sendDebugMessage("Method needed.")
return base
end
end```
WOW
for future reference, where can I find documentation about modding this game, and possible other tools that may help me
ngl, i like the idea of reusing blinds characteristics, @tepid crow guess what i am about to suggest ;)
https://github.com/Steamopollys/Steamodded/wiki
and just referencing other mods.the steamodded code itself
i wonder if its like,
possible to use lovely to patch the code of other mods
ty!
did the way steamodded handles mod config reciently change? my settings aren't loading all the sudden. It should just save your SMODS.current_mod.config table right?
would be helpful to see the code you use to handle your config
also just check steamodded commits if you want to know whether something changed
just a bunch of bools
must either be something wrong with your writing to the table or a weird steamodded change idk
doesn't seem like there have been any config affecting smods changes recently
Okay having trouble getting Vanilla only to work
It keeps trying to load ortalab loteria cards
https://x.com/zaphrice/status/1850343456960565698?s=46&t=cJUMkrBvXPpcccAnNeHQyQ Back from my hiatus to put these cards into the game
I was already planning on an AR card so yeah
whats wrong with my code (Trying to give x2 mult for each "j_fnj_gerald" you own when scoring a king)
calculate = function(self, card, context)
if context.setting_blind and not (context.blueprint_card or self).getting_sliced then
local geraldcount = 0
for i = 1, #G.jokers.cards do
if
G.jokers.cards[i].ability.name == "Gerald"
then
geraldcount = geraldcount + 1
end
end
if geraldcount > 18 then
geraldcount = 18
elseif not geraldcount then
geraldcount = 0
end
end
if context.individual then
if context.other_card:get_id() == 13 then
if geraldcount then
for i = 1, geraldcount do
message = '._.'
Xmult_mod = card.ability.extra.Xmult
end
end
end
end
end,
}
can you send the j_fnj_gerald object?
Came back on my project because of 1.0.0 and I've made it work again š„°
got me comfused in 13 seconds
oh yeah i remember that
Oh yeah aren't these jokers as cards?
HUH???
Alright, so I'm trying to make Balatro Only as a stake.
I'm using Ortalab only as a base and well... I can't get it to just have base editions
So far it works for playing cards
editions don't respect pools at the moment
Oh that's all?
Gotcha. What about blinds?
I don't think blinds do either
alright, I'm gonna check to see if the Loteria bug still occurs
SMODS.Joker {
key = 'gerald',
loc_txt = {
name = 'Gerald',
text = {
'Does something...',
'{C:inactive,s:0.7,E:1}Uhh... who is this?{}'
}
},
pos = { x = 0, y = 0 },
cost = 3,
rarity = 1,
set_card_type_badge = gerald,
unlocked = true,
discovered = true,
blueprint_compat = false,
eternal_compat = true,
perishable_compat = false,
atlas = 'atlasgerald',
calculate = function(self, card, context)
if context.joker_main then
card_eval_status_text(card, 'extra', nil, nil, nil, {message = '._.', colour = G.C.CHIPS})
end
end
}
yeah thought so, you're checking for something that doesnt exist
your joker doesnt have a name like you're trying to check
oh i thought the loc_text name was what it checked for?
how should i fix this?
can i give it a name?
the size of the returned table is the amount of geralds
the table itself is just a list of owned jokers/consumables found that match the search
weird
it isnt working still
wait hold on
nope
it borked
whats wrong with my code (Trying to give x2 mult for each "j_fnj_gerald" you own when scoring a king)
calculate = function(self, card, context)
if context.setting_blind and not (context.blueprint_card or self).getting_sliced then
local geralds = SMODS.find_card(j_fnj_gerald)
local geraldcount = #geralds
end
if context.individual then
if context.other_card:get_id() == 13 then
if geraldcount then
for i = 1, geraldcount do
message = '._.'
Xmult_mod = card.ability.extra.Xmult
end
end
end
end
end,
}
can you please use codeblocks
the key j_fnj_gerald needs to be in quotes, else you're referring to a variable named that (which doesn't exist)
sorry ...
my brother in christ not for your normal messages, for your code
honestly looking at this code makes it seem like making jokers isnt too hard
best thing is I have some experience with lua
big win
curious: can you make a joker "gain" retriggers, like how they can gain mult or chips?
spooky
still doesnt work
what if we made luchador... but better.....
yeah there's multiple other things wrong with this
I'm too tired to go through explaining everything though
where can i find mods?
for some odd reason my mod icon is loading for mods other than itself
that's... odd
I remember zen did the same thing
Rare
https://github.com/Amvoled/Taikomochi/pull/3
This pr made to taikomochi might help
oh huh
Can you show you show the code of the smods icon
its, just this
ahhh i see
ohh okay yeah that was the issue sjdhskdjh
i know sjssjs
the issue was apparently just the SMODS.init thing
okay okay cool sdfkjhsdkfjh
how do I test my custom-made boss blinds?
you can reroll blinds with debug-plus I think, but there might be an easier way
@frosty dock Why isn't there just a full skeleton header to copy? Ofc I'll just grab one from some other mod, it'd just be convientent to have it there on the wiki
how do I use the mod?
hold tab to bring up the menu
thank you
np :3
Prob cause thereās plans to switch to json format for mod metadata.
At for why itās not like that rn
Updating that part of the doc to be a skeleton w/ comment is likely better regardless of legacy or other format though.
Wait json doesnāt have comma syntax
also tbh the install guide should be a different page than any of the coding doc
I always forget it's on the same page
fair enough, I presume that's one of the things keeping 1.0 in prepetual alpha
"alpha"
Itās in the mod index PR if you want to take a look at it.
will we have 1.0.0 beta before gta6
Perpetual dev cycles my beloved
with debugplus you can go to collection and press 3 on a boss blind to spawn it
how do you destroy a card again
card:start_dissolve()
thanks
if i use card:get_id() on a face card does it return J/Q/K or 11/12/13
i think it's the latter but just to be sure
š¤ which one is preferable here?
left
Why not just texture
i don't have to make "remove-textures-from-options" do i
Deck skins are textures too?
completely different ui so i think it's fine to be separate
But I think ppl are going to be confused
Remove-options-from-options
disagree
How
They literally installed the mod and it has a diff color
As in why don't they just all in "textures"
near means within 1 line right
in the context of an error message
also is there a way I can check the stake sticker for a specific joker
Because I cba reimplementing the deck skins stuff into my nice new shiny ui when the current one works fine
just make it a top level tab if installed /hj
/halfjoker
Is there a way to generate lovely patches from something like a diff? Or do you have to write them manually? And how would you load a patch in your mod?
idk how to do the first part
but you add a file in the mod folder called lovely.toml and it just works
you put the patch in that file
not currently unfortunately
it would be nice to just support diffs but they get complicated when you want to apply them out of order
make sure the mod folder isn't nested when you do that btw, lovely is lazy and doesn't check more than two folders in for some reason, if the lovely patch isn't working it's usually because the mod folder is nested
Sweet, thanks imma give it a go
holy crap it works
well. almost
I think what I'm trying to do might conflict with other patches. Since the line given in the error doesn't seem to make sense for what the error actually says
this happens a lot, in this case
go to the mods folder and find the lovely folder
and you can find the lua files that were patched, they get dumped after a crash
the error lines should line up with these lua files
sweet
you can also find every crash log in there
the dump is only the most recent crash iirc
Thanks š At least I see what's going wrong now
yeah that's a good thing
i wish I knew where my error was
there's one more { than } in my code
and I don't know where it is and the code won't tell me where it is
and it crashes
so
Ok so this might be weird but a friend of mine who is also my comp sci tutor just gave me an assignment to mod balatro. Is there anything I should know before I start to tackle the impossible?
it's not impossible
lol, but it really depends on what the assignment is
it's actually pretty easy if you have any coding knowledge especially if you learn it properly
I jumped straight into the deep end and I'm getting functional content out
Iām literally in comp sci 101 rn
i had none š
I have some programming knowledge in Java and Python but nothing too crazy
(Still have none but that don't matter)
then you'll probably be fine, just don't be surprised when you find out lua does not use indents
you have to be very very careful with the placement of your ends
the lack of required indentation and the specific end placements is the stuff that gets me all the time
you should be alright then
Alr- sounds good
$5 ill make the mod for you /j
if you see a mod that does something you wanna do
go look at the code
go borrow their code
$4 and a cookie. Thatās the best I can do /j
thats a bargain fr
Well they said to just change the names of the hands and if possible to code in the scoring to show before the hand is played
The second one was just one of his complaints with the game lol
that first one is pretty easy
2nd one already is a mod for right?
you should use a lovely patch, directly changing the files is iffy
Lovely patch?
or do neither and use steamoddeds inbuilt localization changing
because it lets you do that iirc
it's not hard to figure out
you can't lovely patch loc files
not unless it changed recently
lol he said I should do it through melonlpader
bros so out of date
wait
melonloader is
okay but steamodded is better
I KNOW
š
what the hell
i'm not sure how to feel on required indentation
on one hand it is so dumb, i hate whitespace being important
on the other hand it's like, why am i hating it, i'll indent it properly anyway
.
Itās hard to argue with him tho since heās literally a Google admin so whatever he says I blindly trust
it's very easy to argue with him in this case
he sounds like he doesn't know what he's talking about in this case
I know I just told him that itās on lua
the engine is called love2d right
But heās working rn so š¤·
it is, yes
love2d ~= unity
oh yeah the symbol for not equals is ~= and not != and it annoys me
just got the eternal. rental and perishable stickers to go I think
ayyyyyyy
also, my mod's name is too long, lol
my poor racoon's Fortu reaction
It's called Homos, lmfao
hehehe
Obviously not meant derogatorily. I mean the "Gay" in my name isn't just for show
actually, the balacord name is cut too
Balacord Playing Car
Or racoon's fortune
Well that kinda loses the wordplay
like this nonsense doesn't
I thought we'd made it so it didn't cut off
maybe that got lost in a dead branch somewhere along the way
No Laughing Matter works? which feels almost as long
well I guess I only have 2 letters cut off
so that scans
I'd love to do Poor Coon's Fortune, but that specific abbreviation of raccoon has unescapable unfortunate connotations in most contexts.
Is the halo around the homo suit graphics just because they're so light colored?
Can't see any reason for them in the actual images
Is there a vanilla or SMODS function to copy an Object item?
i dont know why i was tagged in this but hell yeah
whoopsies
I had hit reply to you about something different and forgot to clear it
but thanks :3
š
hey I cant find the mods folder in my balatro game directory
it's in %appdats%/balatro
yeah I think in Windows the %appdata% is a shortcut there
yea %appdata% for roaming
been a while wince I've used the old winders
mint
you're on windows right?
press win+r and type %appdata%
show hidden files
its a setting somewhere on file explorer
oh you got it nvm
oh yeah I forgot microcock winblows does that
not like linux doesn't
I'm just so used to never actually hiding hidden files
what is the point of hidden files if you can just still see them
to protect the user from themselves, lol
it's just easier on linux. to hide a file or folder. just name it starting with '.'
and to show hidden stuff it's just a right click checkbox in the file manager
my modpack is technically in a hidden folder, lol
all 3 of these are just in "/home/[me]/.steam/steam/steamapps/compatdata/2379780/pfx/drive_c/users/steamuser/AppData/Roaming/Balatro"
but I have them bookmarked for obvious reasons
path is an absolute mess because proton
.working is where I keep my github repos and stuff (besides the modpack which gets its own folder)
ayy nice
So, for the suits part of my mod, I kinda wanna have 3 options (besides off). One is they aren't in the base deck, but are in pool for standard packs and card-spawning spectrals, one is they replace the vanillia suits totallly in pool and in the deck, and one is where they coexist with the vanillia suits in an unwiedly 8 suit system (they'll be 4 of them even though only 2 are made so far). The last of which seems to be the default. How do I make the other 2 options?
ok so, first thing imma do is just make a custom challenge. that shouldnt be too hard... right?
if it were me:
option 1)
create the suit first but have the deck include no cards, sort of like checkered deck
option 2)
overwrite the suit completely in the code, make diamonds = newSuit and just go for there, overwriting the sprites and whatnot
well smods.suit exists, so I don't have to go quite so nuclear
and for the last one where it doesn't spawn in deck, but does in standard packs and stuff, that's basically what bunco does
it's only the example of replacing the standard suits in decks I don't really have an example for
again, just overwrite the code for the specific suit, change the suit ID to something else
unless im stupid and that doesnt work
how 2 make madeline not look demonic
it'd work I think, I just want them to be independent suits in other contexts, so I don't think it'd be ideal
it'd be weird if jokers for hearts worked on ringtails in one mode but not another, for instance
thats why you'd change the ID, so that the hearts jokers dont work anymore
basically make the suit, then update the vanilla suit to be equal to the new one
so that either way you can have it
well 2 of the 4 suits are made and showing the default behavior of being added to decks. So instead of 4 13 card suits they have 6. I guess kinda what you're saying is to find how it loads those sets for the decks, and replace it with my suits, while also making sure they don't load as seperate suits
which was kinda also what I was thinking
pretty much
look at my lovely list of things left to do on textures
To continue what I accidentally put here:
#1300294374575308983 message
So, I presume there's a standard deck generating function that adds all the suits? Because when I add the suits normally they seem to add on top of the standard ones, even in modded decks
ayy very cool
I would assume so, though I havenāt done any work with suits
@frosty dock you probably have more insight here, having worked with suits (and possibly written SMODS.suit?)
written and rewritten, actually
(makes sense, lol)
all of this can be done using in_pool functions
the second argument may be a table with an initial_deck field set, indicating the call is for generating a starting deck
just with this, you get the following behavior that can be configured for each suit:
falsealways [never appear]falseoninitial_deck,trueotherwise [in pool for standard packs etc., but not added to starting deck]trueoninitial_deck,falseotherwise [not in pool for standard packs etc., but added to starting deck (idk what this would be useful for)]truealways [always able to appear]
to exclude vanilla suits instead of your suits, just swap the functions around basically
you might take ownership of vanilla suits to set their in_pool to always return false, then they don't appear at all and you can do with your other suits as you please
sorry for the interjection but is this the same for the SMODS.Rank?
I tried it out earlier today and the standard pack RNG seems to calls in_pool with initial_deck = true as well
sorry for the noobish question, but what wouls the syntax be for this?
I think I understand the rest of it pretty well
[suit]:in_pool({initial_deck = true})?
huh, it appears that is the case even though it shouldn't be
I assume you meant this?
in_pool = function(self, args) --Returns true if it's in the pool, false otherwise
--Checks if it's initial deck spawning
if args and args.initial_deck then
return <whatever here>
end
--Other cases for standard packs
return <whatever here>
end
i think i just never reviewed that? I have to assume there's a reason for it to have been done this way but it might have been by mistake
ah I saw that in bunco and wasn't sure where args came from
guess it's a vanillia or steamodded table
from a quick looks it's a part of the lovely patch injected by steamodded
nevermind, standard packs just don't respect the pool
for ranks I guess? because I definitely don't get bunco exotics in them unless they're "discovered"
what to do about table index = nil?
the function does seems to get called and is respected I think
It's a part of pseudorandom_element function (functions/misc_functions.lua) and it does work accordingly to the return value bc I ended up workaround it by making it checks for game-specific global flags instead that sets to false at the beginning of the game, but flips to true afterwards at some point
(the second line is just inspect(args))
what am I missing?
They're not in standard packs or spawning at all now
probably the same problem as I had with ranks earlier, actually.
I just modify bunco exotic suit in_pool function to check with prints and it seems like initial_deck was true in the standard pack as well, so even theirs would never spawn in the standard packs at all
could have been recent steammodded change?
I do remember buying exotic suits from shops as well, but apparently I tried it just now and shop playing cards from Magic Trick vouchers also triggers initial_deck = true as well
not a huge deal as the mode without them in initial deck is kinda an afterthought anyway
but not ideal
I could test some theory rn, but if it works am I allowed to make pull request to the steammodded repo and/or at least report what happened here?
Yeah you can make a PR if you fix it š
thank you very much š
I'm on it
would it be possible/not totally batshit, to use lua string matching to exclude jokers which mention the original suits in their description when playing without them?
string.find on the description of the cards
I think he's asking if he should, not how
indeed
Keep in mind a blacklist is untennable with 1300 jokers
hm, alr
nor would it make sense to rely on something that mod makers need to implement
tbh I'm probably gonna do it even if it's a bad idea, lol
worst case the game hangs for a couple seconds as it's iterating over all the jokers
nbd
oh yeah that is a WIP and will not be available for use for the next couple of months I think lol
got the vanillia suits out of pool (the spades and diamonds are 'different suits' and placeholders) but how do I get the ui to not act like there's 8 suits?
ignore the mismatching UI display, lol
you mean in the bottom left?
yeah and it's also why the buttons are off the screen I think
and done! I'll post the information in the Steammodded thread as well in a bit
hmm that seems more like the fault of cardsleeves š
maybe, but it wouldn't be an issue if the unused suits weren't there, lol
or even if they were all one one line (they would fit juding from the line above)
yeah cardsleeves is the mod that puts those first 4 suits on the same line
well if it did it for the next 4 we'd be all good :P
though I'd still want them gone probably. They're literally unobtainable with this setup
yeah I can do that if you want
yeah that'd be cool :3
tbf the UI should be changed to exclude suits that are both absent and not currently obtainable
yeah that'd be very useful
tbh bunco exotics don't show up there
so it must only be the vanillia suits that always show up
unobtainable suits are hard to quantify though
wouldn't it only be decks that start with that specific suit?
I mean all decks start with all initial_deck suits, unless otherwise configured
I was just thinking of checking in_pool's return value
yeah makes sense
bunco's suit has hidden = true property and iirc that's read by the deck preview UI so you could probably take ownership of the vanilla suit and adds them, but if you managed to zero out the suit, it would disappear from the HUD as well
Would it check for the existence of them in your deck first?
oh that's what that does
yeah I can just add that
I could see a situation where people create a suit that can only be accessed from consumables
I already took ownership to remove them from the pool
I noticed that when I had to completely rewrite deck preview UI for my own mod to support it but for rank lol
(ended up really messy though so I don't think I can release it by itself for public)
right, hidden exists, I actually forgot
i guess we can hide if no cards of that suit are present and either hidden is set or in_pool is returning false
ayy, perfect
wouldn't only using hidden allow for more control?
should steamodded use the 4-wide tally boxes by default if there's more than the base 4 suits?
I don't see why not
well it doesn't actually hide if they're in deck
right, there's no need for this change
so i don't think it matters
is that a yaoi suit
it shouldn't hide while in deck either way
It's called Homos, lol
Amazing
no, but would you really want the suit indicator to be hidden once you have it in your deck?
No release until there's actually jokers and tarots to make use of the suits
ofc not, just saying that I don't think any control would be removed
if someone wants the suit indicator to show
I guess control to clutter
setting hidden=false won't always make it show, which is confusing
but I guess that's just fine
yeah true
and for aesthetics I can see wanting it
and yeah, this is a good idea - though my mod also already partially does this, so I might need to resolve a conflict there š¤
always showing is the default behavior, and i guess it should stay that way
agreed
my ass reminding people my shitty suits exist even if they aren't using them (as long as they have that part of the mod enabled)
not too keen on altering vanilla UI when nothing's changed by mods about it, so I'd rather keep 4 suits on two rows
also maybe fix mod badge truncation
5/6 suits also look better if balanced, so I might account for that
did you look at the steamodded header for it?
it's all there
DISPLAY_NAME
oh lol
I doubt it'll fix any truncation, but you can at least set some sort of acronym
if that's not good enough you can ask aura why it truncates (I'm assuming it's a font size issue)
nah same thing
if i may ask, what mod are you using for the extra suits? or are they just recolors
it's a mod in development by me
ah
they will be real extra suits
any mod you'd reccomend with extra suits otherwise?
and there'll be 4 of them
There's SixSuits by @frosty dock himself
which that is a parody of
SixSuits is updated
download the code, not the release
thank you
wait quick question would I be able to actually make card skins for entire suits (without altering jokers and other things), because I wanna be able to do that rather than make new suits
like just retextures of exiting suits?
yeah
yeah you could just do that with a normal texture pack or #1284376286789111940
oki doki, pretty cool
Oh maybe it was this that we made not truncate?
coonie says it still truncates
Yeah it showed up the same
add another badge underneath the mod name one that says "ne" /j
Lmao
I was asking about this earlier, but what are good ways to test stuff that require RNG to find in a normal run? (jokers, blinds, consumables, etc.)
You can bring up the collection with the esc menu and hover over things and press 3 to spawn them
thanks
anyone up for proof reading some docs and doing some preliminary texture testing?
yeah maybe, what for?
sure, I have a bit of time
wilson where has the dog gone
is there a way to log something to the console for debugging purposes?
I had a question about mod development, i want to make simple integer changes to the game to experiment with a balance change mod . how reasonable/simple would this be ?
You could print, but I suggest using https://github.com/Steamopollys/Steamodded/wiki/Logging. Make sure to change the steamodded config to show trace logs and above if you use the second option.
Also DebugPlus lets you see console in game which is fairly convient
how does the game store the player's current jokers?
oh it's G.jokers.cards not G.jokers isn't it
yeah
G.jokers is the area and it stores more stuff than just the jokers itsel
like the max size,
makes sense
thanks
and now I have a version of the Joke that punishes you in a way that isn't intentionally unbalanced
does this respect eternal compatability?
yes
nice
yeah I just tested it with a mixture of jokers that should and should not be able to become eternal
and art by me to start
(at least the suits)
i am setting balatro scoring calculation on fire (ft: the blind has a deck ooo
What the
big issue of a mod im working on
I did not comprehend that at first lol
so basically
- the blind has its own deck
- what you're supposed to score is your hand's score minus the blind's score (but due to me not understanding the way events are laid out you end up with some bullshit like this)
- the blind picks random cards from its deck atm lmao
- unrelated but i have cryptid installed
and i have grown severely angered at the way score is calculated 
Infinity text jumpscare
this is normal trust me (it isn't
)
this is crazy
ooooo id like to taste some textures
wait you said test
whatever im down for tasting and testing
are you finally making a mod? :OO
The Half-Joke
well the joke's on me because now I'm trying to make it display the actual score that you need to exceed for the effect to trigger but idk how to access the variable for how many chips you need to beat the blind
Itās calculated based on a few variables
I forgot exactly which because itās been a while since I coded Blinds, but itās the variable for the base ante score times the multiple of the base the blind has
could also use G.GAME.blind.chips if youāre in the blind
is it get_blind_amount(G.GAME.round_resets.ante)?
for the base?
ok I feel like I'm doing something wrong
loc_vars = function (self)
self.vars = {""..(get_blind_amount(G.GAME.round_resets.ante) * self.mult * G.GAME.starting_params.ante_scaling * 1.5)}
return self.vars
end,
You should return { vars: { ... } } in this function
strange
cuz it's working for my collection_loc_vars
collection_loc_vars = function (self)
self.vars = {"{3X Base}"}
return self.vars
end,
dang that did the trick
thanks
yall know what i'm doing wrong? (Im trying to make this joker give 2x mult per "j_fnj_gerald" when scoring a king
calculate = function(self, card, context)
if context.setting_blind and not (context.blueprint_card or self).getting_sliced then
local geralds = SMODS.find_card("j_fnj_gerald")
local geraldcount = #geralds
end
if context.individual then
if context.other_card:get_id() == 13 then
if geraldcount then
for i = 1, geraldcount do
message = '._.'
Xmult_mod = card.ability.extra.Xmult
end
end
end
end
end,
}
bruh
BRO WHY ARE CODEBLOCKS NOT WORKING
RAHHH
bro
Put a space after the first ```.
are you like... escaping the backticks?
yall know what i'm doing wrong? (Im trying to make this joker give 2x mult per "j_fnj_gerald" when scoring a king
lua
calculate = function(self, card, context)
if context.setting_blind and not (context.blueprint_card or self).getting_sliced then
local geralds = SMODS.find_card("j_fnj_gerald")
local geraldcount = #geralds
end
if context.individual then
if context.other_card:get_id() == 13 then
if geraldcount then
for i = 1, geraldcount do
message = '._.'
Xmult_mod = card.ability.extra.Xmult
end
end
end
end
end,
}
yall know what i'm doing wrong? (Im trying to make this joker give 2x mult per "jfnj_gerald" when scoring a king
calculate = function(self, card, context)
if context.setting_blind and not (context.blueprint_card or self).getting_sliced then
local geralds = SMODS.find_card("j_fnj_gerald")
local geraldcount = #geralds
end
if context.individual then
if context.other_card:get_id() == 13 then
if geraldcount then
for i = 1, geraldcount do
message = '..'
Xmult_mod = card.ability.extra.Xmult
end
end
end
end
end,
}
What did you do different?
literally copy-pasted your message
Huh, maybe a mobile bug? Idk if Average is on mobile too atm
Test code block
No that works
Stupid discord
lol
oh I think I saw the issue
it's using the underscores as text formatting, overriding the code block
silly discord
underscore formatting shouldn't cross
multiple lines
oh
it does
š¤
discord preview is a liar
_```lua_
code block should also take precedence yes
```
turns into
```lua
code block should also take precedence yes
OH
So the only possible difference I cab at what's the same message would give different formatting is I have emoticon to emoji parsing off.
But then this?
Idk why it just worked to copy my message, lmfao
your message already had the italics applied so I couldn't copy them, I think
or it's a mobile thing idk
Lmao weird
#1298894429159166043 message
Poll about my mod (apparently you can't forward polls)
is there a way to make --- MOD_DESCRIPTION have multiple lines
It says text is wrapped automatically
I guess stylistic line breaks aren't accounted for
i mean yeah that makes sense but i mean
doing
something
like
this
oh
shame
i guess with enough spaces it'd roll over?
it's usually \n
oh i don't know coding jargon maybe it does
Yes, mobile brainfart
.
the excessive spaces don't work anyway
doesn't work, it just says "bunch of stupid stuff \n Credits: \n Miser [...]"
doesn't actually line break
yeah I think I tested it myself too before, it doesn't work
unfortunance
that's a neat idea
kinda like the hook, but harder unless you need those cards to make hands in which case it's marginally easier
Anyone know of any good tutorials for writing my own injections? I have I feeling Iām gonna need to do that sooner or later
with lovely?
Yeah
thank you
weathergirl mentioned
If people could chime in that would be handy #1228149931257237664 message
I seem to have gotten the game stuck
oh hmm
my watcher might be implemented wrong
how does balatro refer to the remaining number of hands
G.GAME.current_round.hands_left
Thoughts?
(the api will not look like this when done)
I'm eepy now but will work on this more later
the agony of forgetting a parameter when redefining a function and wondering where the hell nil came from
#1298894429159166043 message
Anyone who's interested in my suit mod, and wants to vote on default handling of the new suits, there's a poll here
y'all do know this isn't Bunco and these will all be options, including just turning the suits off, right?\
:P
In any case, I'll respect this poll, however it turns out. It very well may have different defaults when part of my mod pack though, lol. Because that last option's one I'd personally never use
it'd be really nice if someone has the basic set of suit jokers already in smods 1.0 format (any sinful and all the stone/gems) because I'm pulling a flounder for my mod and will be reusing those 4 times over, lol
sorry i need another set of eyes on this, getting unexpected symbol near '}' on line 265 and cant figure out why š¤·āāļø
need another end, right now you're just ending the if statement, not the function
yep, lmao. thank you
no worries, very easy to miss stuff like that
I wouldn't mind porting the ones from flounders but... it's all coded like this
@wintry solar I'm right in thinking this is an odd stylistic/workflow choice, right? (context is unported 0.98 mod)
yeah that's what 0.9.8 code tended to be like
really with the seperation like that? Guess I got lucky with DeFused, lol
Fusion was written 'normally'
it was so you could iterate over a set of them and only need one call of SMODS.Joker, this one doesn't seem to do that though
I know some people still use this style, and it has its benefits, it's just hard to work with for a total amatuuer who didn't write it and prefers a doifferent style
cryptid uses this style still
I'm not keen on it
https://github.com/Eremel/Aure-Spectral/tree/main look at this lovely simple texture pack š
yeah I thought that was a bit weird. tbh with this mod largely being 5 jokers repeated with different suits, I'd expect something even more strange and compressed
ayy nice
wait I can read those commit names
Malverk it is? I presume that's also Icelandic
Yeah 'Painting'
Fitting name
@wintry solar are you Icelandic, or just a fan of the language?
neither, I was just looking for interesting translations of magic to start with š¤£
turns out icelandic has some interesting sounding words
ah lol makes sense
I think it's nearly ready to release, just making up a few examples
and yeah it's unsprising the closest living relative of the language of the vikings is rather poetic and magical sounding
where did that marvel planet texture pack you've been showing off come from? Or is that being released with the mod?
and very awesome
I'll probably finally use texture packs now, lol
it's in the modding channel somewhere
I'm waiting for permission to use it as an example š¤
besides the self.ability.name part, which I'm pretty sure isn't needed as the calculate function can just be in the joker definition, what, if anything needs to be changed for this for 1.0?
replace self with card
and define card in between self and context
yes, even put card = card
So for "Danger Stick" the version of this joker for my Ringtails suit, it'd be like this?
calculate = function(self, card, context)
if context.cardarea == G.play and not context.repetition and context.other_card:is_suit("Ringtails") then
return {
chips = card.ability.extra.chips,
card = card
}
end
end
yep!
yeah, i have
absolutely no idea how to use the new self variable
doing it this way works. i don't question it.
When using find_joker or find_card, does the returned joker know if it's affected by blueprint?
I dont think they account for bp
i might be on a wild goose chase anyway. im modifying the lucky cards odds with a joker. got it working, including multiple copies amplyfing the effect, via a patch, but don't know how i would account for blueprint
a previous attempt was modyfing the game probability itself and then resetting it after calculate was done, but multiple copies made the probability balloon over time
Iād imagine stuff like that generally isnāt blueprint compatible
that's fair
You could definitely do it by modifying the value in your function though
Just need to increase in context.before and decrease in context.after
yea it worked for one, saving the previous probability and resetting after. but when a second copy was present, the second reset didnt set it back to the original probablity; it was reset to what the previous card modified the probability to be
calculate = function(self, card, context)
if context.before and context.cardarea == G.jokers and not context.blueprint then
print("Hello fixed odds")
local allAreLucky = true
for _, scoringCard in ipairs(context.scoring_hand) do
print(scoringCard.debuffed)
if scoringCard.ability.name ~= 'Lucky Card' then
allAreLucky = false
end
end
if allAreLucky then
self.ability.extra.triggered = true
card_eval_status_text(card, "extra", nil, nil, nil, {
message = "More likely!"
})
for k, v in pairs(G.GAME.probabilities) do -- this is what oops all sixes does
G.GAME.probabilities[k] = v * self.ability.extra.increaseOddsTimes
print(k .. " is now " .. G.GAME.probabilities[k])
end
allAreLucky = false
end -- end all are lucky
elseif context.after and self.ability.extra.triggered then -- clean up after trigger to not inflate all probabilities forever
for k, v in pairs(G.GAME.probabilities) do -- reset probabilities
-- something is fucked if theres another instance of this jimbo
print("RESET PROBS")
G.GAME.probabilities[k] = v / self.ability.extra.increaseOddsTimes
print(k, " after is ", G.GAME.probabilities[k])
end
self.ability.extra.triggered = false -- reset state
end -- end if context
end -- end calculate
was the original code
now it's this mess
[[patches]]
[patches.pattern]
target = 'card.lua'
match_indent = true
pattern = """
if self.ability.p_dollars > 0 then
if self.ability.effect == "Lucky Card" then
if pseudorandom('lucky_money') < G.GAME.probabilities.normal/15 then
self.lucky_trigger = true
ret = ret + self.ability.p_dollars
end
else
ret = ret + self.ability.p_dollars
end
end
"""
position = 'at'
payload = """
if self.ability.p_dollars > 0 then
if self.ability.effect == "Lucky Card" then
local prob = 15
if next(find_joker('j_dogmod_fixed_odds')) then
prob = prob / (#find_joker('j_dogmod_fixed_odds') * 2)
end
print("probabilities", prob)
if pseudorandom('lucky_money') < G.GAME.probabilities.normal/prob then
self.lucky_trigger = true
ret = ret + self.ability.p_dollars
end
else
ret = ret + self.ability.p_dollars
end
end
"""
i have encountered a very annoying problem
this code returns nil at ipairs(G.play.cards) which doesn't make any sense to me because i have other jokers under the same contexts that do not return nil at this point
I don't understand why this one specifically returns nil
It's an underscore in the pic, not a . ?
easy to get blinded staring at something like that
yeah
How are you changing it?
How are you changing it?
Internet is very spotty here, but Iām assuming you are either adding or multiplying the existing value, so in the after just do the inverse operation instead
you know something, @cursive ocean?
i did that exact thing in my personal mod
with one-armed bandit
feel free to take a look in my code for that! ^^
could you link it? @narrow pollen
Interesting
Yeah it's what I am/was doing. If all are lucky multiply the normal probability by 2, then in context after divide by 2. Which works for one instance of the joker. However, it seems that if there are multiple instances of the joker, the resetting logic doesn't work properly
But if I don't care about blueprint, the patch approach should work the same, and won't conflict with any existing functionality. All done in place without modifying any global variables, which seems a bit cleaner
can you send the calculate function you had? that should 100% work
it's this one #š»ć»modding-dev message @wintry solar
you could maybge throw it in an event
Theee resetting? With an "after" trigger?
ye
ima try it out
No dice, with this code
calculate = function(self, card, context)
if context.before and context.cardarea == G.jokers and not context.blueprint then
local allAreLucky = true
for _, scoringCard in ipairs(context.scoring_hand) do
print(scoringCard.debuffed)
if scoringCard.ability.name ~= 'Lucky Card' then
allAreLucky = false
end
end
if allAreLucky then
print("All scoring cards are lucky")
self.ability.extra.triggered = true
card_eval_status_text(card, "extra", nil, nil, nil, {
message = "More likely!"
})
for k, v in pairs(G.GAME.probabilities) do -- this is what oops all sixes does
G.GAME.probabilities[k] = v * self.ability.extra.increaseOddsTimes
print(k .. " is now " .. G.GAME.probabilities[k])
end
allAreLucky = false
end -- end all are lucky
elseif context.after and self.ability.extra.triggered then -- clean up after trigger to not inflate all probabilities forever
print("reset probabilities")
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.3,
func = function ()
for k, v in pairs(G.GAME.probabilities) do -- reset probabilities
G.GAME.probabilities[k] = v / self.ability.extra.increaseOddsTimes
print(k .. " after is " .. G.GAME.probabilities[k])
end
return true
end
}))
self.ability.extra.triggered = false -- reset state
end -- end if context
end -- end calculate
The result for one instance is
INFO - [G] All scoring cards are lucky
INFO - [G] normal is now 2
INFO - [G] reset probabilities
INFO - [G] normal after is 1
but for two instances
INFO - [G] All scoring cards are lucky
INFO - [G] normal is now 2
INFO - [G] All scoring cards are lucky
INFO - [G] normal is now 4
INFO - [G] reset probabilities
INFO - [G] normal after is 2
So it seems like the after is only visited once hmm
Something with the triggered flag?
oh
self should be card
self refers to the center object, which is shared across all cards, card refers to the actual card object
you don't need the event anymore either
Even better
If I wanted to modify the loc_txt of a joker (or well probably any center) on the fly, how would I go about doing that? I tried doing this
G.P_CENTERS.j_jam_buckleswasher.loc_txt.name = "late for dinner"
G.P_CENTERS.j_jam_buckleswasher.loc_txt.name_parsed = nil
G.P_CENTERS.j_jam_buckleswasher:process_loc_text()
``` but it crashes when hovering over the card
this process doesn't seem to remake the name_parsed
I also am not sure where this is created
tried grepping balatro and SMODS for _parsed but no luck
did you consider returning a different key in loc_vars? or is the change too dynamic?
here's what I used to do at some point, but it's very clunky
local function reinit_localization(sleeve_center)
-- only reparses the description text
local set, key = sleeve_center.set, sleeve_center.key
G.localization.descriptions[set][key] = sleeve_center.loc_txt
local center = G.localization.descriptions[set][key]
center.text_parsed = {}
for _, line in ipairs(center.text or {}) do
center.text_parsed[#center.text_parsed+1] = loc_parse_string(line)
end
end
I'd reassign to the appropriate field in G.localization (accessing loc_txt.name or whatever isn't consistent with localized loc tables and loc files) and then run init_localization() to reparse
using key on loc_vars is probably better if it's not too dynamic, but it should be more consistent to just have it reparse everything unless that's too slow
Thanks I'll take a look. It can be a little slow, but preferably not slower than a second. I want to be able to make live updates to a joker so it's not super dynamic but it'll likely be run a handful of times per session
do you need to rerun init localization?
you can just manually parse the the entries you're editing
yeah but it doesn't generate boilerplate/duplicate code
Hey did the new update change anything to how scoring calculations are done?
Bc I swear my code was working fine, but now it doesn't add the chip and the mult to the score
Is there a way to make wild cards only count as suits that are in_pool?
I mean it's obviously possible. Anything is. I just mean preferably without a lovely patch or me wanting to bang my head against a wall
You probably need a lovely patch
I presume one way would be to take_ownership of wild cards and rewrite their calculate function? Or are they hard coded enough where that'd be a pain?
in_pool was only added to places that generate things so the likely answer is no.
Wild card enhancement already operates manually for anything that isnāt handled with is_suit so take_ownership wouldnāt do much for this.
Either that or it was moved to any_suit which iirc doesnāt care for suit in_pool.
The more I think of it, the less it seems nessacary. With bunco or something installed all wild card flushes would be spectrums either way
And i plan to exclude jokers that effect vanilla suits when only mine are loaded and vice-versa
Wait... false
Dammit
Forgot you needed 5 suits for a spectrum
Though I also wasn't really planning to try to exclude the bunco suits?
So it shooould still behave pretty much as expected?
Nearing the last chance to vote on default handling for the new suits in
#1298894429159166043
Note that all of these options will still be in the mod, this is just for default handling. Also note that at first all content will be related to the new suits
how do I store unique global state for a blind in a way that'll be saved? (i.e. I need the boss blind to do something exactly once and only when a condition is met)
like per run global or per boss instance global?
I belive you can just store objects on the blind object
so just self.spent = true or something like that?
try it and see
yep that worked. thank you
now to make sure this blind works with every single poker hand
me when my drawn high card gets discarded šØ
me when my drawn high card gets discarded
(I have burnt joker)
I presume you drew into a 4oak?
yeah
some further testing will be needed to figure out what went wrong
okay I found out what went wrong by the lack of debug statements
idk why self.spent is already true but it is
How did you initialize it?
Yeah that's how I'd do it
well it... worked
but for some reason it discarded a 5oak instead of a 4oak
that's gonna be a pain to bugfix
How can I start creating a mod for Balatro?
#1298894429159166043 message
Any last minute votes for the poll about my mod?
if you dont know any lua start there
then if you're looking for a general jokers/consumables mod, you would need Steamodded
the project also has example mods for using the API
https://github.com/Steamopollys/Steamodded/tree/main/example_mods/Mods
and wiki
https://github.com/Steamopollys/Steamodded/wiki
also you can use 7zip to open Balatro.exe as an archive to view source code, which is helpful for more niche cases
I want to auto-Foil this card, using this code, some of it nabbed from Cryptid, but the auto-foiling doesn't work.
I also got this error while looking at the Collection with the cards inside
503 corresponds to a copy of "return { vars = { card.ability.extra.counter } }" for another edition.
Apparently I copied literally none of Meteor's auto-foiling code
I narrowed it down to this code in Cryptid.
-- Literally just for the Overlay cards
function create_card(_type, area, legendary, _rarity, skip_materialize, soulable, forced_key, key_append)
local card = Card(
area and (area.T.x + area.T.w / 2) or 0,
area and area.T.y or 0,
G.CARD_W * (center and center.set == "Booster" and 1.27 or 1),
G.CARD_H * (center and center.set == "Booster" and 1.27 or 1),
front,
center,
{
bypass_discovery_center = area == G.shop_jokers
or area == G.pack_cards
or area == G.shop_vouchers
or (G.shop_demo and area == G.shop_demo)
or area == G.jokers
or area == G.consumeables,
bypass_discovery_ui = area == G.shop_jokers
or area == G.pack_cards
or area == G.shop_vouchers
or (G.shop_demo and area == G.shop_demo),
discover = area == G.jokers or area == G.consumeables,
bypass_back = G.GAME.selected_back.pos,
}
)
if card.ability.name == "MASS_foilOverlay" then
card:set_edition("e_foil", true)
end
if card.ability.name == "MASS_holographicOverlay" then
card:set_edition("e_holo", true)
end
if card.ability.name == "MASS_polychromeOverlay" then
card:set_edition("e_polychrome", true)
end
if card.ability.name == "MASS_negativeOverlay" then
card:set_edition("e_negative", true)
end
return card
end```
But it still doesn't work
What do?
how does balatro refer to the number of remaining hands
.
Wilson answered immediately when you asked yesterdat
yeah thought you must've lol. It's easy to do when you aren't @'d
how to spawn specific joker with the create_card
Use SMODS.create_card and provide the key
last argument (forced_key), use the key of the specific joker
wait where do i put the key?
local card = create_card('Joker', G.jokers.rock, rock, 0, rock, rock, rock, 'rock')
That's the vanilla create_card function. The smods one is way easier tbh
wait how do i use that
Seems to be one of the many undocumented steamodded functions (unless I just missed it on the wiki)
Here's how it's defined in the code itself, if you can make any sense of it
Someone told me how it worked once, lemme see if I can find it
ok thanks
Apparently it's this simple
Also this is the format for keys, not what you were doing
I haven't heard of 'rock' so I presume it's from a mod, so would have a prefix. That's what "mc" is in the example
ahh ok
SMODS.create_card is functionally the same as create_card but since itās a table instead of a regular function call you donāt need to specify everything.
thinking about steamodded's indexing functionality again... if we're going with an external launcher/updater that's surely post beta
so maybe we just merge what's there now of the index branch (for metadata files and a UI change that doesn't really belong there) and figure out the rest later?
If we think itās best yea
also the PR has been open for 2 months, I don't really need it to diverge any further from main
Getting back into pretty bad PR backlog again.
At least the simpler bug fix changes got merged
we're feature freezing
Currently open pull requests will be reviewed and finalized. No other new features are to be merged before the move to the beta stage is complete.
We're about to get a release for the first time in months babbyyyyy
(oops sorry for the tag)
nws
š beta
heck yeah
Rarity API is no longer in prison
Wait this birthed a 3 AM mod idea: this Issac mod but in Balatro whenever thereās a soul card.
Its no longer in draft?
Left draft last month
what would be dancing
Oh
Jimbothy
this a typo? shouldn't legendary be 4
Whoops
I should probably just make that a global since itās used in a few places whenever string vanilla rarities need accounted for
eh, it's whatever
can't spot any other issues so I'll just merge, surely nothing will go wrong
surely
that leaves (besides stales) the deck skin PR being still in review and the tag list draft
Aure on a mad one spamming me with emails
lmao sorry
Update: Selling function works, but the "apply edition to this card everywhere" thing does not. Will tinker further.
Make sure cryptid itself (or any other invasive mod like it) is not running btw, their override might break your hook š¤
it's not, don't worry
Code so far.
Purpose: These cards are supposed to have their respective editions EVERYWHERE, or at least, when you get them. Does not seem to work.
you should be matching by key afaik
though idk why it isn't still working
that's because create_card is the wrong function for that, you can just use set_ability
...but how do I hook into set_ability?
I don't think you need to hook into it. just put it in the joker's calculate function or smth
š
could easily be mistaken though
it's a separate function
but yeah, you just put the function on the joker object
maybe just the set_edition function itself?
š
no, like I said set_ability
what are you trying to do?
set_ability = function(self,card) card:set_edition('e_foil',true) end,
IT WORKS
yes, just a brainfart typo, lol
code for one of the cards
please stop with this horrible edition syntax
should probably say how to do it right instead of just saying that tbh
card:set_edition('e_polychrome', true)
i mean i did right above
.
ah very fair
I ask here because the smart people is here... Balatro mobile have a memory leak (buffer overflow???) Because is the only game i have what in a random moment GETS EXTREMLY laggy, and the game works bad, the motion, the movement, the animations work bads
And only happens with balatro
Other games work fine
Even PC version have memory leak, most likely in shop
Hello everybody !
I don't understand, I have my lovely.toml at the root of my Mod folder : "../Mods/MyMod/lovely.toml" and it doesn't seems to be read when booting :/
does it have the header?
It does
[manifest]
version = "1.0.0"
dump_lua = true
priority = 0
And if you're talking about the mod:
--- STEAMODDED HEADER
--- MOD_NAME: MJST.LIB
--- MOD_ID: mjst_lib
--- MOD_AUTHOR: [MJST]
--- MOD_DESCRIPTION: MJST LIB
--- BADGE_COLOUR: F0AC14
--- PREFIX: mjst_lib
--- VERSION: 1.1.3
--- DISPLAY_NAME: MJST's LIB
--- PRIORITY: -100
Am I missing something ?
could be because
- mod folder is nested
- the target to search for wasn't found so it didn't patch
- idk logic error causing it to kill itself and not run bc you put it in the wrong place?
Made a tool for generating code for Steamodded Api Jokers
https://github.com/InertSteak/JokerCodeGenerator
@brisk rose
Lightweight tool to create code stubs for Balatro Jokers - InertSteak/JokerCodeGenerator
why does it have name rather than key?
also why that font and not something for suitable for code?
also I find it an interesting choice generating a table assigned to a value rather than just a SMODS.Joker{table}
Change it to Comic Mono
Itās not monospaced
Probably based on codebase of Pokermon
oh fair enough i guess, I thought it might just be that
makes sense, just a strange stylistic choice imo
yeah it'd be nice if there was an option for a bare smods.joker object
Looks like it used a config loading system like Cryptid, so local variable checks out
yeah, just not my style. trivial to change though ofc
for me I mean
however, what's less trivial for me is bulding it? there's just source and project files in the repo that I see
ofc I don't expect a deb or appimage, but an exe should still work in wine
Good point, I'll add that when I get the chance
and yeah, I kind of just finished it and put it on Github, I'll see about making it easy to install
oh c# is jit compiled. So I just need mono?
alright that's all non-stale/non-draft PRs taken care of
"blue_compat"
oh right, that leaves docs
do we address the little inconsistencies that crop up as we write docs?
like some objects using rate and some using weight?
those are definitely to be fixed
which .cs is the parent program though?
but we do have to be careful about what's actually the same concept. SMODS.Sticker's rate is a fixed chance on each shop item, which isn't how weights operate
