#💻・modding-dev

1 messages · Page 688 of 1

frosty rampart
#

you're doing a retexture mod, right? I would highly suggest just using malverk, it'll handle the replacement work for you
or if you need to change the atlas a card uses, just take ownership of it

#

above_stake is UI only, in vanilla it's for the vertical positioning next to the deck and with galdur it's used for the menu itself. applied_stakes is gameplay, it affects what other stakes actually have an effect in-game and galdur uses that info to build the stake stack

inner terrace
#

It's... a bit weirder than that! Though I do actually have some malverk compatibility (if the mod detects malverk installed, instead of loading the retextures like it normally would, it loads them as malverk texturepacks)
All of the retexturing for non-malverk works using take_ownership. This is a specific menu for changing what skin is being used for a card
The popup menu displays the different skins, which is where I'm encountering this issue
It works perfectly if it's only displaying the same kind (all animated or all static) but if it's trying to display both it encounters issues

silk latch
#

so then what do I do with the actual timer logic thing that I moved back to calculate?

    calculate = function(self, blind, context)
        if G.SETTINGS.paused then
            return 0
        else
            if blind.effect.extra.timer + (0.1 * (blind.effect.extra.timer_speed * math.min(G.SETTINGS.GAMESPEED, 4) / 4) / 3) >= blind.effect.extra.timer_end and not G.GAME.blind.disabled then
                G.E_MANAGER:add_event(Event({
                    func = function()
                        local any_selected = nil
                        local _cards = {}
                        for _, playing_card in ipairs(G.hand.cards) do
                            _cards[#_cards + 1] = playing_card
                        end
                        for i = 1, 1 do
                            if G.hand.cards[i] then
                                local selected_card, card_index = pseudorandom_element(_cards, 'mannpower_haste2')
                                G.hand:add_to_highlighted(selected_card, true)
                                table.remove(_cards, card_index)
                                any_selected = true
                                play_sound('card1', 1)
                            end
                        end
                        if any_selected then G.FUNCS.discard_cards_from_highlighted(nil, true) end
                        return true
                    end
                }))
            else
                blind.effect.extra.timer = blind.effect.extra.timer +
                    0.1 * (blind.effect.extra.timer_speed * math.min(G.SETTINGS.GAMESPEED, 4) / 4) / 3
            end
        end
    end
#

so after moving that to behind the SMODS.Blind, it crashes with this.

inner terrace
near coral
versed swan
#

Given a function that takes a seed for pseudorandomness, does the seed have to be a return value of pseudoseed() or can it just be a static value?

#

i.e. is providing the return value of pseudoseed() needed for proper pseudorandomness, or just redundant?

faint yacht
#

I was referencing this bit of code:

        self.children.back = SMODS.create_sprite(self.T.x, self.T.y, self.T.w, self.T.h, atlas_key, self.params.bypass_back or (self.playing_card and G.GAME[self.back].pos or G.P_CENTERS['b_red'].pos))
        self.children.back.states.hover = self.states.hover
        self.children.back.states.click = self.states.click
        self.children.back.states.drag = self.states.drag
        self.children.back.states.collide.can = false
        self.children.back:set_role({major = self, role_type = 'Glued', draw_major = self})
inner terrace
faint yacht
#
            self.children.center.states.hover = self.states.hover
            self.children.center.states.click = self.states.click
            self.children.center.states.drag = self.states.drag
            self.children.center.states.collide.can = false
            self.children.center:set_role({major = self, role_type = 'Glued', draw_major = self})
normal crest
inner terrace
#

Sick, I'm willing to bet role_type = 'Glued' is what I was missing

normal crest
# silk latch
local original_update = Game.update
function Game.update(self, dt)
  original_update(self, dt)

  local blind = G.GAME.blind
  if not G.SETTINGS.paused and blind and blind.config.blind.key == 'bl_modprefix_meow' then
    blind.effect.extra.timer = blind.effect.extra.timer + dt

    -- trigger after 10 seconds
    if blind.effect.extra.timer >= 10 then
      -- reset timer to 0
      blind.effect.extra.timer = 0

      -- do your effect that happens every 10 seconds here
      print("meow")
    end
  end
end

SMODS.Blind {
  key = 'meow',
  loc_txt = {
    name = "meow",
    text = { "meow" }
  },
  config = {
    extra = {
      timer = 0
    }
  },
  boss = { min = 1, max = 10 }
}

it's missing checking for whether the blind is disabled or defeated

#

but you get the idea

normal crest
inner terrace
hardy vessel
#

Question about main_start and the like, how would you add a new line to text? (I want the text on a joker to display vertically instead of in one long line)

fading rivet
#

with new smods you can switch to using {element:#} though

silk latch
#

in order to hijack another mod's booster (like with Omen Globe), do I have to have a higher priority than it?

unreal cosmos
#

crashes when i hover over a custom blind, and it renders as just a thin line

idle plaza
unreal cosmos
# idle plaza What error is shown when it crahes?

Oops! The game crashed:
functions/UI_definitions.lua:4415: attempt to index a nil value

Additional Context:
Balatro Version: 1.0.1o-FULL
Modded Version: 1.0.0~BETA-1620a-STEAMODDED
LÖVE Version: 11.5.0
Lovely Version: 0.9.0
Platform: Windows
Steamodded Mods:
1: DeluxeBlinds by MrSpaceFish [ID: DeluxeBlinds, Version: 0.0.1]
2: DebugPlus by WilsontheWolf [ID: DebugPlus, Version: 1.5.3~dev, Uses Lovely]
Lovely Mods:

Stack Traceback

(3) LÖVE metamethod at file 'boot.lua:352'
Local variables:
errhand = Lua function '(LÖVE Function)' (defined at line 616 of chunk [lovely debugplus.console "debugplus/console.lua"])
handler = Lua function '(LÖVE Function)' (defined at line 616 of chunk [lovely debugplus.console "debugplus/console.lua"])
(4) Lua global 'create_UIBox_blind_popup' at file 'functions/UI_definitions.lua:4415'
Local variables:
blind = table: 0x08994338 {disable:function: 0x08994660, _saved_d_u:true, original_key:cane, mult:2, mod:table: 0x080f0f90, unlocked:true, registered:true, _discovered_unlocked_overwritten:true (more...)}
discovered = boolean: true
vars = nil
blind_text = table: 0x088ff1b0 {}
_dollars = number: 5
target = table: 0x089a3b40 {type:raw_descriptions, vars:table: 0x089359d8, key:bl_deluxe_cane, set:Blind}
(*temporary) = nil
(*temporary) = string: "bl_deluxe_cane"
(*temporary) = number: 1
(*temporary) = number: 22.0146
(*temporary) = table: 0x08753d18 {x:11.08567839196, w:1.3, y:0.8008374410286, h:1.3, scale:0.988, r:-0.019812468962916}
(*temporary) = number: 0.988
(*temporary) = table: 0x086e5e88 {x:-30, w:80, y:-11, h:33.5, scale:1, r:0}
(*temporary) = table: 0x08d54128 {y:1.665, x:11.086944444444}
(*temporary) = table: 0x08d54188 {y:5.05, x:8.5333333333333}
(*temporary) = table: 0x08d541b0 {}
(*temporary) = number: 0
(*temporary) = boolean: true
(*temporary) = number: 22.5
(*temporary) = number: 33.5
(*temporary) = Lua function '?' (defined at line 130 of chunk [SMODS _ "src/ui.lua"])
(*temporary) = boolean: true
(*temporary) = boolean: true
(*temporary) = string: "attempt to index a nil value"
(5) Lua method 'hover' at Steamodded file 'src/overrides.lua:360'
Local variables:
(*temporary) = table: 0x089369d8 {blind:table: 0x08994338, force_focus:true, card:table: 0x085235d0, center_key:c_base, center:table: 0x0880d228}
(6) Lua method 'update' at file 'engine/controller.lua:397'
Local variables:
self = table: 0x082ebfa8 {held_button_times:table: 0x0844bf10, focus_cursor_stack_level:1, snap_cursor_to:table: 0x08d54d90, interrupt:table: 0x08508478, GAMEPAD:table: 0x08413948 (more...)}
dt = number: 0.00699463
(7) Lua upvalue 'gameUpdateRef' at file 'game.lua:2769'
Local variables:
self = table: 0x081957c0 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, F_ENGLISH_ONLY:false, sort_id:235, F_DISCORD:true, STAGE:1, F_MOBILE_UI:false, F_NO_SAVING:false (more...)}
dt = number: 0
(8) Lua method 'update' at Steamodded file 'src/ui.lua:456'
Local variables:
self = table: 0x081957c0 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, F_ENGLISH_ONLY:false, sort_id:235, F_DISCORD:true, STAGE:1, F_MOBILE_UI:false, F_NO_SAVING:false (more...)}
dt = number: 0.00699463
(9) Lua field 'update' at file 'main.lua:1024'
Local variables:
dt = number: 0.00699463
(10) Lua function '?' at file 'main.lua:962' (best guess)
(11) global C function 'xpcall'
(12) LÖVE function at file 'boot.lua:377' (best guess)
Local variables:
func = Lua function '?' (defined at line 933 of chunk main.lua)
inerror = boolean: true
deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"])
earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])

#

any idea whats causing this

#

??

#

@idle plaza do you know what might be causing this

naive agate
#

not sure why but it doesn't give ^2 mult per negative joker

daring fern
unreal cosmos
#

does anyone know why my blind is crashing the game?

