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

Though there aren’t any 3rd party tools that (we know of) support Elm Story data (e.g. Unity), our data schema is completely open to enable this.

[…] versioning and (it appears?) a way for an install to ping for game updates […]

Yes! Relinking for context: https://elmstorygames.itch.io/elm-story/devlog/311136/elm-story-051-seamless-game-updates-in-the-browser

image

When a player first visits your self-hosted game, ESRE installs and registers a service worker with the player’s browser. The worker is responsible for installing (pre-caching) and detecting revisions to your game’s data and assets.

Each time an online player returns to your game, the worker will inform ESRE of any changes to the engine and ESRE will prompt the player to update. During gameplay, in the background, the worker will periodically check for revisions every hour.

If the player’s device is offline, your game will continue to work.

https://docs.elmstory.com/guides/data/pwa/overview/#game-updates

2 Likes

Sorry if I got the unity stuff wrong, I thought I saw the logo on one of the slides, my bad!

1 Like

OK, well let’s celebrate that when it arrives.

There’s a reason why an author-side text representation is an important feature.
It is to protect the author against losing his work.

Data migration presents real challenges. A service provider has to do data migration if they volunteer to be the guardian of creative work which was written in version 4.5 when they are promising new features (hence a new schema) in 4.6.

An author-side text representation of the work is an insurance policy against the service provider failing to resolve any issue which locks the writer out of their new updates.

I’m learning about this system in development by watching the videos, and I’m not a programmer, but as I understand you can export and import a json project that is human-readable? Is that something that produces text code that can be archived and catalogued?

1 Like

Hey, Hanon, I was exploring just as you were :slightly_smiling_face:
The JSON schema I saw looked to me like configuration for the GUI editor rather than an archive of the work itself.

If I’m wrong now, I’ll stay as wrong until you point it out to me otherwise, so please let me know what you find!

1 Like

Questions about potential later features:

  • 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.
  • 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…)
  • Text Formatting? At least basic italics, bold, underline. Dare I ask for headings for chapters or titles?

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

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…

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.

2 Likes

1 Like

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