I’m playing around with a few different prototypes at the moment to see how they feel, and one that I want to try is a storylet deck. A certain number of choices are dealt from the deck; the player chooses one of them; a storylet might alter qualities that unlock new storylets (adding them to the deck), or do the opposite (removing them from the deck).
What IF systems would be good for building a rapid prototype of something like this? I’ve seen Dendry games do this, but from the documentation, it looks pretty similar to Ink (i.e. by default it just presents a given list of choices from each scene and I’d need to implement the card deck myself).
Bonus points if it can actually look like cards being taken from a deck.
I assume you’ve looked at DendryNexus while you were checking out Dendry? I haven’t gotten around to looking at it so I’m not sure if it’s doing anything different, or if it’s mostly just story UI on top of Dendry…
I haven’t touched my QBN library for Twine/SugarCube in ages but it’s certainly built around a deck metaphor, and you can manually <<addcard title sticky>> or <<removecard title evenIfSticky=true>>. Twine is kind of a terrible UI for storylets but with Tweego and (say) VSCode it’s not so awful. Anyway. I don’t know how strongly I’d recommend it but it exists and basically works AFAIK.
I’ve seen DendryNexus, but it doesn’t seem to have a lot of documentation, and I don’t really understand the documentation that does exist. If it’s the right tool for this, though, I can try to experiment with it!
Hmm. It does look like it’s mostly just presentation and Fallen London style stat checks on top of Dendry. So probably not much better than vanilla Dendry for your purposes.
But I think you could use my TinyQBN, yeah. I’m just talking it down because I don’t know if you’ve done Twine much and I haven’t done any maintenance on it in a couple years (though it doesn’t depend on any SugarCube APIs that are likely to break). I seem to recall the documentation isn’t terrible but I definitely never went back and made it as good as I would like it to be. And it doesn’t do any of the card-deck presentation style for you.
The documentation is in French (I can translate if there’s interest).
The features are:
knots/stitch as a data structure: a knot with tag #storylet is a storylet and stitches define the storylet attributes
storylet attributes are: open (available or not), exclusivity (only storylets of the highest level are considered), urgency (if sorted, urgent storylets come first), frequency (if randomized, frequent storylets have more chances to be picked) and content (the content of the storylet, most often a choice)
attributes are evaluated as ink code so it can be a value {true} or a complex condition {inventory has (butter, sugar) && some_function()}
categories can be provided with the tag #storylet: cat_a, cat_b as a quick way to filter storylets
in your story, you can query storylets and you can either run them in a tunnel or a thread. You can specify several criteria (max, category, type of randomness)
if you have complex filtering needs, you can provide a custom ink function to filter:
// My storylets have a custom "magic" attribute (a stitch) and I want to select storylets which have a magic value between 3 and 8.
-> storylets_tunnel("filter=filter_magic_3_to_8") ->
== function filter_magic_3_to_8(storylet_name)
~ temp magic = storylets_get_prop(storylet_name, "magic", 0)
~ return 3 <= magic && magic <= 8
There’s no deck but if I understand what you want, it can be done with an ink list.
LIST MyStorylets = Storylet_A, Storylet_B, Storylet_C
LIST Deck = ()
~ Deck += Storylet_A
== storylet_a
#storylet
= open
{MyStorylets has Storylet_A}
= content
+ [Path A] You go left and now I add C to the deck
~ Deck += Storylet_C
…