Introducing Elm Story - a new tool to visually compose and publish interactive storyworlds

The Elm Story schema defines storyworld content structure. When exporting, all storyworld content is included, creating a complete, human-readable and transportable snapshot that you can use with version control and 3rd party tools.

Since 0.1.3, Elm Story has supported automatic migration, updating your imported data to use the latest features. ES also validates your imports to our schema, so you don’t have to worry about IO degradation with imports/exports.

image


Providing a bit of a walkthrough to show how your content maps.

0.6 marks the first ES release to support binary assets. So, let’s say you are defining a character’s personality. For masks (portraits), you select an image and crop to our 5:4 default.

image

In the next screenshot, masks have been defined for NEUTRAL (default) and TENSE.

image

When exporting your storyworld, you will be prompted to select a folder. Elm Story then gathers everything up and saves to a nested folder, using convention {storyworld-title}_{version}_{timestamp}. In this case: darker-materials_0.0.1_1638575653638.

Elm Story will then open the folder to show you the result.

Same process for PWA export:

image

JSON export:

image

Contents of assets folder:

image

Binary assets are assigned a UUID, which I’ll cover toward the end of this post.

When importing, you would select either the storyworld folder or nested JSON file. Your content is then validated and copied and will hydrate the internal database. Assets are copied to Elm Story’s app folder.


To show how this maps, take a look at the following passage (changing to event in 0.6) from Amber Shores.

image

I export and open the JSON, searching for the lamp is on.

Passage (changing element type term to Event in 0.6)

"ca122de2-5736-43cc-86fd-5f23c575e8a1": {
  "choices": [
    "62895cad-0dca-417a-9487-ca786565d80d"
  ],
  "content": "[{\"type\":\"paragraph\",\"children\":[{\"text\":\"The lamp is on, dimly glowing with red haze.\"}]},{\"type\":\"paragraph\",\"children\":[{\"text\":\"Under the stained glass shade hangs a tattered, gold chain.\"}]}]",
  "editor": {
    "componentEditorPosX": 878.8715500354701,
    "componentEditorPosY": 469.6388451062143
  },
  "gameOver": false,
  "id": "ca122de2-5736-43cc-86fd-5f23c575e8a1",
  "sceneId": "fa2ecaf4-7746-4cdf-9bc8-0992738a7db3",
  "tags": [],
  "title": "Examining the lamp",
  "type": "CHOICE",
  "updated": 1635994554460
}

Please note the content property. As mentioned in a previous post, Elm Story has a deep writing tool that currently supports paragraphs, but will eventually support all kinds of markup and special object types like images, character references (@), headings, custom styles and more.

Now, if I want to find the scene (parent) and choice (child) defined in this passage, I can search the JSON by UUIDs.

Scene

"fa2ecaf4-7746-4cdf-9bc8-0992738a7db3": {
  "children": [
    [
      "PASSAGE",
      "646575da-18f4-434b-8270-cfa41a73e290"
    ],
    [
      "PASSAGE",
      "ca122de2-5736-43cc-86fd-5f23c575e8a1"
    ],
    [
      "PASSAGE",
      "28a637df-584f-4ff7-9969-5e633da5d6e8"
    ],
    [
      "PASSAGE",
      "09a1dab3-b83d-405e-9521-0f5336ce73b2"
    ],
    [
      "PASSAGE",
      "a623eae4-7624-40aa-879b-60b2bb731f5e"
    ],
    [
      "PASSAGE",
      "0ebfa65d-bfa6-45ed-abbe-55d457bc76bf"
    ],
    [
      "PASSAGE",
      "f38457e7-2800-46f9-9d65-b38130221563"
    ],
    [
      "PASSAGE",
      "d36396ed-7a5c-451a-b020-b11fdd2abba8"
    ],
    [
      "PASSAGE",
      "569d12c3-7050-49e0-891e-9fde24167822"
    ]
  ],
  "editor": {
    "componentEditorTransformX": -1748.52667890061,
    "componentEditorTransformY": -429.204747466243,
    "componentEditorTransformZoom": 1.3195079107728946
  },
  "id": "fa2ecaf4-7746-4cdf-9bc8-0992738a7db3",
  "jumps": [
    "109af87a-6617-4fa5-bb7f-cddd36b6fabe"
  ],
  "parent": [
    "FOLDER",
    "58ee805c-2f58-4614-bfbc-c7d123272517"
  ],
  "tags": [],
  "title": "The Room",
  "updated": 1636067636434
}

