#[API] Blockbuster

1 messages · Page 1 of 1 (latest)

undone walrus
#

Making this thread somewhat pre-emptively, as I set things up.

Blockbuster
Blockbuster is a series of API mods that offer features from the Balatro Goes Kino mod as stand-alone packages. They're set up to support other mods' use of these features without needing to also interact with Balatro Goes Kino's themes and playable content.

Blockbuster: Counters
https://github.com/icyethics/Blockbuster-Counters

Counters are a new card layer with their own calculate function and interactions, build around the concept of scaling benefits or detriments. They can be stacked onto both jokers and playing cards, and are build around having a changing value to interact with. The counters in the base mod all decrease by 1 when they're triggered, but the system is set up to let devs design counters that increase their count, or have a static count that only changes through other effects.

Blockbuster: Spellcasting
https://github.com/icyethics/Blockbuster-Spellcasting

Spells are a new mechanic that jokers, enhancements, seals and decks can access, using the cards in your hand as a recipe to build a spell!

Blockbuster: Value Manipulation
https://github.com/icyethics/Blockbuster-ValueManipulation

A system to allow for more customizable design around value manipulation mechanics, as well as a quick way to be compatible without losing precision.

gentle sapphire
#

Bakery has a "lite mode" which does a pretty similar thing (all the APIs with no content). At this point I don't think it's worth it, but it's automatically created from the main branch, so it doesn't cost me anything to keep it. If you want to look at what I did for inspiration, here's the script that generates it.

#

The reason I don't think it's worth it is that requiring a dependency is currently a gigantic burden on the end user (since it's not included automatically). I also personally feel that modular solutions like Banner are better at solving this particular problem, but I'm sure there are differing opinions on that

#

Another option is to have libraries meant to be included as submodules, but GitHub's big green "Code" button doesn't smudge submodules correctly and so that's also a decently large burden on non-technical end users (it's also slightly more annoying to package releases)

undone walrus
#

Oh yeah, I'm very aware of the annoyance of those issues. This is really just meant to be me having some space to set these things up with the hope of a proper dependency manager actually popping up, haha

gentle sapphire
#

Mostly I wanted to point you towards my script :P

undone walrus
#

I'll definitely check it out. I think the way Kino's set up probably means I'd have to refactor stuff regardless because none of its content is meant to work as an API, yet, really, hahaha

gentle sapphire
#

fairfair

#

i'm essentially just bulk-deleting lines that are just content, marked by comments in the code

#

and then some garbage to make sure patches don't run twice if two versions are installed

undone walrus
#

Got almost all of what I wanted to work working. Every Kino counter is in there with the exception of the Power Counter, as this mod doesn't provide value manipulation.

Also added some additional generic ones to showcase potential, and to have a shared base of Counters mods can interact with that.

Currently added:
Mult Counter - (+1 Mult per Counter)
Chips Counter - (+10 Chips per Counter)
xMult Counter - (x0.1 Mult per Counter)
Money Counter - (Earn $1 per Counter)
Retrigger Counter - (Retrigger once per Counter)

Detrimental Counters:
Poison Counter - (Lower current chips and mult by 5% when scored)
Debt Counter - (Lose $1 per Counter)
Stun Counter - (Debuffed for one hand per Counter)
Fire Counter - (Increments up. 1 / 10 chance to self-destruct per Counter)

earnest ivy
#

powerful

solemn crystal
#

moving over here to continue discussing the UI shader stuff
i think Sprite:draw_shader() is probably going to be helpful, it's in engine/sprite.lua in the lovely dump

in particular, it gets card.tilt_var and uses it to calculate a cursor position, which is then passed to the dissolve shader. this tilt_var should be all we need to make the UI match the card's tilting, so it's just a matter of somehow hijacking the way this particular UIBox/UIElement is rendered so we can send it to a different shader/pass some extra parameters

#

(unless it's not shaded at all, which might be the case? i'm seeing a lot of love.graphics... calls)

#

anyway i have to run to class

solemn crystal
#

ok, after looking at some love2d documentation, the idea i want to run with is:

  • hijack the UIElement rendering code to render the counter text to a canvas offscreen
  • pass the canvas to a dissolve shader that borrows the parent card's tilt_var
