I really wish for something like Inform 7’s adaptive text resources, which are fantastic and far ahead of what Twine offers (As they have to be, because otherwise writing adaptive text to handle anything but the simplest world model would be a pain). So I would like to be able to write something semantically equivalent to:
A woman walking a [one of]poodle[or]chihuahua[or]ferret[or]cat[or]exceedingly small horse[as decreasingly likely outcomes] bumps into you.
You rummage through the box, finding [expand]your aunt's scarf[and], some old mittens[and],a box of ancient Drambuie-filled chocolates[and], and the papers you were looking for[on clicking].
See, the problem isn’t really writing JavaScript code to generate adaptive text; frankly what I’d love is just something that would take a JS function and, every time the player performed some interaction (Such as clicking a link), it would then change some text to whatever that function returned. With closures, this could be used to create a functionally arbitrary text generator. I can already do that, except it would involve manually writing all the JQuery code to handle changing the contents of the page and so on, which makes it cumbersome. It’s the main reason I’m not using Snowman in the first place: It feels like a poor use of my time to reinvent the wheel so much.
The thing that made me feel Harlowe isn’t mature or extensible enough right now was a pretty simple thing: I had a passage in which the player character is in a place filled with curious objects, and as a small detail I wanted the player to be able to click a hyperlink to reveal more and more of the contents of the room. This is doable in Harlowe, but very uncomfortably:
<!--
Harlowe doesn't have an equivalent to the old "nobr". It has another way of stripping whitespace, {},
but that will only collapse whitespace into single spaces, meaning that '\n' becomes ' '. For reasons
that will become apparent, that means I can't put line breaks where they would be intuitive and
reasonable; I have to put it where a space would normally go, otherwise it'll insert an unwanted space.
-->
{
On the shelves, you see a number of |o1>[odd items](transition: "fade-in"[(click: ?o1)[: a |o2>[dog] in a
wire mesh box]](transition: "fade-in")[(click: ?o2)[, a |o3>[crow] in a
cage]](transition: "fade-in")[(click: ?o3)[, a rabbit's foot]].
}
<!-- In the actual version of this, there were something like 30 items. -->
Doing this isn’t hard, it’s just vaguely shudder-inducing and I know that when I come back to it in two months my eyes are going to glaze over. Moreover it was indicative that doing anything slightly playful or odd with hypertext was going to be like pulling teeth; and sort of the value of Twine is that it gives you the whole text as a canvas to play around with hypertext. If I wanted to write a very conventional gamebook, where the only links are always at the end of every passage, I would use inklewriter or choicescript. Because Sugarcube is extensible, I have access to the <> macro set that makes the above passage much more tolerable to write.
Still, I find that none of the systems for developing choice-based games hit a good place for me in terms of usability versus power. Twine with Sugarcube comes closest. Choicescript and inklewriter are very usable, but they’re also very much married to one particular format; this is fine, but it’s not useful to me if I’m not interested in working within that format for a given project. Harlowe, quite frankly, seems like a step backwards. I find Snowman interesting, but I also fear it would lead to messing around with $(), which feels like a poor use of my time. Undum isn’t so much a game engine as a game with a moderately documented source code and an invitation to hack it.