Choice

"62895cad-0dca-417a-9487-ca786565d80d": {
  "id": "62895cad-0dca-417a-9487-ca786565d80d",
  "passageId": "ca122de2-5736-43cc-86fd-5f23c575e8a1",
  "tags": [],
  "title": "Pull chain",
  "updated": 1632154503352
}

Anything related to Elm Story tool configuration, in the context of your storyworlds, is nested to an editor object. This is used to track things like where a node is positioned or a scene’s zoom level.

This structure makes it easy to filter ES-specific configuration properties when parsing your storyworld’s content (3rd party tool), but also persist this configuration for when you would like to import and keep your e.g. node positions intact.

In 0.6, the editor is renamed to composer, so the editor object is renamed composer. componentEditor* properties (in the context of scene and event) are renamed sceneMap*, so componentEditorTransformZoom is now sceneMapTransformZoom.


Back to characters and binary assets!

I’ve exported a demo game, Darker Materials, as JSON.

Character

"characters": {
  "48ed0760-72df-4490-8faa-8f9e4e6373f4": {
    "id": "48ed0760-72df-4490-8faa-8f9e4e6373f4",
    "masks": [
      {
        "type": "NEUTRAL",
        "active": true,
        "assetId": "cf66f8ea-5643-4362-a334-8cc10ddbdaba"
      },
      {
        "type": "TENSE",
        "active": true,
        "assetId": "c3827dbd-95a8-42e0-ab11-7d8f6f14944d"
      }
    ],
    "refs": [
      [
        "d2029cac-6b85-4014-89cb-2245bc21bdf3",
        "HE"
      ],
      [
        "386a4f1f-e421-4f87-a748-2773ef6d7580",
        "HIM"
      ],
      [
        "47cbea81-6bf9-4bf4-bc48-d60581896763",
        "IOREK"
      ],
      [
        "1b626d0f-4520-4236-8b05-7acc0b9ed76d",
        "KING"
      ]
    ],
    "tags": [],
    "title": "Iorek Byrnison",
    "updated": 1638588863786
  }
}

If I wanted to find the asset for the TENSE mask, I would look under the exported (as JSON) storyworld > assets and search c3827dbd-95a8-42e0-ab11-7d8f6f14944d

image

I hope this helps! :grin:

2 Likes

I was actually quite impressed how Es formatted that long choice in the game, though if you had a lot of them in the scene from a passage it would create an enormous box. Very minor look and feel thing if the passage display (in the scene/flowchart, not the game) maybe limited the shown choice text to one line, or folded them up unless hovered over or expanded on a click to edit. But most may not write verbose choices like I do.

I really liked how easy it was to hook routes up and create a random choice of passages; never have I seen a system that allowed multiple routes into and out of the same passage node and had it work as expected. This let me reflexively create one choice that randomly provided routes to one of three passages, and then another choice led to just the third one that could have been selected randomly by the previous choice.

In the video it showed for a hub loop one could just route from the end back to the opening choice as one would expect, or a jump passage to be used to neatly go back so the flow didn’t cause a confusing web of routes onscreen.

I did encounter the same crash bug that happened in the video when I was playing around with variables and conditions and hot-reloading/resetting the game. The screen currently goes blank, but the method in the video was to hit Option-R or CTRL-R to reset Elm Story, and no progress was lost as the studio and game remembers all data and reloaded properly.