daring fern
# naive agate

You still need to check if context.other_joker exists.

unreal cosmos
#

for some reason the joker appears as a blank line too

silk latch
#

Did you start counting the values from 0?

unreal cosmos
silk latch
#

x and y for the atlas position

unreal cosmos
#

looks like thats why

silk latch
#

yeah the first one is 0, 0

unreal cosmos
silk latch
#

src, but the atlas is in the main folder

unreal cosmos
#

it looks like half the blind icon

#

can the atlas be in the assets folder?

#

it looks like this

silk latch
#

the physical png goes in assets/1x and assets/2x, what does the atlas' code is in the main.lua thing

silk latch
silk latch
#

weird lol

unreal cosmos
#

ohh

#

theres no space between the blinds

silk latch
#

okay yeah that would do it

unreal cosmos
#

anyone have a placeholder blinds spritesheet

unreal cosmos
#

it looks like a localization issue

fringe oxide
#

i created a consumable that gives 1.25 mult per joker owned (when the consumable is held), and the game crashes when i play a card

fringe oxide
#

like wha

naive coral
#

i think in the togas pack mod theres a consumable that gives 3$ at round end, called glteapot. you could look at that for inspiration

daring fern
urban wasp
#

i'm not sure why the pluralization function from cryptid/spectrallib that i use does not function anymore on steamodded 1606b+. it's tested to work fine on 1503a and presumably below, but i can't get it to work on 1606b or 1620a. what's going on?

#
[manifest]
version = "1.0.0"
dump_lua = true
priority = -2

# right from cryptid
[[patches]]
[patches.pattern]
target = "functions/misc_functions.lua"
pattern = '''
assembled_string = assembled_string..(type(subpart) == 'string' and subpart or format_ui_value(args.vars[tonumber(subpart[1])]) or 'ERROR')
'''
position = "at"
payload = '''
assembled_string = assembled_string..(type(subpart) == 'string' and subpart or (Chimes.pluralize and Chimes.pluralize(subpart[1], args.vars)) or format_ui_value(args.vars[tonumber(subpart[1])]) or 'ERROR')
'''
match_indent = true
#

i don't really understand regex much so this is hard to debug for me

#

oh also by "doesn't work" i mean that pluralization just turns into nil

#

i'll give an example

#
c_chm_letter = {
    name = "Letter",
    text = {
        "Remove the {C:dark_edition}Edition#<s>1#{} and {C:enhanced}Enhancement#<s>1#{}",
        "from#< up to>1# {C:attention}#1#{} selected card#<s>1#,",
        "then add#<, a>1# random {C:attention}seal#<s>1#{} to #<each,it>1#"
    }
},
faint yacht
#

Is the patch actually succeeding in applying that change?

urban wasp
#

i'll check if the line exists on 1606b

faint yacht
#

I had to change one of my patches for 1620a specifically.

urban wasp
#

ok so interestingly no

#

however if the or 'ERROR' is removed, then two exist

faint yacht
#

Tried adding times = 1 to the patch specification?

urban wasp
#

hold on

#

even weirder, the line just doesn't exist at all (even without the error bit) on steamodded 1503a

#

which is odd because if i remove the patch then it also doesn't function

#

i think

#

hold on

#

nevermind steamodded just didn't load

#

(ignore that)

#

ok after looking through this for a moment, it seems as if the patch targets a line that doesn't exist, and only 2 lines without the or 'ERROR' bit attached exist
however, on 1503a, the pluralization breaks in the same way as seen above if the or 'ERROR' is removed, even though it doesn't seem to exist in lovely/dump/functions/misc_functions.lua... which makes no sense to me

#

wait interestingly one of them has this attached

ret_string = assembled_string or 'ERROR'

which would make it match

#

but the same exact bit exists in 1606b

#

argh this is such a stupid issue

#

oh my god i'm stupid i forgot the dump would have the end result and not the target

#

🤦

#

hopefully there's a solution to this because that area got moved around in 1606b and i'm not sure what to target now

urban wasp
#

is it possible to use SMODS.Back.initial_deck to create duplicates of cards?

#

i.e. a deck that starts with, say, 2 5s of spades

daring fern
urban wasp
# daring fern No, you would have to use `apply` for that.

could i get an example of how to use that to add cards to my deck? i'm currently using a really weird hook to remove all aces from my deck and then add duplicates of 5s, 4s, 3s, and 2s of every suit to my deck which is technically the effect but i'd like to know how to do it correctly

faint yacht
#

Add an event in the apply that calls SMODS.add_card for the wanted additional cards, with area set to G.deck.

gilded blaze
#

don't forget to update starting deck size for Erosion-like effects

uneven drift
#

This might be a stupid and oddly specific question, but how do you mark cards your joker destroys as destroyed for glass joker canio etc. because my joker is destroying the card but not causing those cards to activate

gilded blaze
#

how are you destroying the cards with your joker

uneven drift
#

if chosenCard.ability.name == 'Glass Card' then
chosenCard:shatter()
return true
else
chosenCard:start_dissolve(nil, not silent, 1, no_juice)

#

now that I think about it the no_juice is unnecessary but thats besides the point

gilded blaze
#

yea, calling shatter or start_dissolve directly isn't gonna trigger destroy-card-related contexts

uneven drift
#

but eh I liked it spelled out

#

oh ok

#

so how do I trigger em

gilded blaze
#

what's the full effect

#

I need context on that before deciding which way to destroy the card

uneven drift
#

At the start of the blind if selected the joker chooses a card at random, gains chips equal to twice the rank (50 instead if stone, gives 1 gold if gold, and glass plays the shatter sound effect)

#

and then destroys it

#

or, y'know, whatever else shatter() does

#

chooses a card in ur deck, mind ya

#

my description for the joker was better worded