#

i dunno how possible this is exactly/if it makes total sense

#

but that's the basic idea. the UI needs to get into a shader somehow

undone walrus
dire badger
undone walrus
#

oof

#

That's fixed

#

I've not written competent code documentation before, so donker me know if there's any issues with it, haha

dire badger
#

better than my documentation

solemn crystal
#

@undone walrus 👀 step one complete, the whole UIBox for the text is now rendering to its own canvas (which is offscreen, hence it's not visible anymore)
step two is to shove the canvas into a sprite

undone walrus
#

Ooooh, very interesting!

solemn crystal
#

ok i know i'm doing something with regards to step 2 because the fps is dropping from 330 to sub-60. just not something right lmao
i'm sure i'll figure this out at some point tho, it's definitely feeling like it's within reach

solemn crystal
#

so it turns out that creating a new canvas object and a new sprite object with every drawstep is. not good for performance lmao

i can create a single canvas outside of the drawstep that gets re-rendered to for every card object, and that seems to be working fine, but i can't create my dummy sprite outside of the drawwstep because then it'd be created before any atlas is fully formed, and it crashes on boot
anyway i also got the UI sprite to render An Image (just from the dummy atlas), but it seems to be rendering under the actual graphic sprite

#

which is probably why the UI hasn't been visible at all, because it would be entirely covered up by the little triangle

wet turret
#

Oh shit. A new thingy

undone walrus
solemn crystal
#

ohh wait you know what
i bet i could add an extra sprite in the counter gameobject inject method

solemn crystal
#

yea that fixed the performance, just not the rendering under the other counter sprite

solemn crystal
#

turns out i am stupid and i thought that both the top and bottom counter sprites were within a single card in the atlas. they are not. it was never rendering under the real counter sprite

#

anyway that means the UI isn't rendering to the right part of the canvas

#

so i have to fix that
i also have to figure out another place to put the UI sprite, because somehow it's. overwriting the counter sprite instead of just rendering on top of it

dire badger
#

the defaults dont seem to be working, i had to set both the atlas and the config like this for it not to crash

#

i can send the crashes if it helps

#

it also doesnt show up in the mod's additions 💔

#

oh and maybe i missed it but the wiki should say where to put the localization entries

undone walrus
#

Oh, that's good to know. I think it not showing up in a mod's additions is probably me not setting up a generic way for that to load. I hadn't even considered that being needed, somehow, hahaha

#

And also a great point about the localization

solemn crystal
#

nearly there
i ended up extending the sprite class too so i could overwrite the draw_shader and draw_from functions to pass the canvas directly, instead of setting it to the UI sprite's atlas image (which was the culprit for why the regular corner sprite was disappearing for whatever reason). the canvas is currently just a yellow half-transparent rectangle, so all that's left is to get the UI to render in the right spot on the canvas

dire badger
#

counters implemented successfully

dire badger
#

u left this there

undone walrus
#

Also fixed a bug with the Burn counters, and the Blockbuster.Counters.is_counter_of_class now actually works

undone walrus
#

Working on getting functionality in for Blockbuster: Spellcasting.

From Kino, it will add the ten suit-related spells and it's related UI.

Will also set up a system to extend the system for custom suits. Ideally, I'd wanna add the spells for suitless cards as well, but I suspect that might be more dev-dependent as to what they want to do with those spells, so I'm not sure about that yet.

Also, as far as features I'm not using in Kino, I'm adding Mana. It's use will be entirely optional, and I'll have a system set up that will make spells always default to some mana cost. The idea is that you can use resources to cast spells in some way.

Also setting up non-suit based Spells, which I will add a system for random picking similar to Counters for. That way, for example, you could make a Pyromancer joker with 'Cast a random Fire Spell'.

#

Because spells are a bit more complex to understand immediately, compared to counters, I'm also porting the Spellslinger Deck from Kino over. Technically just a content mod with an API at that point, I guess

#

Also, as I'd need to figure this out for most parts of Blockbuster I wanna set up, I'll try and see how I can make counters appear on a mod's addition page soon, as well

barren nebula
#

Why are you using at patches when targeting the -- TARGET: comments

#

🤨

undone walrus
#

will be fixed asap

undone walrus
#

did a quick fix for that

#

thanks for letting me know!

undone walrus
undone walrus
#

making progress on the expanded spell systems!

#

Biggest upcoming thing to do will be documenting all the features I've been setting up, haha

undone walrus
#

I've started work on Blockbuster: Value Manipulation today. Gonna document that development a bit more so people can chime in, as I suspect that one will be more actively used

#

The current system, as planned, is based on what is implemented in Kino. This means that the system is only multiplicative, with no support for additive value manipulation.

Compatibility with this system is always opt-in. There'll be no intended support for a generic value manipulation method, a la Cryptid. Opting-in will be done by just setting a key when your mod is being loaded, with your preferred method of compatibility. The chosen method will tell the code how to read in your jokers.

On a joker, you will be able to override the method and opt for another. Additionally, you'll be able to hardcode in specific values to be exempt, per object, just as an additional layer.

The setting of value manipulation will work similarly to how setting debuffs work, with the source providing a key, which can be used to remove or change the value manipulation from that source.

The compatibility method will look for variable names, and based on those, decide whether the number value should be altered. For example, the base version of the API will provide the 'Blockbuster' compatibility mode, which will change the values of every number, except those named 'chance', or 'stacks', or those ending with '_non'.

undone walrus
#

the Value Manipulation API's minimally set up. It's a functional replacement for the Kino system. Working on making it more adaptable now!

undone walrus
undone walrus
#

Repo was private, oops. It's public now

undone walrus
#

Planned features:

  • Compatibility with all objects (not just jokers)
  • Integer only variable conventions, so you can have specific values never be not a whole number (Added)
  • CompatStandard max & min values. In case you don't want your mod's jokers to be able to be boosted to 1000x power, and just cap out at 10x (Added)
  • Potentially: variable specific caps. (Added)
  • Joker caps, able to add Max values to specific values for that joker/card only (Added)
undone walrus
#

Oh, also planning on making the value manipulation standard information that's set up now be able to be toggleable, so it's not always there

undone walrus
#

Turns out adding a variable specific cap also wasn't too difficult. Current set up only allows for that if the full name matches, though, just to simplify the process a bit. Might expand that at some point if there's a need, but I'm not sure there would be

undone walrus
#

They're undocumented at the moment, but also pushed the additional variable control

undone walrus
#

Also added some intermediary functions to give a bit more control. It's set up to only work for jokers, explicitly now, while I try and mess around with broader implementation.

#

Will add a system that makes cards like Juggler compatible next, then port it into #1340334060597285025, and start work on the functionality for the other objects then!

undone walrus
#

Also added compatibility for cards that have add_to_deck functions. I suspect there's some jank with increasing hand size, though, will have to mess around a bit to see if I can fix that

undone walrus
#

In backporting this to Kino, I realized it might be good to allow jokers to have a table of forbidden sources. That way you can prevent a joker's power being boosted by itself, or a copy of itself, to avoid recursive loops. Gonna add that in today as well

eager frost
#

Oh it's here!! Sick

undone walrus
#

Added some more debug functions, LSP definitions and some more robust customizability. Documentation is currently all still LSP and Readme, but I'll start up the wiki soon enough

solemn crystal
#

(i ended up just using a raw love.graphics.print call to draw the text instead of futzing around with UI)

solemn crystal
#

I SOLVED IT
new video incoming shortly

dire badger
#

huge

solemn crystal
solemn crystal
undone walrus
#

Would definitely be something worth considering also turning into an SMODS pr, if that's something you'd be willing to do (or if you'd appreciate it, I can try and set that up!)

solemn crystal
#

hell yeah
making it an smods PR definitely sounds like a good idea, but I'll probably need to think over how I want the API to work exactly (unless you have an idea of that already)

undone walrus
#

I think it'd be most functional if it'd function basically exactly to setting up a sprite in the draw step. Though I also reckon Eremel and Aure might have more valuable takes on what would be good for Smods integration

solemn crystal
#

true

#

i do have another PR open with smods rn actually, so i should probably focus on getting that merged

undone walrus
#

I think the people handling PRs are kinda swamped atm, so there's probably no rush, haha

solemn crystal
#

ye (I just pushed a new commit that addresses everything that was asked of me, aside from the util functions)

solemn crystal
# undone walrus Would definitely be something worth considering also turning into an SMODS pr, i...

whoops i felt like coding instead of doing art today
i ended up managing to simplify the CanvasSprite itself a lot for the PR's purpose, i don't actually need to override anything except Sprite's init function
https://github.com/Steamodded/smods/pull/1020

GitHub

This is the beginnings of a new feature that, among other possibilities, allows for text that changes mid-game to be drawn as if it was printed on a card. Really, this is far more broad than that, ...

undone walrus
#

I'll have a look at that later!

#

Before I get distracted from figuring out value manip stuff. Trying to work on making it compatible with enhancements and consumables, though luckily that all seems manageable

#

Logic question that's worth figuring out: Do I try to set it up so value manipulation on objects with multiple layers can be separated out per layer. So that a playing card with an enhancement and an edition has the enhancement and the edition be treated separately 🤔

solemn crystal
#

default behavior should affect the whole card at once, but yea i think it makes sense to allow value manip to target specific layers

undone walrus
#

Going to need to dive a bit deeper into how the localization for this is handled, I reckon, haha, because it draws those from the config, rather than its own ability.consumeable table for consumeables. Haven't messed around with that before, so I'll have to see what can and can't be savely changed, and what needs a more robust approach

undone walrus
#

Value Manipulation no longer worked when running Cryptid as well, due to priority issues. Should be resolved now!

undone walrus
#

Going to need to do more testing, but I think the value manipulation on consumeables has also been set up and working!

#

Though there's the risk of it being dependant on some hardcoded stuff, but I'll need to just hope people that use the API will let me know when issues pop up during development

undone walrus
#

I think I have enhancements also set up to work. Seals and editions next, and I think I'm comfortable leaving at that, then. Going to see if I can implement a neat way to target only values given by specific layers, once everything's working

undone walrus
#

Okay, I think most of these are properly set up. Seals I'm not setting up for the moment, just because I need to check a bunch of vanilla code to see how that will end up working. Going to do some test runs with the mods I've set up to be compatible, and see how drastically I can break things

undone walrus
#

https://github.com/icyethics/Blockbuster-ValueManipulation/tree/non-joker-compat

Set it up as a branch. This version of the API should also be able to handle consumables, editions and enhancements, and let you target only one of them at the time, as well.

GitHub

Adds a system for Value Manipulation compatibility to Balatro, intended to offer an opt-in method - GitHub - icyethics/Blockbuster-ValueManipulation at non-joker-compat

#

I will need to test it a bit more before I'm brave enough to merge anything, though, haha

undone walrus
#

Nothing seems to break in testing, but I think I'll just need to imitate some cryptid use cases in a small mod and see what I can break

undone walrus
#

I think I won't be setting up value manipulation for hand types, as I feel like all its game design space is set very strongly in the realm of Cryptid's misprint deck

undone walrus
#

Gonna come back to the notion that value manip will affect all objects on a card by default, and instead make it so it only targets the center by default (so the joker, consumable or enhancement, depending on the target). You'll be able to specify both additional and alternate layers to also let it target edition and potential modded layers on a card

undone walrus
#

Realizing that the way I handle specific incrementing values isn't perfect. Jokers like popcorn reset back to starting values when their values reset. Going to see if htere's an easy heuristic to account for that, because I'd need that to be able to handle value manip on card upgrade values, too

undone walrus
#

https://github.com/icyethics/Blockbuster-ValueManipulation/tree/non-joker-compat

Still testing more stuff, because I'm very unsure as to whether it's entirely set up properly. But, updated the non-joker compat branch to let you target specific card layers, including bonuses.

GitHub

Adds a system for Value Manipulation compatibility to Balatro, intended to offer an opt-in method - GitHub - icyethics/Blockbuster-ValueManipulation at non-joker-compat

#

@fringe solstice I know you had content you'd like to use that relied on value manip targetting non-jokers. I haven't implemented anything yet that affects base chips value for playing cards, but you originally wanted that too, right?

fringe solstice
#

yep

undone walrus
#

My own testing's not shown any major issues, so I've merged the non-joker-compat to main. The README describes how to use it properly

#

If you're setting up your own compatibility standard, I also heavily recommend adding max_highlighted to the integer only table, to make sure your consumables don't get to target 1.31 cards

fringe solstice
#

one thing that would be cool but sadly would likely clash with the current implementation would be a way for different sources to affect different values - such as a joker that exclusively increases chip-related values on your other jokers, while also being able to have, say, a blind that weakens xmult values
though saying that now i have a potential idea for implementation so i might actually see what i can do about trying to add that in a pull req

fluid sparrow
#

yeah you could probably do that with tags for joker key and extra key combinations

undone walrus
#

There's definitely a way for that to work, yeah, but that does get in bigger issues as far as adding more complicated variable naming conventions

#

I've talked with Victin about it, and it runs basically into the same issue that I already have with unprepped codebases and my approach to scaling jokers, where I have to make an additional compat standard to get things to work

#

And there'd be basically no way besides very intense effort on every mod that'd want to be compatible with that system to have to restructure a lot of code to make sure every final pay-out version of a value is correctly marked

#

The other option, though, which I do use in Kino and is (for some reason) part of the counters API, is the separate power-change system I've set up that weakens pay-out values. It's decently simple to set up, the issue there is exclusively with UI being able to reflect things

#

But I'd love to hear your idea, because I'm sure I'm potentially missing a decent solution for the problem

fringe solstice
#

i was thinking it could work by either a seperate function or an optional argument for the manipulate values function that basically just takes a whitelist of value names its allowed to manipulate, like {"x_chips" = true, "chips" = true} and it only manips them if they're in the whitelist and not in that joker's convention's blacklist
but idk maybe that rus into the issues you described

potent obsidian
barren nebula
#

It was supposed to be a gif 🥺

#

I give up

undone walrus
#

@winter stone I'm currently out, so I can't help rn, but just put any questions or unclear things you run into here and I'll give some help or answers when I get back!

winter stone
#

Oh so this is the forum

winter stone
#

how does this work?

undone walrus
# winter stone how does this work?

The values in these table make it so the values can be manipulated, but will only snap to integers. So if the base value is 3, and you boost power by 1.5x, it will turn into 4.5, then round it up, and become 5.

winter stone
undone walrus
#

Yup. The best use case is anything that creates cards. Or things like selection limits, additional hands, joker slots, etc.

winter stone
undone walrus
#

Could be, but I meant for how many cards can be selected for the purposes of tarot card effects, and the like

winter stone
#

Who else is currently using this api

undone walrus
#

MoreFluff and GrabBag are compatible. Kino has a built in version. Ren uses it for HodgePodge

#

Oh, and Autumn will most likely incorporate it soon, I suspect

winter stone
#

I’ve not got the chance to do so and I plan to when I can.

fluid sparrow
#

i don't know how the api works actually since ice wrote the mf compat standard

undone walrus
#

Yeah, I'm really the only one comfortable with it still, haha

#

Not a lot of mods that don't rely on Cryptid use Value Manipulation after all

winter stone
#

ok time to start working on jimbo's code

#

ok how do i use this actually

undone walrus
#

If you post the effect you're trying to make work, I'm sure I can guide you along a bit!

winter stone
#

ice?

undone walrus
#

If you set your mod key in the compat standard, it should happen automatically

winter stone
#

oh yeah about

Blockbuster.manipulate_value(card, source, num, change)```
#
SMODS.Joker{
    key = "joker",
    atlas = "jimbo",
    pos = { x = 0, y = 0 },
    soul_pos = { x = 0, y = 2, new = { x = 0, y = 1 } },
    pools = { ["Grandiose"] = true, ["bustjokers"] = true },
    rarity = "busterb_Grandiose",
    cost = 500,
    blueprint_compat = true,
    eternal_compat = true,
    unlocked = true,
    discovered = true,
    config = {
        extra = {
          valuemodification = 10
        },
        immutable = { valuecap = 1e100 }
    },
    loc_txt = {
        name = "{V:1,s:2}JIMBO{}",
        text = {
            "{C:legendary}Legendary Jokers{} can spawn in the shop and are free,",
            "all jokers {C:legendary}Legendary{} and Below have {V:2,s:2}X#1#{} joker values."
        }
    },
    loc_vars = function(self, info_queue, card)
        return { vars = { card.ability.extra.valuemodification, " ", colours = {SMODS.Gradients["busterb_balatro"], SMODS.Gradients["busterb_epileptic"]}} }
    end,
    add_to_deck = function(self, card)
       Blockbuster.manipulate_value(card, source, num)
    end,
    calculate = function(self, card, context)

    end,
    remove_from_deck = function(self, card)

    end
}
#

This is all i have atm

undone walrus
#

The only way to really do proper continuous value manipulation atm is by running it in update. If the function recognizes that the current vval manip is equal to the existing one, it doesn't trigger again, so it doesn't run too often

winter stone
#

update?

undone walrus
#

yeah, the update function on a joker

#

Though I'm realizing that there's probably a better way to do an aura-like effect, that I could support with the API, by allowing there to be build in a way to have permeating effects, so that they also affect the values of jokers in the shop, and such

winter stone
undone walrus
#

The base function only triggers once, and the way you've set it up currently wouldhave it target itself. What you want to do is have it set up as follows:

update = function(self, card, dt)
    if G.jokers then
        for _index, _joker in ipairs(G.jokers.cards) do
          Blockbuster.manipulate_value(_joker, "your_key_of_choice_here", card.ability.extra.valuemodification)
        end
    end
end,
remove_from_deck = function(self, card, from_debuff)
    for _index, _joker in ipairs(G.jokers.cards) do
        Blockbuster.reset_value_multiplication(_joker, "your_key_of_choice_here")
    end
end```
winter stone
#

I wonder if you can math.min it

#

Cause you do see the “valuecap”

undone walrus
#

what do you mean?

winter stone
#
immutable = { valuecap = 1e100 }```
#

i was thinking you'd just write immutable in the compat_standard

#

can you write

Blockbuster.manipulate_value(_joker, "jkrvm", math.min(card.ability.immutable.valuecap,card.ability.extra.valuemodification)
undone walrus
#

I'm not sure why you would, in this case? There's only a single number, right?

winter stone
# winter stone

oh yeah, jimbo should've been x10 here, maybe i should add something like "and not JIMBO"

#

the other problem is that this joker would probably also multiply for each frame, that means this joker will continuously multiply joker values until it hits zero or something

undone walrus
#

I'm not sure what the immutable table in this case is for

winter stone
undone walrus
#

no, the function doesn't add up, it overwrites

undone walrus
winter stone
#

how do you write this again?
if G.jokers and not key == "j_busterb_joker" then

undone walrus
#

you'd want the check when you iterate. Key needs to be an assigned value somewhere

winter stone
#

j_busterb_joker is JIMBO btw

#

i don't want this joker to fucking self-multiply automatically

undone walrus
#

yeah, I get that. You can just do if _joker == card in the for loop that goes over G.jokers.cards

winter stone
#
 if G.jokers then -- << Here?
        for _index, _joker in ipairs(G.jokers.cards) do
          Blockbuster.manipulate_value(_joker, "jkrvm", card.ability.extra.valuemodification)
        end
    end
end,
undone walrus
#

no, after the for loop

#
 if G.jokers then
        for _index, _joker in ipairs(G.jokers.cards) do
            if _joker ~= card then Blockbuster.manipulate_value(_joker, "jkrvm", card.ability.extra.valuemodification)
            end
        end
    end
end,
#

oh, yeah, I'm realizing now that it's better to protect against the key, haha, your first instict was right. That makes it so 2 copies don't keep increasing each other's value

winter stone
#
 if G.jokers and _joker == card then```
#

do i also have to add it in the remove_from_deck thing?

undone walrus
#

Yes, that wil reset the values

winter stone
#

it seems unchanged

#
update = function(self, card, dt)
    if G.jokers and _joker ~= card then
        for _index, _joker in ipairs(G.jokers.cards) do
          Blockbuster.manipulate_value(_joker, "jkrvm", card.ability.extra.valuemodification)
        end
    end
end,
remove_from_deck = function(self, card, from_debuff)
  if G.jokers and _joker ~= card then
    for _index, _joker in ipairs(G.jokers.cards) do
        Blockbuster.reset_value_multiplication(_joker, "jkrvm")
    end
  end
end
undone walrus
#

Does the update function actually trigger?

winter stone
#

MY GOD IT'S TRIGGERING EVERY FRAME

#

ASTRO IS EVERYWHERE

#

i coded in asriel to always spawn an astro when destroyed

#

god what do i do

undone walrus
#

There's no reason for a new one to spawn every frame based on what you've posted here, at least

winter stone
#

this is what i wrote under asriel

remove_from_deck = function(self, card)
  if not G.CONTROLLER.locks.selling_card  then
    SMODS.add_card{ key = "j_busterb_astro", edition = 'e_negative', stickers = {'eternal'}, force_stickers = true }
  end
end
}```
#

oh yeah, nothing changed, it's still the same number

#

idk what's wrong

undone walrus
#

I'd turn the debug config option on, so you can see if the joker is actually compatible. There's also a bunch of debug functions set up so you can figure out what's going wrong

winter stone
#

Is vallkarri compatible

#

Wait, so all other mods are incompatible?

#

Except for more fluff and grab bag

undone walrus
#

It's opt-in, a mod is only compatible if it opts in

#

But

#

there's a converter in the code, meaning that if cryptlib is present, it's automatically using that to convert

#

Which is why I brought up blockbuster as a valid option, because being bb compatible automatically means your value manip is cryptlib compatible

winter stone
#

I have cryptlib/cryptid enabled, yeah.

#

I say / because it can go either way, just not both at the same time.

#

oh yeah, i wonder if hot potato is also incompatible (i still have cryptid enabled)

#

what the fuck, even my own jokers are unchanging

#

even without everything

#

it still does not change

#

why

undone walrus
#

Did you enable the debug option in the config?

winter stone
#

why is it blank

undone walrus
#

No localization entry. But no worries. The next thing to try is whether the hotkey version of value manip does work

winter stone
#

hotkey?

undone walrus
#

hover over your jokers and press space and k at the same time

winter stone
#

the hot key works

undone walrus
#

then the update function in your code doesn't run correctly. I'd just add some print statements to see where it goes wrong

winter stone
#

none of the words are showing up

undone walrus
#

oh yeah, remove that first _joker == card check

#

_joker doesn't exist there, so it can't ever equal card

winter stone
#

where do i put it then

gentle sapphire
#

It looks like you don't even need the loop, just Blockbuster.manipulate_value(card, ...)

winter stone
winter stone
#

Maybe I’ll make it so that it only works if all jokers are added to deck?

#

Or what if all jokers gain x4 values when scoring?

#

God I’m losing hope for this joker.

gentle sapphire
#

oh, soory, i misunderstood what you were trying to do

gentle sapphire
winter stone
#

give all jokers x10 values atm

undone walrus
# winter stone

this should work if you just turn if _joker == card into if _joker ~= card

winter stone
#

it works

#

i tested it

eager frost
#

hii, I'm changing my code to use this API instead for value manipulation, and its going pretty well so far! 1 thing i wanted to point out was I dunno if it's an error on my end but I don't think shoot the moon can have it's values manipulated properly, might be vanilla thing

solemn crystal
#

watch the score on the left to see if it's actually not being manipulated, it could just be the message that's hardcoded

eager frost
#

it seems like its not being manipulated in scoring

solemn crystal
#

ah ok, interesting

undone walrus
#

Oh, I'll check it out. The fact that the card text isn't set up the match would suggest something's hardcoded somewhere in the vanilla code, yeah

solemn crystal
#

@undone walrus the blockbuster counters readme still says the value manipulation api isn't released yet

undone walrus
#

Yeah, I realized that last week. Wanted to up date it after checking out the PR for visuals you made, and then just forgot, hahah

undone walrus
#

Due to it being easier to set up a whole new mechanic as its own module, I've been setting up a new feature for Kino as a Blockbuster module

#

Blockbuster: Playsets is an API that will let you create curated content lists that players can select during their run start, at the same time as they're choosing their deck and stake. The first version, the one I've almost finished the bones for, will allow any modder to make Playsets and content packages to present to their player. After I release that, and go back to older Blockbuster modules and do some maintenance, I will focus on releasing an update that will focus on letting players create their own playsets in game, as well as make an easy system to share their playsets with each other.

undone walrus
#

Turns out visual polish is always the part of modding that's the most work, haha. Got the content packages to load into the game as clickable objects, and I'm recycling some Kino UI to show more detailed information. The images should be able to be set to existing jokers and tarots, but due to load order these ones don't grab one yet. I'm sure that's easy to solve once I figure out how, though, haha

undone walrus
#

Adapted the Actor UI from Kino, and have a nice content pack UI now, that'll show you what's included. Ideally I also wanna work on the collection page itself a bit, so you can at least filter in some simple ways, because with the full suite of test sets I've added, it does get crowded quite quickly

oak axle
#

This looks awesome! Is there support for showing a description text over on the left with the joker count?

undone walrus
#

I'm adding that for sure, yeah. Mostly just setting up the bare bones for a lot of UI, as I figure out the details

#

I'm for sure gonna bother you with some Galdur questions soon, btw, as I'm trying to set the page up for that, haha

undone walrus
undone walrus
#

Pushed a small hotfix for value manip that was causing some bugs!

undone walrus
#

@marsh dirge The code, if you're interested in checking it out, and especially in letting me know if there's a feature you'd like to have to make it work for your mods!

marsh dirge
#

wheeee! thanks ^u^ 🤍

undone walrus
#

This is literally just ripped from the Kino code, so there's a decent chance it won't launch properly! I'll get on that later, but this was really just so you could see the readme with what I'm hoping to set up for this mod, haha

marsh dirge
#

:3 gotcha

undone walrus
#

@astral linden You saying it should be easy was an eye opener, haha. Was tunnelvisioning on stuff that didn't matter at all. Making good progress now!

astral linden
undone walrus
#

I think I'll be able to get a version out tonight that's just a simple version that lets you make a playset in a text editor, and view and use it in game

#

Random Sleeve button will be replaced with the Playset selection buttons, and the reset button. The sleeve selected menu will show the playset, and whether it's modified.

I think once that's set up, it's the minimal viable product. Will have to see what the smartest way of making shareable in-game playset and content pack constructors

#

I do wanna figure out a way to sort the content packages, because the current method feels messy and overwhelming

astral linden
undone walrus
#

Oh, good one, yeah

astral linden
#

also sort the content pack?

undone walrus
#

Sort the display here so that it's all joker-related things next to another, or sorted by mod, etc.

astral linden
#

ahh

#

yeah i have no idea for that one 😭

undone walrus
#

playset preview now also works

undone walrus
#

It now displays which content packs are included in a playset automatically, as well, and lets you cycle through the playsets

astral linden
#

this is sick

undone walrus
#

I haven't added a lot of vanilla content packages or playsets, besides leaving in the test ones I made. I will probably add a few more over time, depending on what I think is a good inclusion

#

Next up are a way to make new Content Packages and Playsets from within the game itself, custom starting parameters and calculations for playsets, and then an easy way to share packages and playsets

astral linden
#

you should make a documentation

undone walrus
#

That's also planned

#

Would've done that today but I'm off to bed, haha

#

No wait, sorry, I think the proper way to respond to this is by very snarkily saying that my code is self-documenting?

undone walrus
undone walrus
#

@astral linden set up a quick sprite indicator for it

astral linden
fluid sparrow
#

once a pack is selected it seems to be impossible to deselect it?

#

like it just goes between ❌ and ✅

undone walrus
#

Oh, I think that's due to the playset interacting with it

#

Will fix that

undone walrus
#

Been looking into issues with Value Manipulation, and it seems like values don't reset if a joker only uses an extra table. Hopefully will have that solved today somewhere

undone walrus
#

https://github.com/icyethics/Blockbuster-ValueManipulation/tree/main

Value Manipulation should now properly reset on specific vanilla jokers. I've also added functionality for the Base layer, which includes only the nominal value of playing cards. With this, you'd now be able to val manip a king with x2, so it gives 20 chips.

GitHub

Adds a system for Value Manipulation compatibility to Balatro, intended to offer an opt-in method - icyethics/Blockbuster-ValueManipulation

#

I will still be adding:

  • Recalculating objects when their state changes, such as a change in centre, or an edition or enhancement is applied
  • Properly account for scaling numbers on playing cards, a la bonus chips and mult