#💻・modding-dev
1 messages · Page 608 of 1
if you turn a playing card negative it should not have the shader now but you also removed the non-editioned sprite
that's the incorrect drawstep anyway
this is the one you want
https://github.com/Steamodded/smods/blob/989098dcbfe866d3f855a0e12a49bdc69834e762/src/card_draw.lua#L152
but you don't want to remove the entire condition
have you ever heard of a lovely patch? Maybe you could just lovely patch it out
thats literally what they are doing 💔🥀
have you ever heard of a lovely patch? Maybe you could just lovely patch it out
kel is crashing out in vc lol
(in coldbean server)
why is SMODS.scale_card not on the SMODS wiki
now i have to recode all my scaling jokers to use SMODS.scale_card just so they work with cryptid's scalae
:(
can someone that knows how it works pull request smods to add a wiki entry for SMODS.scale_card in. idk, utility functions
im going to bed i havent slept for >36 hours
many of the new features are not on the wiki yet but they're on the release notes
https://github.com/Steamodded/smods/discussions/919
mostly because no one can be bothered to update the wiki :3
is the patch patching
check lovely/dump/smods
also you can just put the couple of lines you want to edit instead of the entire thing that's bad practice
i think it is?
you might need to remove the center and the front? idk
idk from n'
supreme cookery
nah that's just something i say
what atlas do vanilla decks use?
centers
if you omit the atlas in SMODS.Back it will just use the default
yeah but i'm trying to use the backs atlas for a different object type
that should work then yeah
ok i maneged to fix it by myself
You mean like having a fourth blind in the blind select?
yea
I dont think i can code :P

I've seen that jokers have an ID assigned to them, is this ID always unique? can i use it to tell between jokers without any danger of a conflict?
Yes, but you should use card.sort_id
what's the difference?
card.ID is not saved.
ah ok
how do you replace the main joker on the win/lose screens
If I run find_joker() in the remove_from_deck() part of a joker, can it find itself? Like I have a Joker named X and i run find_joker("X") in its remove_from_deck() function while it's the only one I had, does it find 0 or 1 joker? I'd test but rn I can't
No, use SMODS.find_card
I don get it :(
No, they both don't.
But you should be using SMODS.find_card
It checks for the key instead of the name.
What is not working?
It crashes when i hover over it
Log?
Guys how do I make a joker spawn in my Joker slots?
More wip
Guys, I'm new here and building mods, so, I need help with the custom rarities bc they're not working well and I don't know what the error is
you do not need "loc_txt" in SMODS.Rarity
it should look like
SMODS.Rarity {
key = "Pipe",
default_weight = 0.25, -- chance
badge_colour = HEX('838383'), -- color of the badge
get_weight = function(self, weight, object_type) -- keep this as is
return weight
end,
}
also can I see your joker code?
Sure
do you get a crash?
also, try removing or 'Mamaste mi ', from line 161 (the last bit)
Okay
Fm1 is your mod prefix?
Yes
this is probably not necessary
also did you do this? ^ @tiny sparrow
No, i'm going to add it later cuz i'm busy rn
Well that should fix it.
Alr.
what would be the best way for a Joker to cap the score to 1 point below the score requirements?
failing that, i could patch the game to not progress until my Joker wants it to
(actually maybe i'll do that instead)
(nevermind)
...doesn't AikoShen have a deck that does not end the round automatically, but gives you an "End" button for it instead?
i'm pretty sure, ya
if SMODS.pseudorandom_probability(card, 'giga_snapchatGirl', card.ability.extra.odds, card.ability.extra.chances, 'scg_prob') then
Why does it alway triggers on the first time of the run
...probably seed says so.
i can't find that ^^;
yeah but is putting the date_time make it more random
@tall wharf 🫲
if #G.jokers.cards > 1 then
G.jokers:shuffle('ok')
delay(0.5)
end
And why does that just put the Joker in alphabetical order
have you tried wrapping pseudoseed() around your seed?
no what is that is it a seed generator
i see it a lot in random calls, so i assume u need it
do I just write pseudoseed() and it does its thing
you need to wrap that around your seed
ok like
so pseudoseed('ok')
wdym "collar" those are obviously his arms and legs
Yes, it's part of a different mod called NotJustYet
ah i see
No, it does that automatically.
oh ic
?
#💻・modding-dev message Up there.
no?
My bad I'll rename it immediately 🫡
thank you 😌
I'm looking through vanilla remake to see how chances work, and I noticed the string vremade_bloodstone within bloodstone. What's its purpose, Do I need to worry about that all for what I want my joker to do? My joker description "1 in 900 chance for +300 mult"
this is bloodstone code
loc_vars = function(self, info_queue, card)
local numerator, denominator = SMODS.get_probability_vars(card, 1, card.ability.extra.odds, 'vremade_bloodstone')
return { vars = { numerator, denominator, card.ability.extra.Xmult } }
end,
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play and context.other_card:is_suit("Hearts") and
SMODS.pseudorandom_probability(card, 'vremade_bloodstone', 1, card.ability.extra.odds) then
return {
xmult = card.ability.extra.Xmult
}
end
end,
This is my code
loc_vars = function(self, info_queue, card)
local numerator, denominator = SMODS.get_probability_vars(card, G.GAME.probabilities.normal, card.ability.extra.odds)
return { vars = { numerator, denominator, card.ability.extra.mult } }
end,
calculate = function(self, card, context)
if context.joker_main then
SMODS.pseudorandom_probability(card, "", )
return {
mult = card.ability.extra.mult
}
end
end
You're misreading the code btw (which tbf is arguably badly formatted)
it's
if context.individual and context.cardarea == G.play and context.other_card:is_suit("Hearts") and -- notice the AND here
SMODS.pseudorandom_probability(card, 'vremade_bloodstone', 1, card.ability.extra.odds) then -- and the THEN here
not
if context.joker_main then
SMODS.pseudorandom_probability(card, "", )
Also 'vremade_bloodstone' is just a seed for the proba check, it wont crash if you type something else
I'm trying to find the docs for smods' pseudorandom stuff but can't 🙄
there ya go ^
btw, u don't need G.GAME.probabilities.normal when using SMODS.get_probability_vars, you can just use 1
oh yeah don't do that
don't do that, or I don't need to do that?
don't use G.GAME.probabilities.normal, use the smods probability functions
i'm having a bug regarding jokers with additional data/behaviour outside of calculate not being changed when the card's ability changes
should i put that data somewhere else (instead at the root of the joker) or should i patch in handling for it?
like,, putting it in config
the following is what it should look like, SMODS.pseudorandom_probability() is used in the if check, as larswijn mentioned
calculate = function(self, card, context)
if context.joker_main and SMODS.pseudorandom_probability(card, "seed", 1, card.ability.extra.odds) then -- you can change 'seed' to anything u want
return {
mult = card.ability.extra.mult
}
end
end
nvmd i think i see a different thing
the reason u dont need G.GAME.probabilities.normal is because the smods function already handles that
SMODS metadata file
cause in my computer it looks fine
why tf is GIGA not being GIGA in my puter?
fixed it 
it was a bug i encountered mid-run and i then lost on the same blind i encountered it on
😭
im checking out scoring parameters, copying the juice example as stated, but then running SMODS.set_scoring_calculation('[modprefix]_juice') causes this crash, anyone know why?
show code
its the example juice code from the 827c announcement
https://github.com/Steamodded/smods/discussions/919
bottom of this announcement
its too long to copy paste into a single message
ah i may be smart
oh idk anything about this sorry
goddamnit
"you can copy this code"
replace_ui proceeds to have a couple of hardcoded modprefixes
foiled again by not inspecting the code closely
does the scoring calculation type reset after every round?
is there an easier way to test the trigger effects besides making the numerator bigger for debug testing? This is 1 in 900
Yes, Oops! All 6s
facepalm
btw u can just hover over a card and press ctrl c to duplicate it
it ignores limits
i cant remember if its ctrl c or tab + c
thank u for this info
ctrl + r to delete them so you dont have to sell them (takes time)
how can i load every .ogg in /sounds/ ?
instead of 50 SMODS.Sound{} usages
you could probably just iterate over the filenames
ah
similar to how some mods automatically load all lua files in a specific directory
i love NFS.getdirectorydata ❤️
i love NFS.getDirectoryItems so much i made a recursive file loading function using it
SMODS.Sound:register_global()
...all I do with NFS is have it load and play an audio file in the crash handler. 
Hi, is there a function to check the current blind requirement, I only see the one that shows the scaling which may not factor bosses that change the requirement
G.GAME.blind.chips
SMODS.Scoring_Parameter({
key = 'juice',
default_value = 0,
colour = mix_colours(G.C.PURPLE, G.C.YELLOW, 0.5),
calculation_keys = {'bribe'},
})
SMODS.Back{
key = "bribe",
pos = { x = 0, y = 0 },
unlocked = true,
discovered = true,
config = {
},
atlas = 'CustomDecks',
apply = function(self)
end,
calculate = function(self, back, context)
if context.final_scoring_step then
return {
bribe = G.GAME.dollars
}
end
end,
}
whats the proper way to do this? I want the scoring parameter to mirror G.GAME.dollars, but i failed so far with modify and or calc_effect
its part of a deck specific scoring calculation but id rather the functionality be fully inside the scoring parameter/scoring calculation stuff
lol i can hijack money gain by defining one of the calculation keys as dollars
does anyone know which function determines played hand?
G.FUNCS.get_poker_hand_info
in calculate you can also use context.scoring_name in most contexts that are apart of the main scoring loop
ease_dollars
thats called fraud ease_dollars
ease_dollars(amount) ?
yes
thanks
in calculate you can also return dollars = amount
is that amount added or set
will smods detect contexts made via lovely patches
tenner
you can just return a negative amount i think
then probably patch SMODS.calculate_individual_effect so it lets you do that
how can i make showdowns appear last in the collection
just register them last?
or set the order variable really high
Don't they already do that
no?
how would I get the current total round score while in a blind
how can i debuff cards with X seal?
G.GAME.chips
that's your score
and G.GAME.blind.chips is the blind requirement
also how do i detect if a card has any seal?
if card:get_seal()
hi i was wondering if there is a way to transform a joker into an other joker ?
this isnt a :3 this isnt silly this is laziness that makes me want to ping john smods to fix that shit
if youre pr'ing a feature, add a wiki page for it
simple
why don't you do it then
that's literally the point of open source
..i'll do it later i feel like shit right now
sinuses clogged and got way too much sleep last night
might be sick
i agree with this, i wouldn't say it's simple to do so but it would be ideal, who better to document the feature added than the one who added it
it would be ideal but I don't like insulting the people who make the PRs when the features are literally documented
when to use self over card
so if i declare a variable from self it effectively becomes immutable?
well, it's not immutable but it's best practice to not change the center so practically it is
how can i make it where (for a blind btw) per played hand, it removes a random tag.
and how can I check if you have 'X' joker
how would i use SMODS.scale_card on something similar to cloud 9
do i just. reset every time context.before comes up and loop SMODS.scale_card for every instance of a certain card that fits the parameters defined?
i wouldn't consider that scaling
cloud 9 doesnt use scale_card afaik
i guess
what about fortune teller
that's def scaling but it uses a persistent value
i guess just. when that value changes?
and on pickup
card:set_ability('j_modprefix_key')
i think smods didn't consider that scaling either because it just checks for a variable, it doesn't add more value to the card itself
thank you
if you want to use scale_card i would do it like you said
is there a way to do this temporarily?
or i guess
not really, you have to transform it back manually
mods do this by making fake jokers
how would i spoof a joker
Yes, I have a joker that does exactly that but without limits, but I haven't updated it to use the new fake joker code yet.
hey what' sthe context for "when the joker initially spawns
mind if i steal your code
you don't use a context, you use the add_to_deck function
if you want it as soon as the card is created then set_ability
if context.end_of_round and context.main_eval and not context.game_over then
SMODS.calculate_effect({message = localize('k_reset')}, card)
local jokers = {}
for k, v in pairs(G.P_CENTER_POOLS.Joker) do
if v.key ~= self.key then
table.insert(jokers, v.key)
end
end
card.ability.extra.currentjoker = pseudorandom_element(jokers, pseudoseed("seed"))
end
-- Insert the other code I sent here
is there a way to make a specific consumable type always act as if you have showman? preferably without patching
Hook SMODS.showman
like the consumables can all appear more than once?
yeah, really the wanted behaviour is specifically that they can still appear if you have one already but i dont mind multiple showing up in the same pack
you can hook SMODS.showman but I think it's easier to just give them all the same in_pool function with true, {allow_duplicates = true}
oh yeah that does sound easier
does anyone here know how to restart songs ingame
clippy!ralsei
of course
your pfp is fluffy :3
ty :3
anyway im here for this and someone in a smaller dev server whos meant to have the answer is most likely sleeping rn
what functions creates a random consumeable from a given consumable key
wdym
if you have the key it wouldn't be random, no?
maybe i said it wrong
pool key?
N' are you dead and haunting this channel or smth you're always here
N' is super goated
thanks
i was very nearly finished typing a message thatd promote this repo while saying that youre in this channel a lot because youre goated
im trying to be less in here because i kinda lost patience recently lol but thank you
fair
G.ARGS.push.type = 'restart_music'
G.SOUND_MANAGER.channel:push(G.ARGS.push)
tysm!
theres something oddly satisfying about spamming that in debugplus lol
i agree there should be
do i put the logic for the undebuffing in a calculate function or would this need to be a hook or something
SMODS.current_mod.set_debuff is just a function that you can define in your mod that SMODS calls frequently to determine debuff behavior
e.g. here's how paperback makes the Sleeved enhancement unable to be debuffed
what meta said, yes
ok ok
now
i want this flag to return to false when the round ends
any way i can go about setting that up?
you should set a flag on the card when you want it to not be debuffed, and then re-set it to false when the round ends. then just check for the flag in the set_debuff function
I am looking to put all my descriptions within a localization file in case I want to add additional languages later.
I originally had this all to together in one file, which worked fine. But I broke it up in the following files:
-- `localization/en-us.lua`
return {
descriptions = {
Joker = {
j_TechnicallyMathematicallyBalancedJokers_1 = {
name = "Technically Mathematically Balanced Joker 1",
text = {
"{C:green}#1# in #2#{} chance for {C:mult}+#3#{} mult",
},
}
}
}
}
-- `jokers.lua`
SMODS.Atlas({
key = "TechnicallyMathematicallyBalancedJokers",
path = "Jokers.png",
px = 71,
py = 95
})
SMODS.Joker {
key = "j_TechnicallyMathematicallyBalancedJokers_1",
atlas = "TechnicallyMathematicallyBalancedJokers",
unlocked = true,
pos = { x = 0, y = 0 },
rarity = 1,
blueprint_compat = true,
cost = 2,
config = { extra = { odds = 900, mult = 3600 } },
loc_vars = function(self, info_queue, card)
local numerator, denominator = SMODS.get_probability_vars(card, 1, card.ability.extra.odds, "TechnicallyMathematicallyBalancedJokers_1")
return { vars = { numerator, denominator, card.ability.extra.mult } }
end,
calculate = function(self, card, context)
if context.joker_main and SMODS.pseudorandom_probability(card, "TechnicallyMathematicallyBalancedJokers_1", 1, card.ability.extra.odds) then
return {
mult = card.ability.extra.mult
}
end
end
}
-- `main.lua`
assert(SMODS.load_file("src/jokers.lua"))()
But now the text is gone. Did I miss a step? I'm following the vallina remade repo
In the SMODS.Joker, key should be just 1 for the localization if TechnicallyMathematicallyBalancedJokers is prefix?
ok
where would i put the flag reset then
in the use function?
in the set_debuff function?
do i have to create a calculate function?
sorry i'm not super caught up on what exactly you're trying to make here
oh
i want to make a consumable that on use, removes debuffs from the cards for the blind.
when the blind ends, they should be able to be debuffed if the criteria matches again
yea set the flag in the consumable's use function, and then i'd probably reset the flag in the global mod calculate
so i'd make SMODS.current_mod.calculate = function(card, area, context)?
just function(self, context) (because it's not calculating on any one specific card)
i made a custom booster pack and when i open it it says error on the bottom, what variable do i need to add to make that say something else?
documentation is cool
https://github.com/Steamodded/smods/wiki/SMODS.Booster
im pretty sure the group_name thing just straight up doesnt work
joker forge has also had issues with it for the longest time
because it uses loc_txt as well
ok just found out that during the end of round context the played cards are not in the deck
how do i get a read of all the cards if they're in the deck, hand or discarded
G.playing_cards
it might need to be group_key
group_key is outside of loc_txt though
and is for localization files
unless the docs are just wrong
i mean yea my point is the docs might be wrong
because why would it be group_name in the loc txt but group_key in a localization file
probably because group_key is a key thats used to get the localization entry
How do I know that the player is using their first hand?
So the joker destroy if you are not playing the first hand
G.GAME.current_round.hands_played == 0
Wouldn't that make the joker destroy on the last hand?
no
well you would check G.GAME.current_round.hands_played > 0 for not the first hand ig
maybe a stupid question but is there a convenient way of giving a consumable a custom function? i would like my perk consumables to have a :level_up() function that i can easily just call however many times to increase the perk level, but if i need to patch/hook in a function or deal with saves i cba lol
you can just put anything into an object definition and itll go in the object's table
and itll save properly? cool
so if you just define a level_up function on the object itll be in card.config.center.level_up for the card object
if you want the whole consumable type to have the function, i recommend defining a custom type that extends smods.consumabletype
huh? so would i be able to do card:level_up() on a specific instance or would i have to do like card.config.center.level_up(card)
you should be able to do card:level_up(), yes
ok now im confused
especially since self always refers to the prototype object for existing stuff
if i want each consumable of a type to have a level_up function that i can define in the consumable definition what do i need to do for that
nothing really
the simplest way to do that would be to just add a level_up function in each consumable's definition
just add it to the consumable definition
yeah
if its not going to be similar between every consumable then theres no point in extending to automate stuff but otherwise should be fine
oh wait my bad i was myself a bit confused
what i was talking about was extending smods.consumable itself, not smods.consumabletype
anyway yes ignore me you probably don't need to extend anything
but it will be card.config.center:level_up(...) assuming you make it level_up = function(self, ...)
Guys, did you know how I elevate instead of multiply?
Cuz I need someone to teach me
so, i would have to pass the card into the function in order to access its values without changing every instance of the card then
i can live with that i think
Yeah
that's how
Only that?
yes
I feel stupid, thank you
Any ways to easily reference every card that wasn't played?
i don't remember what the variable is called but there's one in each playing card that counts times played iirc
is there a way to alter booster pack apper rates for consumeables?
if you mean during scoring i think you can just do G.hand.cards
I meant in just one hand, the cards that weren't played for one hand. Is it just G.hand?
oh
yes
i made custom consumeables and booster packs for them
and i want to make some rarer than others
do i use the soul way or is there another?
i think consumable types can have rarities but im not sure how
well you can make consumables that work like the soul but i dont think individual object weights is a thing yet]
individual object weights within a set that is
you can also make the booster poll on each create_card
oh right doesnt SMODS.Rarity have a thing where you can customize what sets it gets added to
maybe something like that could work
yeah but i only see people asking about it and never someone saying how to do it lol
no because itll just not spawn anything if none of the weights roll
because thats how soul type cards work
but if i have 12 cards that are say common, and 5 which are rare
can i just put it on those 5?
I remember that to detect a Joker's key, it should be card.config.center.key, did I misremember? I dont entirely trust myself lol
Also, how do I detect if a Joker is in a custom pool, for example, Crpytid's Food Joker pool?
SMODS.destroy_cards(card)
end
end```
I don't think this destroys all cards held
SMODS.destroy_cards(G.hand.cards)
card.config.center.pools and card.config.center.pools.Food
should work
SMODS.Consumable {
key = "comykelium",
set = "xiferp_Element",
atlas = "Golden_Brick_Road",
cost = 3,
pos = { x = 10, y = 6 },
unlocked = true,
discovered = true,
config = { extra = { element_no = 99, odds = 11, yes_is_no = false }},
keep_on_use = function(self, card)
return true
end,
can_use = function(self, card)
if card.ability.extra.yes_is_no == false then
return true
end
end,
loc_vars = function(self, info_queue, card)
local numerator, denominator = SMODS.get_probability_vars(card, 1, card.ability.extra.odds, 'c_xiferp_comykelium')
return { vars = { numerator, denominator } }
end,
use = function(self, card, area)
yes_is_no = true
end,
loc_txt = {
name = 'Comykelium',
text = {
'Adds x5 mult to your next hand',
'and destroys all held cards',
'(1/11 chance to radioactively decay and kill a held card)',
},
},
calculate = function(self, card, context)
if card.ability.extra.yes_is_no == true then
if context.individual and context.cardarea == G.play then
if context.other_card == context.scoring_hand[#context.scoring_hand] then
G.GAME.xiferp_rowseven_xmult = (G.GAME.xiferp_rowseven_xmult or 0) + 5
SMODS.destroy_cards(G.hand.cards)
end
end
end
if context.individual and context.cardarea == G.play then
if SMODS.pseudorandom_probability(card, 'c_xiferp_comykelium', 1, card.ability.extra.odds) then
SMODS.destroy_cards(card, nil, nil, true)
SMODS.add_card({ key = 'c_xiferp_uranium' })
local card_to_destroy = pseudorandom_element(G.hand.cards, 'random_destroy')
SMODS.destroy_cards(card_to_destroy)
end
end
end
}```
Think I have something wrong...
Still not destroying the held cards post-hand
Wait, think I figured it...
nope
This is supposed to give me 3 Negative Space Babies when it is created, and then whenever the Space Baby is scored, it gives me x2 Chips and x2 Mult, but for some reason, it doesnt do either. Unless I am misusing context.other_joker.
The card is looking at its own key and not other_joker
What do you mean, does the calculate function only trigger when the Joker is being scored?
card.config.center.key
it's looking at its own key and not context.other_joker which I assume you want it to
Yes, so should it be other_card.blablabla?
(the sticker is there for visual purposes)
if card.ability.extra.yes_is_no == true then
if context.individual and context.cardarea == G.play then
if context.other_card == context.scoring_hand[#context.scoring_hand] then
G.GAME.xiferp_rowseven_xmult = (G.GAME.xiferp_rowseven_xmult or 0) + 5
SMODS.destroy_cards(G.hand.cards)
end
end
end```
Why isn't this destroying any cards?
Also, I accidentally wrapped my add_to_deck inside of my calculate function lol
actually idea
what if i just. make the sticker handle it, and the joker just spawn a Joker with the sticker
Unfortunately, it crashed. Apparently I cannot use other_card
that's what G.hypr.ijhjokers is
isn't it?
...and???? that just means it's in the table G.hypr instead of G
if i do this and then set the rarity of the consumeable to the key the game crashes
can someone help?
i saw a lot of talk about this in this channel and did everything the same but it just doesnt work
You didn't use the other code I sent.
that's what ijhcalc is, right?
ah
Can you elaborate on what it should be in this context? I'm looking over what vanilla has, and I'm not sure what you're referring to
the class prefix j and the mod prefix which is in your metadata file
look at the vanillaremade localization files
guys any help with custom rarities showing up as common?
key = "fresh",
loc_text = { name = "Fresh" },
pools = { ["Joker"] = true },
badge_colour = HEX("12A0D7"),
default_weight = 0.5
}```
and i'm putting `rarity = "napoli_fresh",` in the joker
are you saying they are too common or that the jokers are marked as Common
they are marked as common
can i see one of the jokers
like full code or pic
pic is better because im on my phone
hmm did you save lol
yeah
i dont see how that would show up as common, at worst it should crash
it's like i didn't save but i triple checked
like, the joker should also show up later in the collection after this change
cause it's loaded after commons
yeah that's probably the problem, check if closing and opening the file again shows the changes
send the part of the code where you define the rarity
it does
hmm
This bit of code keeps crashing whenever I trigger it. I dont know how I can find the attributes of the other joker that I am trying to score. In this case, I want it to match the key.
yea screenshot it
context.other_joker.config.center.key
but the joker shouldn't show up at all if it didn't load no?
try asserting the load_file call
no i mean screenshot the part of the code where you defined the rarity "napoli_fresh"
assert(SMODS.load_file(...))()
@atomic edge
Still facing same problem with keys and class changd. Here's the new files. I also reset the profile in case that was the issue.
-- `localization/en-us.lua`
return {
descriptions = {
Joker = {
j_TechnicallyMathematicallyBalancedJokers_1 = {
name = "Technically Mathematically Balanced Joker 1",
text = {
"{C:green}#1# in #2#{} chance for {C:mult}+#3#{} mult",
},
}
}
}
}
-- `jokers.lua`
-- atlas is the same
SMODS.Joker {
key = "1",
-- other stuff stuff is the same as before
}
oh didnt see im sorry
same result
that should work, are you sure the mod prefix is that?
that's a long mod name
oh see where the prefix is set. Sorry, I got it confused with the id
Works now
how would i make a random tag
thanks n
hey guy how would I get a blind's color
G.GAME.blind.config.blind.boss_colour
holy shit that actually exists? thanks man
can someone help?
how do i make the hand fill up with more cards after i increase the hand size?
it should do it automatically
you can use SMODS.draw_cards if for some reason it's not
oh and blind defeat is G.GAME.blind.defeated or is there something else
where do you need to check
in jokers
context.end_of_round then
ok
so now my code looks like this did i do it right ```if context.end_of_round and G.GAME.blind.config.blind.boss_colour == HEX(FFFFFF) then
end```
well the colour check will always be false because of how tables work
oh
table equality checks if the two variables point to the same table
not if they are tables with the same values
also why do you need to check colour anyway
a funny idea
i mean even then the colours would rarely match exactly
but it would be funny
hay do i get/set a card's loc_vars
card:generate_UIBox_ability_table(true)
Can any of you tell me why the first line crashes the game?
--[[
attempt to index global 'blind' (a nil value)
--]]
if context.before and (context.scoring_name == card.ability.extra.poker_hand) and not blind.disabled then
return {
message = localize('ph_boss_disabled'),
func = function() -- This is for timing purposes, it runs after the message
G.GAME.blind:disable()
end
}
end
@sharp arch cryptid has a helper function for checking if two colors are equal
local function eq_col(x, y)
for i = 1, 4 do
if x[i] ~= y[i] then
return false
end
end
return true
end
the value blind doesnt exist
How do I make sure that the Blind hasn't already been disabled, then? Or that it can be disabled?
uhhh idk
G.GAME.blind.disabled
should work
Found it. It was in Luchador's code.
G.GAME.blind and ((not G.GAME.blind.disabled) and (G.GAME.blind.boss))
that's get i need set
how would you set them, theyre the result of a function thats gets re-run every time you hover over the card
Hook Card:generate_UIBox_ability_table
oh that works yeah
SMODS.inspectFunction doesn't exist.
You would put Card.generate_UIBox_ability_table
o
jeehful
don't steal my original oc character jimbo, Jeehful
yall know if theres a built in particle system or do i just have to program that myself
Does anyone know how to create a joker that multiplies money?
you could look at using love2d itself
i think it has particles
just return dollars = G.GAME.dollars * (<multiplier> - 1)
Eris beat me to it
Same can be done with ease_dollars if you want
like this?
key = 'raw_gold',
loc_txt = {
name = 'Raw Gold',
text = {
'{C:green}#1# in #2#{} chance to',
'multiply your {C:money}money{} by {C:money}#3#x{}',
'when a {C:attention}Coin{} card scores'
}
},
config = { extra = { odds = 2, mult = 1.5 } },
rarity = 2,
atlas = 'joker8',
pos = { x = 0, y = 0 },
cost = 6,
unlocked = true,
discovered = false,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = true,
loc_vars = function(self, info_queue, card)
return { vars = { '1', card.ability.extra.odds, card.ability.extra.mult } }
end,
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then
if context.other_card.base.suit == 'kloun_coinsuit' then
local random_value = math.random()
local trigger_chance = 1 / card.ability.extra.odds
if random_value <= trigger_chance then
return {
dollars = G.GAME.dollars * (card.ability.extra.mult - 1)
}
end
end
end
end
}
Yeah
yup
i m so sorry i didn't knew there was a chat for this mod
Its fine
who is galdur ?
So it doesnt crash, but it also doesnt trigger, so I have no idea what is going on. I'm going to try triggering from the Space Babies themselves and see what happens
using smods.add card how would i make it allow to spawn hidden consumables
soulable = true? or do you want them to spawn as if they were normal consumables?
i have a joker that spawns consumables and i want it to be able to spawn soul/blackhole when it spawns spectrals
I don't think that's possible with just add_card, you would probably need to use get_current_pool and pick a random card from there first and then add it
how the hell does smods get the loc_vars for vanilla jokers
they don't use loc_vars
actually this probably isnt a smods thing its a vanilla thing
oh my god vanilla loc_vars is set in a function that goes through all the jokers fucking hell
if you're trying to change it for a vanilla joker, just take ownership of the joker and you can set new loc_vars that way
you won't have to patch into the function
what for exactly
does it matter
i feel like there might be a better way to achieve what you're trying to do
For coding a Boss Blind: when context.individual and context.cardarea == G.play, how do I get the current scored card?
context.other_card
So, would context.other_card:get_id() work?
JEEHFUL?
i'm trying to make a sticker swap its localization and loc_vars with the joker it's on
what do you think is a good theme for a joker that scales xmult based off a poker hand similar to to do list, i was thinking crystal ball or something space themed
was thinking like this
- Name: ???
- Theme: Space-themed?
- Effect: Gain XMult (maybe .2 or .25?) when playing a chosen poker hand, changes either at end of round or playing said poker hand
- Rarity: Uncommon or Rare
- Unlock: Win a run by only playing one kind of poker hand
What distinguishes SMODS.Blind({}) from SMODS.Blind{}?
i don't think anything its more a preference
im asuming i can do somthing where i do a for loop and if the number of "unique" poker hands goes above one it doesnt unlock
nothing
you can pass a single table or string to a function without ()
not sure how to reword the last part it feels weird but not sure what the right word would be
maybe "poker hand changes after playing it?"
poker hand changes when Mult is upgraded```
thanks that sounds more natural and in line with the vanilla jokers
That's what I go for with my own Jokers.
Looks good to me.
*when played poker hand
oh thats great lmao 😭
that should work
im suprised it all worked first try actually
i mean...
how do i make it not say error? I'm guessing group_name for boosters go somewhere else in the localization file
that took a while to get right
i mean "when played poker hand is a #1#"
after playtesting it not sure if it is balanced i mean obelisk gains .2 xmult but its more so that you can play any hand just not your most played hand but for plantarium you have to dig for a specific hand. not sure if i should make it uncommon or increase the gain or leave it as is
Is there a way to restrict certain consumables from appearing with a deck?
How 'bout only giving a X0.1 Mult increase?
what i would do is set up a flag to be true only with your custom deck and then in your consumable (or take ownership if it's vanilla) use in_pool to return false when the flag is true
Is there somewhere I can find how to organize and handle the unlock_condition method for achievements? I want to have my achievement unlock when the player plays a hand of 3 of a specific rank and no other cards.
how do you replace music when a joker is held?
Use select_music_track
select_music_track("napoli_panzarott") this doesnt work
how do i do it
select_music_track = "napoli_panzarott" ??
select_music_track = function() return next(SMODS.find_card('j_modprefix_key')) and 100 or nil end
but how do i tell which track to play
No, you put it in the SMODS.Sound
ah okay
You need to put music in the key.
pitch = 1
how would i get if a certain stake is unlocked on any deck
how do you check from which mod a joker comes from
card.config.center.original_mod
does it give the mod name then
No, it gives the mod.
hwat
im trying to make a consumable that removes debuffs from all your cards, but if used during a debuffing boss the cards immediately get debuffed again. is there a way to stop this?
Yes, use SMODS.debuff_card instead.
No, it's prevent_debuff
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play and not context.end_of_round then
if context.other_card:get_id()==12 and not context.blueprint then
SMODS.scale_card(card, {
ref_table = card.ability.extra,
ref_value = "mult",
scalar_value = "incmult",
})
end
end
if (context.before or context.end_of_round or context.drawing_cards) and card.joker_display_values then
card.joker_display_values.storedmult = card.ability.extra.mult
end
if context.joker_type_destroyed --[[and context.card.ability.set == 'Joker']] then
assert(false,'Breakpoint Reached!') -- this never gets reached, neither when selling a card or it self-destroying
if context.card.ability.perish_tally~=0 and not context.card.config.center.pools.Food then
card.ability.extra.mult = 0
if card.joker_display_values.mult then card.joker_display_values.mult=0 end
return {message = localize('k_reset'), message_card=card}
end
end
if context.joker_main or context.forcetrigger then return {mult = card.ability.extra.mult} end
end,
i know context.joker_type_destroyed exists but it's not. working
what are you testing it with
selling wont trigger it
hm
what i'm trying to do is
"Resets when a Joker is destroyed neither by self-destructing, nor while debuffed by Perishable"
yeah joker_type_destroyed should work for other types of destruction
so why is the breakpoint i set never being reached
well if you answered my question it would be good
selling a joker and letting a food joker expire
I've had an idea for something to add to a mod but I'm not really sure how to implement it. And I'm also not sure where I can find a reference point for doing this either.
It's basically just a type of card that acts the same way as consumables like Tarots, Planets and Spectrals, but I'd want to give them their own slots so that you can never have more than one of this type of card at a time, but also so they don't take up consumable slots
the only similar thing that's really coming to mind at the minute that might help explain it would be the slot shown underneath consumables in the multiplayer mod, that's used to show when the opponent has a specific joker
selling a joker wont trigger it, that has its own context
i think food jokers expiring are not counted but idk if thats intended or a bug
yeah you know what
i think simplifying it to just being "when a joker is sold"
would be best
what is that context
probably shouldve guessed
bump, and/or could anyone point me to a mod with scoring calculation implementations so i can learn from that
What exactly are you trying to achieve here?
i want to have a scoring parameter that is literally just G.GAME.dollars
for a deck idea i have
but the current implementation actually relies on the deck for the parameter to work and it doesnt even work exactly how i want because i want money earned during a hand to still count towards the parameter but in its current setup if i earn money by means of for example golden ticket it only applies on the next hand
as far as im aware calc_effect and modify only get applied when a key is actually registered, and my current idea is to do some jank wizardry with SMODS.Scoring_Parameters['modprefix_example_key']:modify(X), but id like for something in my mod to not be jank for once
Dumb idea but what if you use G.GAME.dollars + (G.GAME.dollar_buffer or 0) instead? Not sure if G.GAME.dollar_buffer properly updates during calcs
that does indeed work thank you!
also sidenote is it normal behaviour that the used scoring calculation resets to the default one every round
and if yes how do i make it not do that
i still would wish for the scoring parameter to work independently of the deck but eh might be a big ask, ty
how are you setting the scoring calc?
via SMODS.set_scoring_calculation('modprefix_minus')
and as soon as i ask that question i see G.GAME.current_scoring_calculation in the announcement 🤦♂️
if i have a sound dir like:
./assets/sounds/
--folder
----sound.ogg
and I did SMODS.Sound:register_global()
how can i play it?
does play_sound('modprefix_folder/sound.ogg') work?
No, it's modprefix_filenamewithoutextension
but what if i have it like
./assets/sounds/
--folder1
----sound.ogg
--folder2
----sound.ogg
basically if they're named the same thing, how do i play them seperately?
No, those wont be loaded.
SMODS.Sound({key = 'key', path = 'folder1/sound.ogg'})
Teach me codding mods😥
well how can i just loop through every sound instead of doing that manually?
its not easy
Remove the folders.
bru
Thx for explaination
its something you learn on your own @shadow ocean
https://github.com/nh6574/VanillaRemade
ill point you there tho
if you can read through it, you might be able to get a basic idea
Oh thx a lot
-# its not all but this explains it better than the smods wiki
Thank you
Is there any ways for a joker to gain retriggers? I haven't had luck finding documentation regarding it
You mean like permanent retriggers?
kinda yeah. My joker idea was that after a set amount of discards, it gains a permanent retrigger
is it possible to permanently lower discards/hands?
Yes, Troubadour
?
oh the joker
also how does (in loc_txt or anything) '#1#' work, or what does it display exactly?
the #1# means it's looking for the first local variable in the list of local variables, so if you have for example:
retriggers = 1, xmult = 2.5 in your local variables then doing:
"Retrigger #1# scored card, #2# mult" will display those values (in theory)
No, it's the values returned in loc_vars
Oh i thought that's what i said LOL
Nonetheless, it doesn't come with color so you have to stylize it yourself
G.GAME.round_resets.hands = G.GAME.round_resets.hands - card.ability.extra.h_plays?
For example:
Yes.
and for discards
G.GAME.round_resets.discards = G.GAME.round_resets.discards - 1?
Yes.
there is a way to make global variables?
when making a stake does it, by default, apply all previous stake effects?
if so, how can i remove that.
G.GAME.modprefix_variable = value
thx man
is this correct?
if _card.edition == 'modprefix_edition' then
No, if _card.edition and _card.edition.editionkey
oh
where do i add it?, cuz the game crashed
is this valid? idk if i need the args to be (self, cards, hand, handname, check)
debuff_hand = function(self, blind, context)
local suits = {
['Hearts'] = 0,
['Diamonds'] = 0,
['Spades'] = 0,
['Clubs'] = 0
}
...flower pots code...
if suits["Hearts"] > 0 and
suits["Diamonds"] > 0 and
suits["Spades"] > 0 and
suits["Clubs"] > 0 then
return false
else
return true
end
end
end,
No, you can't use Flower Pots code without the cards.
so add the 'hand' arg?
No, you need all of the arguments.
No, self, cards, hand, handname, check
but what about context.X usages?
-# if context.scoring_hand[i]:is_suit('Hearts', true) and suits["Hearts"] == 0 then
cards[i]
.?
You need to put it in a place where the game has already loaded.
the main.lua counts?
cards[i] like he said
nah idk what youre tlaking abt
how do i detect if a joker has any edition
if card.edition
how can i get a random integer between two values, is it possible with psuedorandom?
-# i ask too many questions
pseudorandom('seed', 1, 2)
how do i remove an (all) edition from a joker?
card:set_edition()
how do i remove an edition from a joker but the joker is me and the edition is depression
yume (E++):set_edition()
crazy
how do i give myself my edition back
editionless
yume (E++).set_edition("e_happy")
bro 😭
this is worse
yume (E++):set_edition(“e_sarc_gay”)
erm its ":" not "." 🤓
why would this trigger on cards created by familiar/incantation and such
because its triggering on enhanced cards?
also use scale_card smh
hiker doesnt use scale card does it now
oh whoops
also its meant to only trigger when a card that was previously enhanced gets enhanced again
foiled again
actually wait ill try smth
set a flag on every enhanced card in deck and only trigger if it has the flag
also don’t forget vampire
what else would you do
yeah and it’s not working
yeah because i wasnt checking context.unchanged
wait no
fuck that doesnt work either
i don’t like my solution but it probably works
but the issue is specifically with familiar/incantation/grim
it works for literally everything else
take ownership of them
🧠
no
Have you tried printing context.old?
how can i lock the gamespeed in settings at a val (say, 0.5) and then after something revert it to original value.
Check how Yahi changes gamespeed, then hook G.FUNCS.change_gamespeed to prevent execution of original function.
wont G.SETTINGS.GAMESPEED = 0.5 work?
No, because it can be changed.
ah
what if it is in calculate ?
you can still just go into the settings?
why would that change anything
what would stop you from going into the settings and changing it back
i thought calculate is always being called
do you. do you mean the update function
huh
calculate only gets called when a context is calculated
this
does anyone know why my debugplus doesnt show me prints
i have all but 1 setting turned on
but nothing shows
oh wait
oh my god
but for some reason grim and such seem to set the ability of cards they create an additional time
Thunk Moment™
?
yahiamice moment
guys
Why are you overriding Game:update?
i saw the documentation for making a gradient
and im wondering
how do i actually make it
i yoinked it from yahimods code 😭
Don’t
it works fine
Just do this
fine ~= good
what is the probability identifier/seed for lucky card mult
tryna make an edition but for now im only attempting to make the cards more yellow
Ive made sure that its called "firstedition" everywhere too
okay I seemed to have figured out the problem
i dont know what this means
check vanillaremade wiki for hooks
what the fuck do they mean by swizzle selection out of range
how can i disable all held in hand effects temporarily?
how would i consider adding interchangable names, descriptions and sprites for a joker
Hook SMODS.score_card
what does hook 'x' mean
how to detect if any voucher is redeemed
if context.buying_card and context.card.ability.set == 'Voucher'
like
local score_card_ref = SMODS.score_card
function SMODS.score_card(card, context)
if card and card.ability then
card.ability.hold_in_hand = false
end
return score_card_ref(card, context)
end
?
No, if context.cardarea == G.hand then return nil end
local score_card_ref = SMODS.score_card
function SMODS.score_card(card, context)
if context.cardarea == G.hand then return nil end
end
?
No, you need to return the old function.
you always need to return the old function, so yes at the bottom
is it possible to make a 1 in 3 chance for played hand to not score
yeah
how ;-
check how cryptid does it for tornado (just ignore all the blind related stuff https://github.com/SpectralPack/Cryptid/blob/91db14ee4de9a024f2cd9f36c344ad49c686b768/items/blind.lua#L1088-L1106
also it has a system to make it so you cant get fucked by getting unlucky which is what G.GAME.blind.tornado_guarantee is related to i think
-# bump
i dont get the code
well i kinda do
but like, where's the 1 in X chance
idk the args for pseudorandom_probability
but yeah use context.debuff_hand and check not context.check (i think) so it doesnt roll the probability every time the debuff is checked for
so SMODS.pseudorandom_probability(self, "seed", 1, 3, "id") is 1 in 3?
vro
how do i remove all seals, editions & enhancements from card(s)
card:set_seal()
card:set_edition()
card:set_ability('c_base')
yes
though seed is automatically set as the id if you dont give a seperate id
bump
for the sprite you can do card.children.center:set_sprite_pos({x = num, y = num})
Thanks
Is anyone available to help me with updating context flags? I'm having trouble doing it cause it's undocumented
So I am dealing with random enhancements, 281 in card.lua is the mult enhancement, other ehancements work without crash as intended (seen everything but lucky and mult cards)
anyone know why this is crashing?
1: You misspelled "guaranteed" (you currently have gauranteed)
2: G.P_CENTERS[enhancement] is wrong, it should just be enhancement
thanks! any ideas why it worked half the time?
i think it may be due to the structure of G.P_CENTERS, although im not entirely sure
anyways u shouldnt need to interact much with G.P_CENTERS unless you know what you're doing with it
lol guess I didn't understand it as well as I thought, appreciate the assist!
No, it would still work.
hmm
which enhancements was it crashing with
well its hard to confirm exactly which ones because it would crash before I saw the card get enhanced, but Glass, steel, stone, and bonus cards all worked atleast
how do i only modify only one cards probability with seals if its possible? It pours over into other cards
if context.trigger_obj == card
you can also check the identifier during the mod_probability context
Thanks
vanilla content has unique identifiers for each probability roll, so e.g. you could make a seal that very specifically only affects the roll for mult on lucky cards
hey guys
how do i make custom gradients
like an actual example please
also
is there a way to make something manipulate other cards variables and loc txt
Should I be using j_modprefix_joker or just modprefix_joker? Im trying to read the key of the Joker
j_modprefix_joker
That's what I thought
Or maybe I have bad code, idk
I'm trying to detect when another Space Baby is detected, then it should give x2 Chips and x2 Mult
j_stufful_spacebaby
Oh, okay
can anyone explain how to add rarities to consumables?
or is there some kind of guide or a mod that does it
I dunno, maybe look at Vanilla Remade's Soul cards
Thanks
next(SMODS.find_card("j_splash"))
Try using this
But replace splash with your space baby
damn i cant read after all because how do i set this value properly
show the code
oh yeah
i still need to know how to make gradients and manipulate enhancements/jokers
Also how would I separate name and text from localize, since that guide uses localization files, and how would it plug into loc_txt exactly?
like
do you want to put the name and local text into the SMODS.joker?
or whatever consumable
you cant change the description without using localization files, since the only way is by pointing to a different key in the localization file by returning a key in loc_vars
how can i make only a certain booster pack type spawn in the shop for a round?
i see it uses get_pack("shop_pack")
but the shop_pack is nowhere to be found
I suppose, since my main goal is to allow a joker to switch state and name
do i just make a custom pool
since its a string thats probably just an identifier thats used for a seed/whatever other functionality
you could probably hook that function and check if the one argument is "shop_pack"
Is there a way to make a quiz as a boss blind?
i mean theres wordle and chrome dino boss blinds that have been made
its definitely possible, you'll just have to figure out the majority by yourself
Well, that's going to be a challenge. I wanted to make The Splapp, doesn't allowed played hands if you miss an Impossible Quiz question
Which mod did the wordle one?
aikoyori's shenanigans
Now to study how they work to make my own.
I would assume so, but I have no shaders in my mod.
🤷 idk then
Let's just hope it was a one off occasion.
you can at least read the crash properly in the lovely log or if you copy paste it
Oh well, I closed it lol
Eris, you are absolutely right. Something has gone wrong with the Negative shader, because my game crashed trying to spawn a Negative Joker
Probably interrupted
well if your mod does absolutely nothing rendering-related it might be another mod you have that does?
glitched crash my beloved
I need to properly make a replication for that so I can fix it
me when im a breakcore album cover
Anyone know how to make buttons in Balatro?
read up on ui https://github.com/Steamodded/smods/wiki/UI-Guide (the actual button bit is only a small thing but you definitely need to know more than that)
So how can I spawn a card from a custom pool?
how does it even occur
that + yahimod = maybe a boss blind
use SMODS.ObjectType https://github.com/Steamodded/smods/wiki/SMODS.ObjectType, and then use the key of it as the set inside of an add/create_card call
idk what the root cause is but a lot of text seems to cause it
guys how do i properly use https
is it the text just getting horrifyingly stretched?
as eris said, you can't. you need to use a loc file for this
Yea I figured it out, I meant using a loc file but ig i worded it wrong, it's working now so thanks you both
What dies minh = 8 represent in the context of scales?
I'm looking in the UI guide, and I'm confused by this part.
I think so, it's something happening in love's rendering
minh is minimum height
so it forces it to be at least that big but allows it to grow if needed
hey, so a blind just- closes my game when defetaed, which its not supposed to do that
{n = G.UIT.R, config = {w = 400, h = 100, colour = G.C.RED, padding = 0.15}, nodes = {
{n = G.UIT.C, config = {w = 150, h = 50, colour = G.C.WHITE, padding = 0.15}}, nodes = {
{n = G.UIT.T, config = {text = 'Just a test', colour = G.C.BLUE, padding = 0.15}}
}
{n = G.UIT.C, config = {w = 150, h = 50, colour = G.C.WHITE, padding = 0.15}}, nodes = {
{n = G.UIT.T, config = {text = 'Just a test again', colour = G.C.BLUE, padding = 0.15}}
}
}},
{n = G.UIT.R, config = {w = 400, h = 100, colour = G.C.RED, padding = 0.15}, nodes = {
{n = G.UIT.C, config = {w = 150, h = 50, colour = G.C.WHITE, padding = 0.15}}, nodes = {
{n = G.UIT.T, config = {text = 'Just a test once more', colour = G.C.BLUE, padding = 0.15}}
},
{n = G.UIT.C, config = {w = 150, h = 50, colour = G.C.WHITE, padding = 0.15}}, nodes = {
{n = G.UIT.T, config = {text = 'Just a test for the last time', colour = G.C.BLUE, padding = 0.15}}
}
}}
}}```
Where do I load this into balatro to test it?
Your UI can be in any file as long as that file is loaded in.
At least that's how the private branch of WCCO works.
-# YMMV
No, like any spot in my code that I should to make sure it doesn't snap the game?
I would suggest at like the top or bottom of your code.
been trying to make a joker that basically saves you if you run out of hands by giving you an extra hand for an increasingly higher money penalty. Got most aspects of it working, but it still activates and deducts the money even if I get enough points to win the blind.
Right now I'm trying to compare the current chips to the blind requirements, but it checks the score before it updates (e.g. I have 100 points out of the 300 required, I play a final hand for 500 points, and G.GAME.chips still gives 100, even though context.after should be after the score has already calculated).
Any other way I could make this work? something like checking the points of the hand before it gets totaled? I could maybe do a different scoring context but I think this is the last one before I'd actually get the game over screen.
ease_hands_played(card.ability.extra.extra_hands)```
Have you tried flipping < to >?
Maybe a logic error?
Do I put it in consumables or on a boss blind like I plan to or?
Anywhere in any file that gets loaded.
i.e: Private WCCO slaps the UI code at the top of Jokers.lua
And my UI code toggles copyright music for all the WC Agent rarity Jokers.
quick question, I remember being shown a link for a github or something that had the vanilla jokers code for reference, where can I find that?
VanillaRemade on GitHub
thank you
yo, can someone pls help me out? im having a lot of issues, my balatro its crashing a lot
code plz, and log
yes, I tried playing a bit with values and logic but the problem seems to be that G.GAME.chips gives the wrong number. (I put ease_dollars(G.GAME.chips) and it was always the amount of chips from my previous hand)
i dont code, but i have the log
Crash log (obtainable via CTRL + C on crash screen) and code (if you're a mod dev).
then log and mods you were using, if applicable
Perfect, send it here and we'll see what's wrong.
Hmm. One of the mods you have (I don't know which) mixed up enhancements and seals, to my admittedly bad figuring
what do you recommend for me to do?