One minor suggestion to perhaps avoid hot-reloading issues and ensure creators hit reset: The reset button ensures the running game in the IDE is up to date, and the engine randomization sometimes doesn’t operate properly when conditions are changed until reset is pressed. Perhaps some visual feedback for the author might suffice, such as highlighting, boxing, or bullet-ing the reset button when changes have been made to the flow to remind them. Sort of how text-editors have tabs with changed content highlight to remind the writer to save them.

1 Like

You are right on this point. In the Scene Map we could not only show event (passage) content excerpt, but also do the same with the long choices (although not recommended by design).

Thank you so much! It was one of the things that made me suffer the most when using other platforms. Here too, the aim is to give designers the best possible user experience, removing everything superfluous to focus on interactive worldbuilding :slight_smile:

Nice feedback. Certainly, we could think about giving an option for the designer to auto reload or manual reload. Many platforms have exclusively adopted auto reloading: testing the narrative is a real mess. I would only use hot reloading from my point of view :joy:

1 Like

I remind you that you can join us on our Discord community to report feedback and discuss Elm Story :slight_smile:

1 Like

Hi folks Elm Story 0.6.0 is here!
Introducing character management, expanded logic features and term updates.

In the devlog you can see in detail all the changes. In the meantime, we’ll get to work immediately to complete de 0.7 release, to fix the documentation and to organize a livestream to walkthrough the new update, probably on Friday.

Feel free to join our community, if you have not already done so, and give us feedback :sunglasses:

3 Likes

Playing with 0.6 and I have a suggestion:

If an event has not been named by the author yet (titled “Untitled Event” on the right) could the map of events display the first line of code/prose instead of “Untitled Event”?

That would make it easier when laying out a structure to tell where everything is going until we get around to naming the event formally. I actually like that we don’t have to name events since they have a UID, but for the map it would help if we could distinguish them. Especially as I’m likely to write a few words in the passage on creation instead of doing that and naming the event on the right.

Another method would be if new events would take a random different default title like variables so they can be distinguished before naming.

This might actually be resolved if clicking on the event title in the map would let you name it right there - I believe that was also discussed in one of the presentation videos.

I am enjoying experimenting with Es!

1 Like

The other thing I noticed - I tried to create a character/persona in 0.6 and couldn’t find a way to upload an image. Is that functionality just not in the release yet? (Running MacOS).

And I really appreciate the smaller persona images, and being able to see a few lines of the event content in the map, that is really helpful!

1 Like

Hi Hanon, thank you!

To upload a character image, you have to go to the personality tab, right click on a mask and select change

2 Likes

Hi everyone! I wanted to take this opportunity to tell you that the development of Elm Story is advancing well also thanks to your feedback. We are planning to release the 0.7 update at the end of next week. It will include multimedia/text styling support and overall experience enhancement

I also wanted share with you my revisited Interactive Fiction The Masque of The Red Death, based on Poe’s homonymous work.
I have recreated the storyworld within Elm Story and will update it with each release so that it becomes an evolving artefact showing the latest features of the tool.

Link: The Masque of the Red Death

5 Likes

Hi all - Given the complexity of new features coming to the event content editor and a new asset manager that wasn’t originally scoped, the 0.7 multimedia update is taking longer than expected.

New estimate is Jan 31st. Apologies for the delay… :persevere:

In the meantime, we leave you with a preview of the new Scene Map, which shows how secondary characters mentioned in an event are displayed :star_struck:

ezgif.com-gif-maker (1)

You can always join us on our Discord community to report feedback and discuss Elm Story

The 0.7 multimedia release is huge and needs more time to bake.
Thank you for your patience as we polish everything up. In the meantime, here’s an updated peak at the composer with full content previews!

Join us on Discord: http://discord.gg/v897evyc4Q

2 Likes

Adventures in Elm Story:

3 Likes

OOOH, that sounds great. Keep up the good work, we can’t wait to see what the finished result looks like.

1 Like

One neat thing about Elm Story is whimsical dummy template content such as storylet and variable names which can be left as-is to differentiate, or selectively renamed for organization. It’s easy to map out the structure of a scene visually and then write the prose in later.