gilded blaze
#
calculate = function(self, card, context)
    if context.setting_blind and not card.getting_sliced then
        local selected_card = pseudorandom_element(G.playing_cards, pseudoseed("seed")
        if selected_card then
            -- do your joker scaling here, before destroying the card
            SMODS.destroy_cards(selected_card)
        end
    end
end
uneven drift
#

oh so you use smods.destroy_cards

gilded blaze
#

because it's not played cards that are destroyed, like Glass destroying itself by chance

uneven drift
#

yeah they arent being played

gilded blaze
#

context.destroy_card doesn't make sense here, that's why we're using SMODS.destroy_cards instead

daring fern
uneven drift
#

yup that did it thanks

#

maybe ill add some other stuff if the destroyed cards have seals, but I gettin eepy

#

if it destroys a red seal it destroys again

#

🔪 better not make ur deck only red seals

#

ya yeet

#

it is a fun card its the complete opposite of my other one lol

gilded blaze
#

uh, that doesn't make sense

#

joker retriggers are separate from playing card retriggers

uneven drift
#

hence the maybe, doesnt seem quite fitting

#

the free dollar is pushing it but, I think it should really only be 1 gag

#

cuz at that point might aswell change the description to triggers any card based effect on em

gilded blaze
#

makes it a tiny bit stronger without bumping the rarity

#

cool

uneven drift
#

Maybe, its an uncommon right now tho but it is a more unreliable trading card

#

but trading card gives money this scales chips

#

this is my other card btw, im tempted to make it so if jobangles (the destroyer) doesnt select a negative card it rolls again

#

for jobingles I really wanted to add a hologram/certificate/etc. based legendary joker, cuz we dont have one that adds cards to deck

#

and also negative cards are silly

uneven drift
gilded blaze
#

negative playing cards are way too broken when talking about vanilla balancing

uneven drift
#

true

#

it is a really strong legendary

#

way too strong for base game

#

if I were to change it, I'd prob change the edition to something else

gilded blaze
#

I added the fixed chance for the same reason
it was 100% at first

uneven drift
#

marble joker gives you an enhancement, certificat gives you a seal, jobingles gives you an edition

#

(and jokers with editions give x2)

#

but, eh

#

Could make it so you get a negative after a big blind

#

but if u pull a legendary card ante 7 and arent wanting to go to endless, it is no value unless u already got some

#

which I guess is fair there is that 2x king/queen for abandon deck u can just sell it but

#

the odds of not having a negative at ante 7 is like, y'know

#

but eh, this is modded 😛 who needs balance

gilded blaze
#

depends on which way of balancing you want to do for a mod

#

on a scale of 1 to 10 (vanilla to Cryptid)

#

mine is 3+2i btw ThisIsFine

uneven drift
#

?

#

3+2i?

gilded blaze
#

3 is the real part, which corresponds to the scale
2i is the imaginary part, which corresponds to unique mechanics my mod has

uneven drift
#

jobangles doesnt seem that bad, and if it feels too scaley ill tone it down

#

im less likely to tone down jobingles, cuz its a legendary (and also I like the concept of negative cards, as unbalanced as they may be)

#

I could see myself make jobingles only generate 1 negative card a selection

#

eh y'know

#

make that 9 an 8

#

(I dont know if that changes the number)

#

I'm gonna try to make jobingles as balanced as it can be considering the circumstance of free negative cards

#

thats probably my philosophy

gilded blaze
#

replace it with editioned cards

#

guarantee first card added to be negative, exclude negative for subsequent ones

uneven drift
#

maybe

#

I'll think about it

#

but yeah, common/uncommons I wanna try to keep some sort of leash on it.

#

Legendaries, it depends

#

I wouldnt want them to be insta win buttons (to be fair, if u get jobingles ante 7, is 3 negative cards gonna win the run guarenteed? probably not lol)

#

6 might have tho

#

jobingles def scales tho, if u get him early not only can u build around him with death and stuff but also he'll generate more

#

but yeah maybe ill make it a random edition / only negative on the first go

#

Does feel like it compliments certificate adding seals, and marble adding enhancements

#

anyway, nighty

#

thanks for the help

#

❤️

gilded blaze
#

marble is the oddball tho

#

it only adds stone, rather than a random enhancement

uneven drift
#

True

#

I guess this legendary is kinda a fusion of those 2 uncommons if I went that path

#

Kinda anyway

#

Does the random stuff of cerificate, but doesnt add to hand but throws them in ur deck like marble

#

It would probably be more fun if its random

#

More I think bout it more your sellin me

fathom star
#

How can i get the final chip count of a played hand?
like i wanna check if my hand scored greater than a specific variable

daring fern
silent sail
#

ive got a fun bug where going back to menu resets a counter and causes very high value gain

wispy falcon
#

It's been a while but I'm back with new motivation to mod! :D

How do I make Sprites/images be on screen and move them without breaking the game? I want to make a slot machine for one of my boss blinds and videos aren't that nice to look at imo. They break the game flow and such

silent sail
#

can someone tell me how id fix this to prevent it still not consuming hand space after the enhancement is remvoed

gilded blaze
#

it's not "+1 hand size", it's "takes 0 slots"
why would it reduce hand size on removal

#

replace calculate with these fields:

{
    add_to_deck = function(self, card, from_debuff)
        card.ability.extra_slots_used = -1
    end,
    remove_from_deck = function(self, card, from_debuff)
        card.ability.extra_slots_used = 0        
    end,
}
hushed field
#

I'm working with attributes and the new weight system, and wanting to increase the weight of objects with specific attributes if they have the given attribute. Checking objects from the pool means they're not cards, though, so I can't use Card:has_attribute. Is there another intended function to use?

#

Oh, I guess I can literally just check on the card 😅

wispy falcon
#

<@&1133519078540185692>

#

Thank you :3

silk latch
#

By the way, to hijack another mod's booster (like with Omen Globe), does my mod have to have a higher priority than it?

fading rivet
#

use context.create_booster_card or context.modify_booster_card

daring fern
daring fern
gilded blaze
#

figures, no idea why I ditched that when editing the message

wild patrol
#

what do you think would be some fun odds for this

hushed stump
#

Least lucky based card in Balatro

wild patrol
#

you think wheel odds would be funny or 1/2

#

the tarot is basically broken with oops all 5s

#

but the mod allows twitch chat to mess with the game so I dunno if that would affect balacning

hushed stump
#

Idk

fading rivet
slate turtle
#

fuck

gilded blaze
#

c_luminite doesn't seem to be a valid consumable key
it's missing your mod prefix

#

should be c_wheeloff_luminite

slate turtle
#

wait maybe i have to try c_wheeloff_luminite

gilded blaze
#

wait nvm

#

I used wheeloff for some reason

#

it should be your mod prefix, which is not shown in the crash log

slate turtle
#

also my custom blind anims are not playing 😭

slate turtle
slate turtle
uneven drift
#

thank you certificate for having the exact same code im looking for 🔥

#

Well, not the exact same. But almost

#

🔥

rigid solar
#

I didn't know G.pack_cards can exist without the cards field?

uneven drift
#

the legendary clown NERFED

uneven drift
#

hmm

desert wadi
#

Hey can someone help me load an editable config, it keeps crashing when I try to call SMODS.load_mod_config()

glossy plume
#

Is there a way, when making a mode, to disable certain base game jokers?

uneven drift
#

After an hour of me being stupid finally got it to work 🔥

#

@gilded blaze clown NERFED. And maybe more fun? 👀

#

The first selection is a negative card

glossy plume
#

Saga john

#

is that like

uneven drift
#

all other selections are random but cant be negative

glossy plume
#

my long lost relative

uneven drift
#

he only does base game editions I dont feel like bingling all the possible balloon animals

#

jobangles is complete now, got every case where a card could have modified chips

#

&& also funny gold clause

#

maybe ill make an achievement if you own both of them at once ~~idk how to do that 😭 ~~

#

Also, jobingles generates foil cards that jobangles can yeet for more chips
is this, synergy?

#

I might do a last card destroyed text on the description, so you dont have to search the deck to see what it yeeted

#

some qol

frosty dock
#

no need to call that function yourself

desert wadi
#

So I can edit it ingame

uneven drift
#

jobangles ate the 5th suit

#

making the collection card ace of spades like the rest sleep
make it a made up card suit awoken

frosty rampart
slate turtle
#

why doesntit work 😭

SMODS.Tag{
    key = "geode_tag",
    loc_vars = function (self, info_queue, tag)
        info_queue[#info_queue+1] = G.P_CENTERS["p_wheeloffortune_mega_deposit_pack"]
    end,
    atlas = "wheeloffortune_Tags", pos = { x = 0, y = 0},
    apply = function (self, tag, context)
        if context.type == 'new_blind_choice' then
            local lock = tag.ID
            G.CONTROLLER.locks[lock] = true
            tag:yep("+",G.C.WHEELOFFORTUNE_DEPOSIT_P,function ()
                local key = 'p_wheeloffortune_mega_deposit_pack_'..(math.random(1,2))
                local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2,
                G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true})
                card.cost = 0
                card.from_tag = true
                G.FUNCS.use_card({config = {ref_table = card}})
                card:start_materialize()
                G.CONTROLLER.locks[lock] = nil
                return true
            end)
            tag.triggered = true
            return true
        end 
    end
}```
sleek valley
#

you're just trying to make a booster pack, right?

desert wadi
sleek valley
uneven drift
#

Im making so many jokers when blind is selected lol

#

maybe ill think about a skip joker, after im done makin the one im on

slim ferry
#

if your booster pack does not have artwork variants, you should just use the key of it

sleek valley
# slate turtle yep

alright, well vanilla remade already does most of the work for you

SMODS.Tag {
    key = "standard",
    min_ante = 2,
    pos = { x = 1, y = 2 },
    loc_vars = function(self, info_queue, tag)
        info_queue[#info_queue + 1] = G.P_CENTERS.p_standard_mega_1
    end,
    apply = function(self, tag, context)
        if context.type == 'new_blind_choice' then
            local lock = tag.ID
            G.CONTROLLER.locks[lock] = true
            tag:yep('+', G.C.SECONDARY_SET.Spectral, function()
                local booster = SMODS.create_card { key = 'p_standard_mega_1', area = G.play }
                booster.T.x = G.play.T.x + G.play.T.w / 2 - G.CARD_W * 1.27 / 2
                booster.T.y = G.play.T.y + G.play.T.h / 2 - G.CARD_H * 1.27 / 2
                booster.T.w = G.CARD_W * 1.27
                booster.T.h = G.CARD_H * 1.27
                booster.cost = 0
                booster.from_tag = true
                G.FUNCS.use_card({ config = { ref_table = booster } })
                booster:start_materialize()
                G.CONTROLLER.locks[lock] = nil
                return true
            end)
            tag.triggered = true
            return true
        end
    end
}
slim ferry
#

the math.random thing its for randomly selecting a variant

frosty rampart
keen totem
#

is there anything like a "quick restart" that you can do for the game

timid zinc
#

is there a way to redeem a voucher while in blind select or after opening a booster pack? (so, context.type immediate)

#

alt+f5

keen totem
#

alr

#

thank you

silent sail
#

does anyone know anything about custom shaders

slate turtle
#
SMODS.Tag{
    key = "geode_tag",
    loc_vars = function (self, info_queue, tag)
        info_queue[#info_queue+1] = G.P_CENTERS["p_wheeloffortune_mega_deposit_pack"]
    end,
    atlas = "wheeloffortune_Tags", pos = { x = 0, y = 0},
    apply = function (self, tag, context)
        if context.type == 'new_blind_choice' then
            local lock = tag.ID
            G.CONTROLLER.locks[lock] = true
            tag:yep("+",G.C.WHEELOFFORTUNE_DEPOSIT_P,function ()
                local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2,
                G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true})
                card.cost = 0
                card.from_tag = true
                G.FUNCS.use_card({config = {ref_table = card}})
                card:start_materialize()
                G.CONTROLLER.locks[lock] = nil
                return true
            end)
            tag.triggered = true
            return true
        end 
    end
}```
?
sleek valley
#

local card should be using SMODS.create_card instead of just Card

slate turtle
#

local card = SMODS.create_card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2,

#

?

sleek valley
#

no, that's on me, i should've been more clear
local card = SMODS.create_card { key = 'p_your_booster_key', area = G.play }

