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.


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.

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

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

Thank you so much for your feedback, Hanon! Linking issues for tracking.

Text variation / randomization? This system totally lends to hub and spoke structure and if the player revisits a passage it would rawk to be able to mix up the prose on repeat.

https://gitlab.com/elmstorygames/feedback/-/issues/60

Inline prose links to other passages / popup windows ? I understand Elm Story is mobile-forward and the texting paradigm works well, but sometimes it’s nice to focus on a word or phrase of the prose rather than always selecting just from a list of authored boxed choices. Even if that box didn’t allow further links. (I love these in AXMA, and even Infocom had popup quotation boxes. So you can center something, or display an inventory image…)

https://gitlab.com/elmstorygames/feedback/-/issues/47

Text Formatting? At least basic italics, bold, underline. Dare I ask for headings for chapters or titles?

https://gitlab.com/elmstorygames/feedback/-/issues/61

Inline images are in the multimedia update coming in January! :grin:

I really like that a passage with no choice-link out just automatically gets a return link, that’s real handy.

Thank you! We call this loopback. It was a huge pain to implement, but the foundational concept extends the Storyteller’s spatial/temporal intelligence quite a bit.

Passages (events) without choices are called passthrough.

I also really like that you can route a choice to multiple passages, and barring conditions the engine will choose one randomly. Using the conditions, you can weight that choice like a QBN…

During initial design, we were heavily influenced by @emshort’s content on QBNs.

It’s also possible to connect different storyworlds, further expanding QBN and procedural potential, but we’re not yet ready to talk about this. :wink:

I would also really like an option to choose whether the text starts at the bottom of the screen as it does or from the top, but that may not be viable with how the engine generates text.

https://gitlab.com/elmstorygames/feedback/-/issues/6

https://gitlab.com/elmstorygames/feedback/-/issues/59

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

Found a pretty big Storyteller regression (ES 0.5.1) while implementing the wolf, goat and cabbage problem.

Context: https://www.reddit.com/r/ElmStoryGames/comments/r93mev/game_logic_questions/

The issue appears to affect paths (routes in 0.5.1) when multiple conditions are applied. They aren’t working properly and you will likely get strange results, similar to random processing. :frowning:

We’d typically issue a patch (i.e. 0.5.2), but with 0.6 coming this Friday, we’ll include a fix in the upcoming release.

We’ll also add this demo to our test suite. :raised_hands:

I’ve attached the export, if you’d like to check it out: the-wolf-goat-and-cabbage.zip (4.8 KB)

4 Likes

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

1 Like

@ritsuke: The issue appears to affect paths (routes in 0.5.1) when multiple conditions are applied. They aren’t working properly and you will likely get strange results, similar to random processing.

This issue has been addressed in the 0.6 release slated for later today/weekend.

With the current release (0.5.1), all path conditions must be met for the path to open. This serves as an AND gate.

0.6 introduces OR; a logic feature necessary to implement something like the wolf, goat and cabbage problem.

When selecting a path, it is possible in 0.6 to switch between matching ALL or ANY conditions defined in the path.

As part of the 0.6 release notes, we’ll include the updated storyworld export of the wolf, goat and cabbage demo.

4 Likes

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

Capture of the drag out node creation enhancement coming to 0.7 (multimedia update) in early January.

drag-out-mode

4 Likes

We’re making good progress on the new event content editor. This is just a current feature demo and not the final design.

event-content-editor-second-demo

In addition to text formatting, we’re also adding inline character references, images and video.

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

We’ve recently implemented this enhancement in 0.7, though it still needs fine tuning. Thoughts welcome!

More details: Scene Map: show event content excerpt inline event node (#2) · Issues · Elm Story Games / feedback · GitLab

This is also in for 0.7, but a random name would be helpful and better aligns with newly created variable (as you mentioned) and character elements.

choice-event-node-demo

That’s great to hear. Thank you so much for your feedback.

Please keep it coming!. :smiley:

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

We recently released v0.7, featuring a new content editor and multimedia support.

Thank you @HanonO and @Sam_Ursu for your thoughtful feedback; a number of your suggestions have been implemented, including drag-out nodes and content preview.

Short video demo of highlighted features:

4 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