I also enjoy that creating a node and a choice with multiple paths out will select one of them randomly, or the paths can be weighted with variables. Also any node with no path or choice out or marked as a game-end will automatically include a link back to an individual scene’s opening node. If you conceive your choice-narrative as hub and spoke, this all makes sense and is well-appreciated!

Gutted to see this cancelled. May I ask why you had to do that? It looked full of promise.

1 Like

A shame indeed. This looked very much a free (or cheaper) version of arcweave. I think all it needed was a half-decent scripting system added.

1 Like

I’m sad about Elm Story’s cancellation also. It’s technically “open source” now but I get the feeling from the final blog post that there was some friction happening and it may not go anywhere else.

I tried to use Es in it’s current state and it works but the IDE was a bit crashy on OSX at least (you had to know the secret “ctrl-R to restart” command and it usually had all your work but you’d have to restart often while working.)

I also noticed if you had a really busy scene with lots happening stuff started to lag and not draw in the IDE. Once you got to compile, the resulting file worked just fine though. I found myself just granularly breaking scenes into smaller individual “processes” instead of an entire narrative segment or a room in one scene the way authors might normally split up their narrative when given something called “scenes”.

What I liked:

  • Amazing interface for creating a story (like ArcWeave as mentioned).
  • Very optimized for mobile play.
  • Pretty incredible “character” interface where you could implement multiple portraits with mood-changes you could display next to specified passages such as for dialogue. It appeared they also were going to have a way to automate “mood swings” and display mood-versions of character portraits on the fly based on traits.
  • Dead-end passages would by default link back to the first passage in a scene, great for constructing “examine” messages or grinding hubs.
  • A choice in one passage could split to multiple passages, and the game would select one randomly, or the author could “weight” passages with conditions, so it’d choose between specific passages that required a variable first, or unweighted default passage(s) if the player didn’t qualify.
  • Mostly-well implemented multimedia audio and graphics (though they also needed some tweaking) - you could have BGM and per-passage sounds that played simultaneously, and Es would “duck” the music volume if a sound played temporarily.

What I didn’t like:

  • No easy way to do text randomization/variation, which is really helpful for a QBN where you hit lots of repeated passages and hubs over and over and might want to vary text based on how close the player is to finishing a “Grandfather Clock” grind or similar. I experimented with the structural “this passage can lead to any of these three passages” but doing that caused very busy and cluttered scenes that led to IDE slowdown and crashing.
  • No way to generate a random number, or roll a die, so no “chance to succeed” type of choices.
  • Variables had to be hard-generated and assigned a type for use - not a bad thing for consistency but sort of throws a wet blanket on the capricious fun of atmosphere messages or having the game remember on-the-fly detail about what a player has chosen and done. You had to plan in advance how many variables you need and exactly what they do - I know some systems are like this, but I love setting lots of flags based on character choices, or “did the player already read this long description? If so, I’ll provide a summary next…” types of situations.
  • No way to control audio volume, or have BGM continue between two scenes - if two scenes had the same music and you switched from one to the other, the track would start over since entering a new scene always cued it’s music track. No way to change atmosphere audio or BGM within a scene. You could have background music play and then have a “forest birds” sound effect set to play in a passage, but it would stop upon exiting the passage. (Untested, but I found myself “uploading” the same sounds and tracks to re-use them, and I believe it was storing multiple copies of the same track instead of having an audio library it could pull from since I noticed the file size getting way huge for the tiny test games I did, and I believe it’s because I had a full MP3 track uploaded multiple times for scenes with the same music.)
7 Likes

If you don’t mind me asking, where did you get the open source version from? I’d love to know where to download it

1 Like

I believe there are issues behind the scenes. It appears the itch page has been removed…and I’ve been dealing with messages here that have been taken down and removed. Which is a little annoying. I even donated a bit to them. So perhaps it’s no longer an open source project.

2 Likes