slate turtle
#
SMODS.Tag{
    key = "geode_tag",
    loc_vars = function (self, info_queue, tag)
        info_queue[#info_queue+1] = G.P_CENTERS["p_wheeloffortune_mega_deposit_pack"]
    end,
    atlas = "wheeloffortune_Tags", pos = { x = 0, y = 0},
    apply = function (self, tag, context)
        if context.type == 'new_blind_choice' then
            local lock = tag.ID
            G.CONTROLLER.locks[lock] = true
            tag:yep("+",G.C.WHEELOFFORTUNE_DEPOSIT_P,function ()
                local card = SMODS.create_card{ key = 'p_wheeloffortune_mega_deposit_pack', area = G.play }
                card.cost = 0
                card.from_tag = true
                G.FUNCS.use_card({config = {ref_table = card}})
                card:start_materialize()
                G.CONTROLLER.locks[lock] = nil
                return true
            end)
            tag.triggered = true
            return true
        end 
    end
}```
 this better?
sleek valley
#

much better

slate turtle
#

it still doesnt work tho

#

im using debugplus

#

-i get the tag

  • blind select
  • deposit pack doesnt appear
inner terrace
#

Is it possible to have atlas changes be reflected without reloading - similar to changing config options without reloading? Changing the atlas will cause it to initialize properly next load, but if I try to use take_ownership to apply it after the game is already loaded up, I get an error:

sleek valley
inner terrace
#

Which is weird because that same atlas key is during initialization no problems, but if I use the mod prefix in front, it instead renders the default "not unlocked" sprite

sleek valley
inner terrace
#

The menu I've set up is, surprisingly, working, it just doesn't take effect until a restart

slate turtle
sleek valley
inner terrace
#

This is a submenu from clicking on a joker in a custom "additions" menu (it's reskins for vanilla jokers, so there's no additions menu in the config by default)

#

Clicking either of these means that is the skin that will be used for that joker next time the game restarts. I'm trying to figure out if I can get it to take effect without the restart

sleek valley
#

Ahhh i see
Sadly idk how to help you and im about to go to bed, but i hope someone else can give you the answer

inner terrace
#

No worries! Goodnight!

uneven drift
#

Yapping joker, instead of saying what he actually does says something at random when u select the blind

#

🔥

#

I should make blueprint compatible but only to say a message

#

but eh

glossy plume
#

is there a way to hide the mod name that appears under the rarity?

#

I'm making a mod with a polaroid camera joker that freezes values on other jokers, and so to do that i have to remake the jokers themselves so i can change them

frosty rampart
#

whenever you take ownership, do it like this:

SMODS.Joker:take_ownership("ancient", {
  -- ...all the ownership code...
}, true)

that true at the end hides the mod badge

glossy plume
#

Alright, thanku

#

Does there have to be something in the take ownership thingie for it to work? trying with an empty take ownership and a true at the end and it still shows up

inner terrace
#

It may need to be "j_ancient", not just "ancient"

frosty rampart
#

no taking ownership specifically lets you leave out the prefix

inner terrace
#

oh, really?

#

oh well, I'm not going back to remove all mine haha

frosty rampart
#

you still need a mod prefix, but because you're taking ownership on specifically SMODS.Joker or SMODS.Consumable or whatever, it already knows what type of object you're working with

inner terrace
#

Ohhh, that makes sense

frosty rampart
glossy plume
#

Yeah i just remade the entire thing myself cuz i didnt know about take ownership lmao

#

and then disabled the vanilla one from the joker pool

inner terrace
#

Oh, in that case there's probably a better option, but using the same take_ownership method, it would be like

-- ownership code
}, true)```
frosty rampart
#

no that wouldn't work at all in this case, because the true only controls whether the taking ownership mod replaces the existing badge

inner terrace
#

Ohh

frosty rampart
#

since the remade ancient copy originated from polaroid, it'll always have the polaroid mod badge

glossy plume
#

So if it did take something from the ancient joker, then it would hide it?

unreal cosmos
uneven drift
#

spent 1 hour making this card and 6 hours making the various lines if u buy jokers, sell jokers, and sell itself 🔥

#

probably a better mr.bones

#

but u are sacrificing a hand every turn to keep him around..

#

anyway, dev talk done 👀

unreal cosmos
#

it looks like it cant make the blind popup

#

ok i fixed it

frosty rampart
#

show line 22 in blinds.lua, as well as the surrounding context

unreal cosmos
frosty rampart
#

it should just be context.other_card.ability.played_this_ante, get rid of the (true)

near coral
#

How come I can't give color to the small and tiny blind the same way I can the boss blinds

silk latch
frosty rampart
frosty rampart
# silk latch okay then wtf was vremade's Omen Globe doing bc I have this

don't take ownership of anything, just give your voucher a calculate function like this

calculate = function(self, card, context)
  if context.create_booster_card and context.booster.config.center.group_key == "k_cry_program_pack" and pseudorandom("developer_console") > 0.8 then
    return { set = "Mannpower", key_append = "ar2" }
  end
end
silk latch
#

oh thank fuck that's way simpler

frosty rampart
#

ya create_booster_card is a lifesaver

near coral
#

When I set the color the same was as with boss blinds it stays gray

frosty rampart
#

non-boss custom blinds are really jank at the moment
lemme dig into morefluff to see how that does it for bigger blind real quick

near coral
#

Here is the code for them just in case there's something I also had to change but didn't know of

frosty rampart
#

why exactly are the boss_colour lines commented out

near coral
#

Idk I didn't write the code I only changed the hexes

frosty rampart
#

try uncommenting them?

near coral
#

By commented you mean the -- right?

frosty rampart
#

ya

#

i'm looking at bigger blind and i don't really see any special patches or hooks related to setting the color

#

so boss_colour should just work for non-boss blinds i think (at least on the blind select screen)

near coral
#

Ok it worked

frosty rampart
#

nice lol

near coral
#

So colorful

#

(One of them coincidentally happens to be the same color it was)

hushed stump
#
SMODS.Joker{
    key = 'Shaco',
    atlas = 'TrickyJoker',
    pos = {
        x = 0,
        y = 0
    },
    rarity = 4,
    cost = 20,
    blueprint_compat = true,
    calculate = function(self, card, context)
        local jokerstable = {}
        local jokerabilities = {}
        for i = 1, #G.jokers.cards do
            table.insert(jokerstable, G.jokers.cards[i])
        end
        for index, value in ipairs(jokerstable) do
            table.insert(jokerabilities, SMODS.blueprint_effect(card, jokerstable, context))
        end
        return SMODS.merge_effects(jokerstable)
    end,
}

Guys, it's crashing cause it says that it attempted to index config, which is a nil value
That's totally true, I didn't declare config. But that's on purpose, I don't need any config
Why can't I use an empty config (like

config = {
}

)?

frosty rampart
#

ok so the crash isn't because your joker doesn't have a config, i's because you're merging jokerstable instead of jokerabilities in your return
but i don't think you need jokerstable in the first place. literally just do
table.insert(jokerabilities, SMODS.blueprint_effect(card, G.jokers.cards[i], context)) in the first for loop

hushed stump
frosty rampart
#

yea, the second thing i suggested would fix that too

hushed stump
#
msg = string: "[SMODS _ \"src/utils.lua\"]:2216: attempt to index field 'config' (a nil value)"

This was the crash

frosty rampart
#

it's probably from the passing the whole table to blueprint_effect. it's expecting a single joker so it presumably checks that joker's config for something. a whole table of jokers does not have a config field

hushed stump
#

yeah, that would explain it

hushed stump
#

cause i'm getting a crash on the insert function

frosty rampart
#

oh wait it's backwards, my bad
should be SMODS.blueprint_effect(G.jokers.cards[i], card, context)
card in a joker's calculate function is always that joker that's calculating

hushed stump
#

i tried to avoid inserting the joker's own ability by doing this:

calculate = function(self, card, context)
        local jokerabilities = {}
        for i = 1, #G.jokers.cards do
            if (G.jokers.cards[i] ~= card) then
            table.insert(jokerabilities, SMODS.blueprint_effect(card, G.jokers.cards[i], context))
            end
        end
        return SMODS.merge_effects(jokersabilities)
    end,
frosty rampart
#

wait no some of the documentation is just bad?

#

idk

#

you were right the first time

#

what's the new crash

hushed stump
#

but in vanillaremade the blueprint implementation is the other way around

hushed stump
frosty rampart
#

ohh right
blueprint_effect might not return anything at all
it should be this i think

local copy_effect = SMODS.blueprint_effect(card, G.jokers.cards[i], context)
if copy_effect then
  table.insert(jokerabilities, copy_effect)
end
hushed stump
#

in this case

frosty rampart
#

yep

hushed stump
#

if copy_effect
is the same as
if copy_effect ~= nil

hushed stump
#

why wouldn't it return anything tho?

frosty rampart
#

well technically not quite, but for this purpose yea that's correct

frosty rampart
frosty rampart
hushed stump
#

and is such a weird operator imo

#

in lua, of course

#

i literally had to search it up

#

and took some time to understand it

#

alr so now it's not crashing, but it's not doing anything either

frosty rampart
#

oh wait you probably have to unpack the table
so return SMODS.merge_effects(unpack(jokerabilities))
it takes the effect tables themselves as separate arguments

#

that should hopefully be it lol

hushed stump
frosty rampart
#

yea it can take any amount of arguments, lua is cool like that
if you put ... as the arguments in the function definition, you can refer to {...} as a table of all the arguments

#

so it needs to be separate arguments, not one single table of all the effects

#

that's what the unpack function does

hushed stump
#

can't i check my own code values somehow? a debugger of some kind?

frosty rampart
#

if you have the DebugPlus mod installed, it'll put a console in-game, and you can just have print("something") in your code and it'll pop up in the console

#

put print(#jokerabilities) after the loop to see if it's actually getting blueprint effects

frosty rampart
#

#some_table is the number of elements in some_table

red flower
#

it takes tables of effect tables

frosty rampart
#

bleh

#

ok don't unpack

#

my bad

red flower
#

i get confused every time i use it and i wrote it lmao

hushed stump
#

no worries

#

alr that worked but

#

why am i seeing the table printing all the time

#

ik, i printed it on purpose but

#

shouldn't it only print once it needs to calculate?

red flower
#

well calculate is called a lot

#

like when you select a card

frosty rampart
#

or whenever you hover over a card that has a probability (like bloodstone)

#

and it's called a bunch of times during the main scoring loop

hushed stump
#

interesting

#

i'm now having a bit of an issue, which is totally expected.
if blueprint copies my joker, and my joker copies blueprint, and i have an extra joker, abilities of that extra joker are triggered 5 times instead of 3
that's expectable tho, i need to force it not to copy the abilities of blueprint only if blueprint is copying him
same for brainstorm

urban wasp
uneven drift
#

How would I go about making a joker thats unable to show up in the shop (I wanna make a joker that can only spawn from another one when conditions are met--kinda like gros michel/cavindish but you dont gotta find the cavindish equivilant in the shop)

#

is there a variable in SMODS.joker I can set?

urban wasp
#

just do this and it won't appear in-shop

uneven drift
#

cool, thanks

urban wasp
#

how would i go about correctly making it such that if 4 aces are destroyed in one round, my deck will unlock? i thought my implementation used to work but i guess not now that i've tested it.

local original_card_remove = Card.remove
function Card:remove()
    if self:get_id() == 14 then
        if not G.GAME.bof_wooden_destroyed then
            G.GAME.bof_wooden_destroyed = 0
        end
        G.GAME.bof_wooden_destroyed = G.GAME.bof_wooden_destroyed + 1
        if G.GAME.bof_wooden_destroyed >= 4 then
            for k, deck in pairs(G.P_CENTERS) do
                if deck.key == "b_bof_l_wooden" and deck.check_for_unlock then
                    local unlocked = deck:check_for_unlock()
                    if unlocked then
                        G.GAME.bof_wooden_destroyed = 0
                    end
                    break
                end
            end
        end
    end
    return original_card_remove(self)
end

...

local original_end_round = end_round
function end_round()
    G.GAME.bof_wooden_destroyed = 0
    return original_end_round()
end
#

in the deck:

check_for_unlock = function(self)
    if G.GAME and G.GAME.bof_wooden_destroyed and G.GAME.bof_wooden_destroyed >= 4 then
        return true
    end
    return false
end,
hushed stump
#
SMODS.Joker{
    key = 'Shaco',
    atlas = 'TrickyJoker',
    pos = {
        x = 0,
        y = 0
    },
    rarity = 4,
    cost = 20,
    blueprint_compat = true,
    calculate = function(self, card, context)
        local jokerabilities = {}
        for i = 1, #G.jokers.cards do
            if (G.jokers.cards[i].label ~= Blueprint) and (G.jokers.cards[i].label ~= Brainstorm) and (G.jokers.cards[i].label ~= j_Planetarian_Shaco) then
                local copy_effect = SMODS.blueprint_effect(card, G.jokers.cards[i], context)
                if copy_effect then
                    table.insert(jokerabilities, copy_effect)
                end
            end
        end
        return SMODS.merge_effects(jokerabilities)
    end
}

Been smashing my head against this. Why is it still copying blueprint?

urban wasp
#

i'm not sure if i've seen "label" before

#

try making the string the key and then making it check for G.jokers.cards[i].key ~=

hushed stump
#

I've printed all G.jokers.cards[i].label values, and it gave me Blueprint, j_Planetarian_Shaco, and Jolly Joker, which were what I expected

urban wasp
#

oh nevermind then

hushed stump
#

they're all nil

#

center_key is different tho

#

i get j_blueprint, j_Planetarian_Shaco

urban wasp
#

ok that's good

hushed stump
#

idk about jolly joker, didn't bother to check him

urban wasp
#

should just be j_jolly

#

try doing everything you did in your code using this

hushed stump
#

alr
nothing works now! great

urban wasp
#

damn

#

:(

hushed stump
#

oh, it's inside another table i think

#

it's copying, but it's the same thing

#

copying blueprint, even tho i specified it not to

#
SMODS.Joker{
    key = 'Shaco',
    atlas = 'TrickyJoker',
    pos = {
        x = 0,
        y = 0
    },
    rarity = 4,
    cost = 20,
    blueprint_compat = true,
    calculate = function(self, card, context)
        local jokerabilities = {}
        for i = 1, #G.jokers.cards do
            if (G.jokers.cards[i].config.center_key ~= j_blueprint) and (G.jokers.cards[i].config.center_key ~= j_brainstorm) and (G.jokers.cards[i].config.center_key ~= j_Planetarian_Shaco) then
                local copy_effect = SMODS.blueprint_effect(card, G.jokers.cards[i], context)
                if copy_effect then
                    table.insert(jokerabilities, copy_effect)
                    print("Copied effect of", G.jokers.cards[i].config.center_key)
                end
            end
        end
        return SMODS.merge_effects(jokerabilities)
    end
}
#

INFO - [G] Copied effect of j_jolly
INFO - [G] Copied effect of j_jolly
INFO - [G] Copied effect of j_blueprint
INFO - [G] Copied effect of j_jolly
INFO - [G] Copied effect of j_jolly
INFO - [G] Copied effect of j_blueprint

This is what I get out of it, stupidly

#

aaaaaaaaaaaaaaaaaaaaaaaaaand

#

i'm comparing to a non existing string, yaaaay

#

"j_blueprint"

#

gosh

#

of course it would always return true since it's not nil

uneven drift
#

is there a way to make a custom joker debuff immune?

daring fern
uneven drift
#

thank ya

hushed stump
#

how do I check my own joker ability?

SMODS.Joker{
    key = 'Shaco',
    atlas = 'TrickyJoker',
    pos = {
        x = 0,
        y = 0
    },
    rarity = 4,
    cost = 20,
    blueprint_compat = true,
    calculate = function(self, card, context)
        local jokerabilities = {}
        for i = 1, #G.jokers.cards do  
            local copy_effect = SMODS.blueprint_effect(card, G.jokers.cards[i], context)
                if copy_effect then
                    table.insert(jokerabilities, copy_effect)
                end
        end
        return SMODS.merge_effects(jokerabilities)
    end
}

I wanted to check if copy_effect was the same as my own joker, so it doesn't get added to the jokerabilities table

#

this prevents copying blueprint and brainstorm when they're copying my Shaco joker, and prevents my own joker from copying itself

gilded blaze
#
{
    calculate = function(self, card, context)
        local jokerabilities = {}
        for i = 1, #G.jokers.cards do
            if G.jokers.cards[i].config.center_key ~= "j_modprefix_Shaco" then
                local copy_effect = SMODS.blueprint_effect(card, G.jokers.cards[i], context)
                if copy_effect then
                    table.insert(jokerabilities, copy_effect)
                end
            end
        end
        return SMODS.merge_effects(jokerabilities)
    end
}
hushed stump
#

as i don't want to check the current joker, rather the ability

#

i tried to do it by indexing the current jokers and do it based on positions

#

however

#

this becomes unpractical if the user has multiple blueprints

gilded blaze
#

there, changed to using joker key

hushed stump
# gilded blaze there, changed to using joker key

still the same thing
if the center_key is blueprint it will copy the ability
and i don't want blueprint to not be copied, only i don't want it to be copied when it's copying my own joker. so if blueprint is copying one joker, i would trigger that ability 4 times instead of 3. the copied joker would be 1 time, blueprint would be 2, and my joker would be 3 and 4 since it's copying blueprint and that joker at the same time

#

for example

#

earlier i was determinating the position of shaco joker, and if it the blueprint position was that position - 1 it wouldn't insert into the table, but it was a mess

gilded blaze
#

drives me nuts DEAD

hushed stump
gilded blaze
#

you can't

#

it's an identical table

#

not the same reference

hushed stump
#

wait

#

you just gave me an idea then

#

i could create a temporary variable which holds the table of SMODS.blueprint_effect with Shaco, then compare it to copy_effect, as the tables would be identical

#

right?

gilded blaze
#

identical here means 2 tables with the same key and value

#

the 2 tables themselves are not the same, only the same keys and values

daring fern
hushed stump
#

just not the other way around, but only if they're copying my joker

#

basically i should only copy brainstorm and blueprint if they're copying another joker which isn't Shaco

hushed stump
daring fern
hushed stump
daring fern
hushed stump
gilded blaze
#

manual check here means excluding the exact target joker of blueprint and brainstorm

if G.jokers.cards[i].config.center_key == "j_blueprint" and G.jokers.cards[i+1] and G.jokers.cards[i+1].config.center_key ~= "j_modprefix_Shaco" then
end
if G.jokers.cards[i].config.center_key == "j_brainstorm" and G.jokers.cards[1].config.center_key ~= "j_modprefix_Shaco" then
end
gilded blaze
#

this is the only viable way tho

hushed stump
gilded blaze
#

also it breaks if another mod takes ownership of blueprint/brainstorm by modifying the targets

gilded blaze
#

luckily, there doesn't seem to be any mod that does it

daring fern
gilded blaze
#

ouch

#

I forgor 💀

#

blueprint stack is a thing

hushed stump
#

right

#

fuck, now i remember why i wanted to check the ability

gilded blaze
#

wait

#

you can craft your own function for comparing each key and value of 2 tables

hushed stump
#

yeah

#

but

#

comparing an entire table isn't the same as comparing each one of its values?

gilded blaze
#

oh

#
if context.blueprint_copiers_stack and context.blueprint_copiers_stack[#context.blueprint_copiers_stack] ~= card then
end
gilded blaze
#

from SMODS.blueprint_effect

hushed stump
#

alr

#

let's see

gilded blaze
#

wait hold on

#

I'm not sure if we're supposed to get the first or the last element of context.blueprint_copiers_stack

#

try both if you can

hushed stump
#

ah, okay

#
calculate = function(self, card, context)
        local jokerabilities = {}
        for i = 1, #G.jokers.cards do  
            if context.blueprint_copiers_stack and context.blueprint_copiers_stack[#context.blueprint_copiers_stack] ~= card then
            local copy_effect = SMODS.blueprint_effect(card, G.jokers.cards[i], context)
                if copy_effect then
                    table.insert(jokerabilities, copy_effect)
                end
            end
        end
        return SMODS.merge_effects(jokerabilities)
    end
#

like that?

gilded blaze
#

uh, use the first element instead

hushed stump
gilded blaze
#
if context.blueprint_copiers_stack and context.blueprint_copiers_stack[1] ~= card then
end
#

honestly I'm getting spun around at this point

frosty dock
#

what if it's blueprint copying your joker copying blueprint copying your joker?

#

I think you need to check if your joker is anywhere in the stack?

hushed stump
hushed stump
gilded blaze
#
function table.contains(table, element)
    for k, v in pairs(table) do
        if v == element then return true end
    end
end
if context.blueprint_copiers_stack and not table.contains(context.blueprint_copiers_stack, card) then
end
hushed stump
#

i was about to write that but without a function

gilded blaze
#

it's a helper function actually

#

Ortalab makes it a global, my mod appends it to tableLib instead

#

you might wanna use it elsewhere too, it's pretty common

hushed stump
#

now something quite "funny" is happening

#

blueprint and brainstorm are copying the ability of my joker correctly

#

but my joker itself isn't doing anything???

gilded blaze
#

ah crap

#

I forgor

#

Shaco is a blueprint-like joker
of course it must at least appear once in the stack

#

alrighty then

hushed stump
gilded blaze
#
if context.blueprint_copiers_stack then
    for ii, vv in ipairs(context.blueprint_copiers_stack) do
        if ii ~= 1 and vv ~= card then
            --do stuff
        end
    end
end
hushed stump
#

how's that even possible
copying an ability that a joker doesn't even have

gilded blaze
#

if Shaco is the first joker in the stack, proceed
otherwise don't

#

there, better?

hushed stump
#

hold on while i test it

#

wait but does SMODS.blueprint_effect modify a table by itself, or does it only return a value?

gilded blaze
#

it returns a new identical table

hushed stump
#

ah

gilded blaze
#

basically the table it manages to grab as one of the return values of Card.calculate_joker

hushed stump
#

my jokers are ordered like this

gilded blaze
#

wait, I'm confused

#

which joker is the first in blueprint stack then

#

😵

hushed stump
#

let me check

#

it's nil?

gilded blaze
#

how are you accessing context then

hushed stump
gilded blaze
#

what did you type in the console

hushed stump
#
eval calculate = function(self, card, context)
        local jokerabilities = {}
        for i = 1, #G.jokers.cards do  
        if context.blueprint_copiers_stack then
print(context.blueprint_copiers_stack)
        for ii, vv in ipairs(context.blueprint_copiers_stack) do
print(vv)
print(ii)
        if ii ~= 1 and vv ~= card then
            local copy_effect = SMODS.blueprint_effect(card, G.jokers.cards[i], context)
                if copy_effect then
                    table.insert(jokerabilities, copy_effect)
                end
            end
        end
        end
        end
            
        return SMODS.merge_effects(jokerabilities)
    end
#

i'll do it from code even if it's laggy

gilded blaze
#

smh

#

you're defining global calculate

#

it has nothing to do with context we're talking about

#

which is from SMODS.blueprint_effect

hushed stump
#

oh

#

also it wouldn't work because context.blueprint_copiers_stack seems to have the label of the joker it's copying

#

so if a blueprint is copying another blueprint which is copying my joker, the label would be "Blueprint" instead of "j_Planetarian_Shaco", making the table different

uneven drift
#

reee cant get this to work, but im too sleepy to fix it

#

tomorrow another day

hushed stump
#

i'm thinking of adding a custom identification to my joker

#

so this way

#

if this argument gets passed into the table (assuming the entire table gets copied), i can identify it and thus not copying it

uneven drift
#

update: I fixed it

hushed stump
#

cool

uneven drift
#

the bane of my existance, using ' ' when I needed to use " "

#

wait..nevermind

#

dont think I fixed it lol

#

not really sure why it worked that time

#

wait

#

im stupid

#

I put the same joker with 2 identical pngs to debug, gave me the one I was testing on.

#

thats why it "worked"

#

lol

#

but I think I found the error cuz im a dumbass that forgot to give the joker pos variable

#

...nevermind

#

im not sure how that didn't break the joker before

#

but it did not fix my issue 🎊

#

now ima pass out

hushed stump
#

GAAAAAAAAAAAAAAAAAAAAAAAAAH

#

it's 6 AM

#

and i couldn't solve it

#

there must be a way of identifying my joker on the stack

#

i won't give up tho

#

i'll go to sleep but i'll keep on this tomorrow

fading rivet
silent sail
#

can someone tell me why the "Nope!" text doesnt appear, i took it from vremade and it isnt working

silent sail
sly heron
#

What is that mean?!😢😢😢😢

dreamy lodge
#

So I was making a blind and im slightly confused, for some reason this effect is delayed to the start of the next played hand? I'm trying to make it update after the hand is played but its not working.. I also tried final_scoring_step but that did the same thing

frosty dock
fading rivet
#

like whats the effect description

dreamy lodge
fading rivet
#

neat

daring fern
# dreamy lodge
if context.after and G.GAME.chips+SMODS.calculate_round_score() < G.GAME.blind.chips then
    return {blindsize = SMODS.calculate_round_score()/2}
end
fading rivet
#

correct me if I'm wrong, but I belive G.GAME.chips isn't the amount scored that hand

frosty dock
dreamy lodge
frosty dock
dreamy lodge
frosty dock
#

yeah that would be why

#

you should update

dreamy lodge
#

ill go update rq then planet_x

#

Okay cool it works now thanks

#

I sometimes forget updating is a thing that I need to do

slim ferry
#

<@&1133519078540185692>

#

oh that was fast

wispy falcon
#

I'm struggling to understand shaders. Can someone help me understand it more?

ancient mango
midnight coyote
midnight coyote
#

its like C but more specific and less documented

#

theres a website too

#

called the book of shaders (?) entirely free tutorial to GLSL, but be prepared to grit your teeth and get through it

slate turtle
#

good news: my mods tag works now yay

midnight coyote
#

in that file

#

what it looks like is that you're trying to reference card when card does not currently exist at that point

slate turtle
#

yep

#

uh

#

gimmie a sec

#
--The Panopticon
SMODS.Blind {
    key = "the_panopticon",
    dollars = 7,
    mult = 1.85,
    pos = { x = 0, y = 3 },
    boss = { min = 3 },
    boss_colour = HEX("8c8a81"),
    atlas = 'Blinds',
    loc_txt = {
        ['name'] = 'The Panopticon',
        ['text'] = {
            [1] = 'Scored face cards make you lose $2.',
        },
    },
    calculate = function(self, blind, context)
        if not blind.disabled then
            if context.press_play then
                G.E_MANAGER:add_event(Event({
                    trigger = 'after',
                    delay = 0.2,
                    func = function()
                        for i = 1, #G.play.cards do
                            if card:is_face(true) then
                                G.E_MANAGER:add_event(Event({
                                    func = function()
                                        G.play.cards[i]:juice_up()
                                    return true
                                end,
                            }))
                            ease_dollars(-2)
                            delay(0.23)
                        end
                        return true
                    end
                end
                }))
            end
        end
    end
}```
midnight coyote
#

i would do it like this

  for k,card in ipairs(G.play.cards) do
    -- bla bla bla, replace i with k
  end
slate turtle
#

i just used the tooth template from vanillareforged and added the if card:is_face(true) then

midnight coyote
slate turtle
#

oh

midnight coyote
#

you could say if G.play.cards[i]:is_face() then

#

also putting true in the is_face function is not needed

#

if its a face card then is_face() would read as

if true then
if not then it would read as
if false then

#

hopefully that helped

slate turtle
wispy falcon
slate turtle
#
 calculate = function(self, blind, context)
        if not blind.disabled then
            if context.press_play then
                G.E_MANAGER:add_event(Event({
                    trigger = 'after',
                    delay = 0.2,
                    func = function()
                        for i,card in ipairs(G.play.cards) do
                            if G.play.cards[i]:is_face() then
                                G.E_MANAGER:add_event(Event({
                                    func = function()
                                        G.play.cards[i]:juice_up()
                                    return true
                                end,
                            }))
                            ease_dollars(-2)
                            delay(0.23)
                        end
                        return true
                    end
                end
                }))
            end
        end
    end
}``` 
i think so
hushed stump
#

yeyy

#

i think i did it

#

for blueprints now

daring fern
hushed stump
bold eagle
#

how do I iterate through the played hand?

#

within a joker's calculate

#

nevermind

bold eagle
#
calculate = function(self, card, context)
        if context.before then
            for _, pcard in ipairs(context.scoring_hand) do
                if pcard.get_id() >= 11 and pcard.get_id() <= 13 then
                    local newRank = pseudorandom(G.GAME.round_resets.ante,2,10)
                    local rankChange = (pcard.get_id - newRank) * -1
                    SMODS.modify_rank(pcard, rankChange)
                end
            end
        end
    end
slim ferry
#

pcard:get_id() instead of pcard.get_id()

bold eagle
#

ok cool thanks

slim ferry
#

and also that in the place where you calculate the rank change

bold eagle
#

ok

mystic river
#

is there an easy way to move the location of a sticker or am i gonna have to figure out how drawsteps work

#

"but minty drawsteps are easy" that's just, like, your opinion man

gilded blaze
#

what, you want your sticker to allow normal shader effects of the card on top of it rather than below?

mystic river
#

i literally just want to move the image of the sticker up
so it sticks above the card

#

(it's kity ears)

#

idk anything about shader effects

frosty rampart
#

look into how paperclips in paperback display i think? i'm pretty sure they move the location of the sticker so they can hang out of the regular bounds, and they're definitely just fancy stickers under the hood

gilded blaze
#

probably by utilizing alignment_offset

#

it's a Moveable thing actually, the Sprite class is extended from Moveable after all

bold eagle
#

is there a context for after cards are scored but before jokers are? I cant really find any

hushed stump
#

@frosty dock in the blueprint copying stack, do we have some way of identifying the final joker it's copying if it's chained?

hushed stump
#

isn't there a way to know that they're all copying jolly joker

#

instead of two copying blueprint and one copying jolly joker

bold eagle
#

ok, thank you

frosty dock
hushed stump
#

since it's "chained"

frosty dock
#

the stack is the copy chain

hushed stump
#

.label isn't useful here since it would return "Blueprint"

frosty dock
#

isn't it just an array of cards?

hushed stump
frosty dock
#

well what do you need out of the cards...?

hushed stump
frosty dock
#

that's not on the stack, that's the card currently being calculated

uneven drift
#

I'm trying to use card:set_ability to transition a joker into another one of my jokers, but im getting "could not find center" error message and I can't for the life of me figure out why

frosty dock
#

the stack contains the copiers

hushed stump
frosty dock
hushed stump
#

huh

frosty rampart
#

what is your goal exactly

uneven drift
frosty rampart
# hushed stump huh

if you're doing a blueprint effect to copy a card, you already have that card. it's the first card you passed into the blueprint effect function lol

#

nvm i keep typing before my brain catches up

frosty dock
#

if you're trying to get to the end of the chain from the start of it, that's a different problem

hushed stump
# frosty rampart what is your goal exactly

I have a joker that copies abilities from all of my jokers
However, I want to not copy himself (which is easy), but i also not want to copy blueprints that are directly, or indirectly copying my joker in a chain

#

This joker is called Shaco

hushed stump
#

yes

#

that's the idea

#

but why is it a problem

frosty dock
#

oh in that case it absolutely isn't

#

you just check if card is on the blueprint stack yet

uneven drift
#

yup that worked thank you, stupid me 👍

frosty dock
#

if it is, it is copying something that is directly or indirectly copying your joker

#

by blocking that effect, you're solving the problem at the end of the chain

hushed stump
#

table.contains is a custom function but

frosty dock
#

remove [#]

#

if you've defined that function, that works

hushed stump
#

alr

hushed stump
#

now i need to solve brainstorm
does it use the same stack?

#

nvm, it already works. hilarious

#

it's really strong. i always wanted a legendary like this

hushed stump
#

should it be able to copy a duplicate of it (like if I had two or more shaco jokers)?
maybe that's a bit op

sly heron
frosty dock
uneven drift
#

how do you change the cost of a jokers sell value?

#

sorry if dumb question 😭

#

could probably just look at how egg does it

uneven drift
#

I got it fam lets goo

#

🔥

past spade
#

how does one check if the blind defeated for calc_dollar_bonus is a boss?

viscid talon
#

just remembered i fucking hate localisation 😭

#

i keep getting "ERROR" which makes me think i fucked up somewhere on the localisation fetching thing

#

ive got the localisation file right here

#

the prefix for this mod is hatchl

frosty rampart
#

anywhere specific you're getting ERROR? stuff like custom rarities have extra places to localize for the badges

viscid talon
#

all of the additions ive added so far are getting errors

#

lemme specify in a sec

#

firstly, the enhancements

keen totem
#

how would you get a list of all scored cards (as compared to all played cards with G.play.cards)

viscid talon
#

i believe that info is stored in a table

#

i dont know though

viscid talon
#

ill probably make a repo to show this off a little further

frosty rampart
#

yea if i could see the code myself that'd help a lot

viscid talon
#

oh you've got to be fucking kidding me

#

it was a spelling error 😭

frosty rampart
#

oh yea i just noticed it too

#

gotta be the american way to spell the localization folder

viscid talon
#

anyways it looks like theres no actual errors with my localisation, i just dont know american

frosty rampart
#

sounds like i need to make an smods pr egg

viscid talon
#

so i wasnt dumb all along

#

ok why are my jokers not localising????

#

everything else works but the jokers return with ERROR

#

oh i wrote jokers not joker

#

buh

#

what do i do abt the Xnil ?

#

no shot i didnt do a loc vars

#

im so stupid

#

anyways i think ive got it from here! thank you c:

#

nvm

#

how do i make a joker recognise when a poker hand is being levelled up and responding accurately

#
    calculate = function(self, card, context)
        if context.joker_main then
            if G.GAME.level_up == true then
                card.ability.extra.chips = card.ability.extra.chips - card.ability.extra.chips_sub
                return {
                    message = localize { type = 'variable', key = 'a_chips_minus', vars = { card.ability.extra.chips_sub } },
                    colour = G.C.CHIPS
                }
            else
                return {
                    chips = card.ability.extra.chips
                }
            end
        end
    end```
#

idk if G.GAME.level_up == true is an actual thing i lowk just made it up

#

ik this joker is missing a dissolve, ill be adding it later

#

apparently theres smth called upgrade_poker_hands

#

@frosty rampart im duuuumb idk what im doiiiing 🥺

#

the actual concept behind the joker works fine i just dont know what line of code is used for "if joker sees a poker hand upgrade, it loses 50 chips"

frosty rampart
#

good news! new context from 1501a has you covered

viscid talon
#

woooo

#

wait is my mod on 1501a

#

lemme see

#
"Steamodded (>=1.0.0~BETA-1606b)"
#

thats over 1501a right

#

yeah i think so

frosty rampart
#

yea if the number is bigger then it works

viscid talon
#

i think ik how to fix that

dapper sun
#

how do i change the shop rate of my custom center object, like how playing cards have G.GAME.playing_card_rate?

viscid talon
#
    calculate = function(self, card, context)
        if context.poker_hand_changed == true then
            card.ability.extra.chips = card.ability.extra.chips - card.ability.extra.chips_sub
            return {
                message = localize { type = 'variable', key = 'a_chips_minus', vars = { card.ability.extra.chips_sub } },
                colour = G.C.CHIPS
            }
        end
        if context.joker_main then
            return {
                chips = card.ability.extra.chips
            }
        end
        if card.ability.extra.chips <= 0 then
            SMODS.destroy_cards(card, nil, nil, true)
            return {
                message = localize('k_extinct_ex'),
                colour = G.C.CHIPS
            }
        end
    end```
#

if card.ability.extra.chips <= 0 then crashes the game oe

#

ok it looks like ive fixed it

#

i just had to steal the ice cream code and change a few things around

unreal cosmos
#

how do i increase the winning ante?

bold eagle
#

How do I make a card have a modded enhancement in SMODS.add_card

#

A specific not random one

frosty rampart
#

"m_modprefix_enhancement", where "modprefix" is the prefix of the relevant mod and "enhancement" is the key of the enhancement

tulip pecan
#

Is there a way to make joker display use SMODS.get_probability_vars() instead of (G.GAME and G.GAME.probabilities.normal or 1) for probability numerators? I'm hooking SMODS.get_probability_vars() for a special effect, but it's not reflected on the joker display.

bold eagle
#

so set = m_modprefix_enhancement?

faint yacht
#

SMODS.add_card({ set = 'Playing Card', enhancement = 'm_modprefix_key' }) iirc.

bold eagle
#

oh ok

#

thank you

frosty rampart
unreal cosmos
#

how do you make a stake after gold stake?

frosty rampart
bold eagle
#

is there a way to check if you're currently playing in a blind in the calculate function of a joker?

frosty rampart
frosty rampart
bold eagle
#

ok so

#

im trying to make a joker that makes 4 enhanced cards when its sold in a blind

tulip pecan
#

but yeah I do see now that updated joker display does use the SMODS function

unreal cosmos
frosty rampart
frosty rampart
frosty rampart
bold eagle
#

and that can just be put in the calculate function and its chill?

frosty rampart
#

as long as you keep it within context.selling_self, yea

bold eagle
#

cool

#

thank you

frosty rampart
#

no problem

bold eagle
#

wait nevermind i did something stupid

frosty rampart
#

ah fuck my bad, it's fix_probability

dapper sun
silk latch
#

The seal I'm testing has

        calculate = function(self, card, context)
            if context.main_scoring and context.cardarea == G.play then
                SMODS.scale_card(card, {
                    ref_table = card.ability.extra,
                    ref_value = 'mult',
                    scalar_value = 'change',
                    message_colour = G.C.ATTENTION
                })
                return {
                    mult = card.ability.extra.mult
                }
            end
        end,

which seems to be crashing this but I don't know why exactly?
Am I supposed to have the Seal use scale_card on self instead?

faint yacht
silk latch
#

So I changed it to this (other_card was also crashing it) and I now have this crash

faint yacht
#

...and card.ability instead of self.config in loc_vars.

daring fern
faint yacht
#

...that too.

uneven drift
#

mfw joker bugged

#

if (context.debuff_card and context.debuff_card == card) or (context.joker_type_destroyed and context.card == card) and not context.blueprint_card then
card:set_ability("j_kdi_Kerry_rage")
end
my problem is, I only want card:set_ability to occur if it gets debuffed. The problem is context.debuff_card is called to determine if its getting debuffed

#

its proccing on asking the question not proccing off the answer

#

I guess I could have just done a conditional if it is debuff == true

red flower
#

also a debuffed card won't calculate

uneven drift
#

Yeah, thats why I was doing context.debuff_card to begin with

red flower
#

yeah but even if that was the context for when a card is debuffed it won't reach that because debuffed cards don't calculate

#

remove_from_deck might also work for what you want? it's called both on destruction and debuffing

uneven drift
#

Yeah ill show u the joker

gilded blaze
#

x2.5 Mult ThisIsFine

uneven drift
#

Basically hes a weaker michel/caven (+15, x3 -> +10, x2.5) but has utility in not being debuffed, not needing to be bought, and also can proc destroy effects (like cere dagger)

#

and an easier/more reliable trigger then just rolling a 1/6

red flower
#

yeah remove_from_deck will work good enough for the transformation
you would still need joker_type_destroyed to prevent destruction

#

remove_from_deck is a function separate from calculate if that's not clear

gilded blaze
#

no I mean
X2.5 Mult x2.5 Mult

uneven drift
#

oh

#

yeah lol

#

See thats an easy fix

silk latch
uneven drift
#

Hes angy

near coral
#

Is it possible to give unlimited hand or discards

#

Or do you just set the number of hands to the max amount

uneven drift
#

progress

#

maybe it would be better to just "remove" the card, and then add enraged kerry. As opposed to using ability

#

kinda like how that looks more then just ability tbh

#

has a nice transition to it

#

btw it worked

#

🎊

#

even made sure to keep edition type consistant

#

I could also have the stickers be retained, but I kinda like it being cleansed in a gameplay sense

silk latch
# uneven drift progress

Meanwhile my progress looks like the vague idea of my Haste Blind kinda working maybe if I tweak it or something idk.

uneven drift
#

lol

#

When in doubt, you typo'd a variable

#

while making the editions carry over

#

I had an editionType variable, but I was putting editonType in SMODS.add_card

uneven drift
#

Not sure what mercenary I should do next

#

(making references to another game)

#

Maybe gold bot, gain gold when you skip a blind

#

gold bot gives 1d6 in goot, might be too much in this game tho

#

tho I mean there is that 25 gold one, in 3 blinds thats 8.3 gold assuming u skip small

#

want to make a blind skipping joker to make up for the fact I made 3 around selecting them

uneven drift
#

easy peasy

#

if you have oops all 6's you roll with advantage

#

🔥

#

The best part about petyr is I have to retroactively make sell quotes for him

#

he just doesnt stop yapping

queen crescent
uneven drift
#

(If you are lucky it rolls with advantage) 🔥

queen crescent
#

-# specify advantage too

hushed stump
#

For example, if the amount of available hands is 1, you change it to be 2

keen totem
#

what does card.suit actually return if a card is wild?

fading rivet
faint yacht
#

card.base.suit is the actual suit.

fading rivet
#

what are you trying to accomplish

keen totem
#

i just mean whenever you check a card's suit, what do wild cards return

fading rivet
#

wild cards still have a suit

faint yacht
#

Wild cards just say yes when the card is asked about being a specific suit, regardless of its' actual suit.

keen totem
#

how can i get if a card has the wildcard effect?

frosty dock
#

unless you care about specifically the wild card enhancement, in which case check card.config.center_key == 'm_wild'

keen totem
#

is there a way to get all "suits" on a card?

#

cause theres stuff like wild cards and smeared joker

hushed stump
frosty dock
#

though a function for this will at some point be added to smods

hushed stump
#

(I just forgot the difference between editions and enhancements)

frosty dock
#

-# probably alongside everything else that's waiting for quantum ranks

hushed stump
#

?

frosty dock
#

it's called in Card:is_suit when appropriate

hushed stump
#

Ah

silk latch
keen totem
silk latch
silk latch
#

And the version for if Cryptid is installed.

silk latch
#

Might try and use the "discarding selected cards" thing for Agility, but Haste probably should stay as just discarding non-selected cards.

#

Which would probably just require using a seperate table for Haste's selections than the highlighted cards (which is what The Hook uses) and changing for _, playing_card in ipairs(G.hand.cards) do into something like for _, playing_card in ipairs(G.hand.cards) and ~ipairs(G.hand.highlighted) do (or however that would actually look), but I don't know how that would affect the if any_selected then G.FUNCS.discard_cards_from_highlighted(nil, true) thing from The Hook

wild patrol
#

why is heavy not a friends of jimbo skin

silk latch
#

Truth nuke

inland vessel
#

how would I change the color associated with Diamonds? Like when Ancient Joker has selected Diamonds, the text is orange, and when it selects Spades the text is dark purple or black or something. Where do I change those colors? And the color of the rows in the menu you get when you hover over your deck mid-round?

frosty dock
#

that's mildly unhelpful relating to changing the colors

wispy falcon
#

Oh, my bad

frosty dock
#

doing it outside of deck skins is thus problematic because it conflicts with the color changing when the deck skin does

inland vessel
#

is deck skin the High Contrast setting?

frosty rampart
#

no, it's the friends of jimbo thing

inland vessel
#

can deck skins change the color of non-face cards??

frosty dock
bold eagle
#
SMODS.add_card({ set = 'Joker', legendary = true })

Im trying to make a joker that creates a random legendary when sold but this didn't work for the joker spawning bit

#

it just spawned a random joker, not a legendary

mystic river
#

huh, that seems like it should work

hidden notch
#

Do you maybe already have all legendary jokers? Because then it just gives jimbo x3
Or did it really just spawn a normal random joker (that's not jimbo)?

bold eagle
#

It just spawned a normal random joker

#

i even tried putting rarity = 'Legendary'

hidden notch
#

I have no idea 🤷‍♀️
I don't think it would be a Version issue, but.. What SMODS-Version are you using?

#
  • Any other Mods active besides yours? ^^
bold eagle
#

1531

#

i do have some

#

ill try disabling them

#

Balatro is tweaking

#

In general not modwise

#

I gotta restart stuff

hidden notch
#

Alright x3
If there's still a problem, go install the newest SMODS release, maybe that also fixes it for ya' ^^
-# 1606 does mention "Consistency changes to SMODS.create_card by @Aurelius7309"

bold eagle
#

ok

frosty dock
# bold eagle 1531

1531 is bugged in a multitude of ways, including that it turns The Soul into judgement if you have object weights enabled

#

which is exactly the issue at hand^^

hidden notch
#

Ah well, that would do it lewxen_Noblewoman_Laugh

hidden notch
#

Alrighty, this sounds REALLY easy, but alas I'm here now FlowireStare
I have an open Question/Challenge for y'all:

Joker-Text:

X2 Chips for every 5 scoring cards
(Currently 0/5)

Base Code:```lua
if context.individual and context.cardarea == G.play then
card.ability.extra.count = card.ability.extra.count + 1
if card.ability.extra.count >= card.ability.extra.every then
card.ability.extra.count = 0;
return { xchips = card.ability.extra.xchips, colour = G.C.CHIPS }
end
end

I want this to be Blueprint compatible, but I only want the "card.ability.extra.count" to count up once per scoring card.

Reply Ping if you think you've got a working solution x3
-# The Main Goal is really just a Blueprint Compat.: "counting scoring cards and doing something every Xth scoring card"
frosty rampart
#

context.blueprint is true if it's currently being calculated as a blueprint effect, and false if the joker itself is calculating
so incrementing the count (and only that line) should be wrapped in a check for if not context.blueprint then

shell timber
#

what if the blueprints check before?

hidden notch
shell timber
#

what i would do is like store the last scored card in a variable

#

and if the card is the same dont increment it

#

also you dont need a colour for the xchips return

frosty rampart
#

wait no
what if you just count all the scoring cards in context.before

hidden notch
#

It has to work with an Setup like this and also work with Retriggers

frosty rampart
#

bleh

shell timber
hidden notch
shell timber
#

fair

wanton jolt
#

are there other ways to apply stickers than card:add_sticker

#

card.ability.stickerkey = true right

frosty rampart
#

that only sometimes works, because sometimes stickers do more than just setting that value to true (e.g. perishable sets a timer as well)
SMODS.Stickers.stickerkey:apply(card, true) should work too potentially

wanton jolt
#

oooo let me try that

hidden notch
bold eagle
wanton jolt
bold eagle
hidden notch
wanton jolt
#

uhhh maybe wrap the extra count inside a if not context.blueprint then like meta said?

hidden notch
#

If you follow the convo. a bit more; That wouldn't work for jokers that trigger before the "Counting Joker" x3

wanton jolt
#

counting joker?

hidden notch
wanton jolt
#

ok let me give this a spin

#

im waiting for revo to reply to me so

hidden notch
#

Mind you, I have tried a LOT of different things, I'm giving this simple example so someone else has some thinking room x3

bold eagle
#

how would I make a joker only appear as eternal and negative