I have changed my mind and decided to continue working on improving the Storytron software. However, the direction I am going to go in has changed.
Storytron was originally supposed to be a platform and business for interactive storytelling. It was an exciting, quixotic venture that failed. My open source efforts over the past year were in service of that original goal. Now Storytron has a new mission — to become a game-agnostic tool for experimenting with procedural narrative design for dramatic storytelling.
There are many games, too many to mention here, that use procedural generation in their creation, and this has given rise to numerous approaches, techniques, and frameworks. Online groups, conferences, and events like ProcJam, NaNoGenMo, Narrascope, IntFiction, and others provide numerous opportunities for conversation and cross-pollination. There is also a rich history of procedural story generation going back to the 1970’s with programs like Meehan’s Tale-Spin, Turner’s Minstral, and Leibowitz’s Universe (I plan on exploring some of these early programs in future posts to see what can be learned).
With this new direction I will temporarily “forget” about the interactive side of Storytron and focusing on its story-creating capabilities. The software already has many of the building blocks necessary to calculate dramatic situations as well as a scripting language and utilities to tweak and refine the final product. I imagine reading the final result will be a cross between watching a short play and reading a short story or poem.
Here are two examples of procedurally generated stories. The first is from Micro-Talespin, a recreation of Meehan’s original program (the Micro-Talespin source code can be found here).
JOE WAS NEAR THE CAVE. JOE KNEW THAT JOE WAS NEAR THE CAVE. IRVING WAS NEAR THE OAK-TREE. IRVING KNEW THAT IRVING WAS NEAR THE OAK-TREE. JOE KNEW THAT IRVING WAS NEAR THE OAK-TREE. THE WATER WAS NEAR THE RIVER. JOE KNEW THAT THE WATER WAS NEAR THE RIVER. THE HONEY WAS NEAR THE ELM-TREE. IRVING KNEW THAT THE HONEY WAS NEAR THE ELM-TREE. THE WORM WAS NEAR THE GROUND. JOE KNEW THAT THE WORM WAS NEAR THE GROUND. IRVING KNEW THAT JOE WAS NEAR THE CAVE. THE FISH WAS NEAR THE RIVER. IRVING KNEW THAT THE FISH WAS NEAR THE RIVER. One day, JOE WAS THIRSTY . JOE WANTED NOT TO BE THIRSTY . JOE WANTED TO BE NEAR THE WATER. JOE WENT TO THE RIVER. JOE WAS NEAR THE RIVER. JOE DRANK THE WATER. JOE WAS NOT THIRSTY . The end.
And here is the output from my 2010 attempt to re-imagine the game “Trust & Betrayal: The Legacy of Siboot” using Storytron.
Felsym is dead! The fourth Shepherd of Kira has died and one of his seven acolytes must take his place as the spiritual leader of Laminian civilization. Vetvel what are you going to do? you depart for Kendra’s House from Temple of Siboot you arrive at Kendra’s House from Temple of Siboot you wait Kendra greets you formally Kendra rejects Vetvel Kendra doesn’t believe that Vetvel’s trust towards her is almost non-existent Kendra says her trust towards Vetvel is almost non-existent Skordokott greets you warmly Skordokott is skeptical Vetvel Skordokott believes that Vetvel’s trust towards him is moderate Skordokott says his trust towards Vetvel is moderate you depart for Wiki’s House from Kendra’s House you arrive at Wiki’s House from Kendra’s House you wait
This log from the second example shows the detailed calculations that are saved for each event in the story, events that can be manipulated by the scripting language.
I admit that neither of these examples is great literature or particularly entertaining. Both are light years away from anything written by Shakespeare, Marlowe, Mamet, or Stoppard. But they are a start. Once a dramatic non-interactive story can be created using Storytron, adding in the player interaction should be as easy as flipping a PC/NPC switch on a specific actor (though I bet that is probably easier written then done).
I realize that my approach will be considered heresy by some since interactivity is considered to be the computer’s competitive advantage. Process, they will say, should take precedence over data. Any attempt to marginalize interactivity, they will say, reduces the chances of “true” interactive storytelling.
Crawford’s “un-quitting” has made me question my current plans to support and enhance the Storytron code.
While we currently have permission to host the Storytron source code I now realize that this permission could be revoked at any time. There are probably some unresolved copyright issues around the entire code base that I did not think of last year or feel that I had to worry about until now.
Because of these ambiguities I am suspending all of my current Storytron 1.0 work except where noted below.
An initial Gossip storyworld has been uploaded to its own repository and I have started work on a tutorial wiki that explains the internal workings of this storyworld. I am going to continue working on this tutorial until I feel it adequately illustrates how its companion storyworld is constructed and operates. I make no promises but I will do my best.
The pages from the original Storytron Author’s Guide have been moved to the SWAT wiki. The original Storytron Tutorial can be found here. Both of the original sites are mirrored at this wiki.
One new repository, Siboot, has been uploaded. This was the second attempt to re-imagine the game Trust & Betrayal: The Legacy of Siboot using Storytron technology (the first attempt can be found here).
All existing repositories will remain online for future spelunking and forking.
The Storytron Google Group will remain online as a historical archive though I plan on disabling the ability of existing members to post on July 1st. I suggest that people still interested in interactive storytelling check out the Interactive Fiction Community Forum.
This Storytron publication on Medium will remain online as well.
I have paused the July billing cycle so existing patrons should not get charged for the month of July. I plan on messaging existing patrons individually to thank them for their support and tell them to withdraw their current pledges.
Our Patreon online balance currently stands at $263.35. I plan on using this money to renew our existing URLs and mailboxes for an extended period of time. I will donate whatever remains after that to the Interactive Fiction Technology Foundation.
First, I would like to thank all of you for your support, advice, and suggestions over the past year.
I do not know what I will work on next related to interactive storytelling. I might revisit my original StoryCalc idea. My NarraScope adventure two weeks ago renewed my interest in Inform 7 and its open sourcing excites me. I am also part of Spirit AI’s Character Engine beta and I am very interested in figuring out how it works.
Chris Crawford emailed me and two other people a proposal he has been working on regarding the next generation of software for interactive storytelling, asking for feedback. It sounds pretty similar to Storytron.
I have no faith in the waterfall, top-down approach that you are proposing, especially with you in charge. Your attitude of “I will write,” “I shall require,” and “I will not authorize” is the antithesis of open source (but it does not surprise me). You might attract a younger following based on past history and charisma, but setting yourself up as arbiter of what is right and what is wrong will drive away more people than you realize.
The six components you outline already exist in the open sourced Storytron software, however crude or complex their current implementation might be. Your efforts would be better spent helping us make this existing software better rather than fragmenting our efforts pursuing some boondoggle. If you can’t code anymore you could help with the wikis. Or you could submit some redesigns for the existing editors or designs for new editors to the Google Group. But any work would be as an individual contributor because, when it comes to the open sourced Storytron, you are not in charge.
Best of luck. I am going to focus my efforts on making Storytron.org better.
This is not a complete list by any means, just a few that immediately sprung to mind. The first three are parser-based, the next four are hyperlink/choice-based, and the last two are ones that recently caught my fancy (I’m extremely interested in Spirit AI’s Character Engine based on the people involved though I have no idea how to use it right now).
But the big question of course is why attempt this? I can only come up with two questions that could be answered by this attempt at replication.
What makes Storytron unique?
What can Storytron learn from other tools?
For twenty-six years Chris Crawford tried to launch an interactive storytelling revolution and failed. What he came up with several unique but complex pieces of software (SWAT, Encounter Editor, Face Editor), several unfinished storyworlds (Balance of Power 2K, Prom Night, Le Morte D’Arthur), and a ton of now out-of-date documentation.
The world didn’t stand still and wait for Chris. New tools were created and existing tools got better based on user feedback.. SWAT, the Encounter Editors, and Face Editor languished, demanding a high learning curve similar to GIMP, Blender, or Photoshop, while providing minimal “bang for the buck.” Chris himself was also noticeably intolerant of other tools and approaches and frequently took a “I know best approach” to the rest of the industry even in the face of unimpeachable evidence that his approach was failing. All of this resulted in some powerful tools that had a zero adoption rate within the IF/IS population at large.
But I still think that Storytron has some unique concepts that other tools haven’t implemented (I realized this after a conversation with Chris Conley this past weekend at NarraScope). But if other tools can implement Storytron’s unique concepts then why continue working on Storytron at all? Why not build off of those tools which have more robust infrastructures and larger user bases?
If there are parts of Storytron that are unique and it still has a place in the IF/IS world, the question becomes “What can we learn from other tools?” Is there anything that another tool has done to make an user’s life easier that we can borrow for Storytron?
I don’t think we have a monopoly on all the good ideas.
“Having to abandon work on Siboot was one of the most painful decisions of my life. I had realized that I had lost the cognitive abilities necessary to continue work (that is, the ability to keep many different variables in my mind at once) as early as 2015. But I struggled on for another year, then tried several alternatives in an effort to salvage the project, before finally giving up a year ago. Even then, I returned to the project every few months, trying to see if I couldn’t get the old brain cranked up to the high pitch it needs to function on this project. Every time, I failed. So here I am again, wondering if there isn’t SOME way to get this thing working.”
I thought something similar back in 2017 but my short answer to his current question is “No, not with the current technology.” Right now SWAT can’t even reproduce the seamless experience of 1987 Siboot. Only with integrated encounter and face editors could an reboot succeed.
I think the idea of finishing Siboot at this time is wishful thinking on Chris’ part, a balm to his ego. It certainly could be attempted. Chris could issue another rallying cry, recruit some acolytes, and then attempt to lead them towards a release of something (I myself signed up for his previous quest in 2014) .
But my opinion is that this new team wouldn’t get any closer to a release than the original Siboot team did. But let’s be a pollyanna—what if this quixotic venture did get to version 1.0? What then? I think Chris’ own words are prophetic.
Suppose that I could indeed finish Siboot to my own satisfaction. What would happen?
First, few people would appreciate it. They would judge it by the only standards with which they are familiar: the standards of current game design. They would conclude that Siboot is a lousy game — and they would be right.
Siboot was never intended to be a game; it’s interactive storytelling. The emphasis is on character interaction, and it already offers interesting dramatic character interaction. But people aren’t looking for interesting dramatic character interaction; they’re looking for the things that make great games: challenge, a smooth learning curve, impressive graphics, catchy little tunes to accompany their play. Above all, a game must be winnable. Yet stories aren’t necessarily about winning and losing; they’re about drama.
No matter how good Siboot turned out to be, it would not create the splash I had hoped for. It would not go viral and trigger lots of tweets and viral videos on YouTube. It would certainly attract a small comradeship of people who recognize its importance. Everybody else would be unimpressed.
Yikes, this doesn’t bode well for Storytron! But putting on some rose-colored glasses let’s press on along this optimistic trail that we’ve started down.
The only hope for Storytron (and a future Siboot) is the integration of encounter and face editors into the SWAT application. Chris has tons of knowledge about interactive storytelling and extensive experience with the Storytron source code. He should learn how to use GitHub, roll up his sleeves, and contribute to the Storytron.org project in some significant way. If he doesn’t feel up to coding he could help out with the Gossip tutorial or work on one of the wikis.
While I would welcome Chris’ contributions I wonder how this would work out when he is not the sole person in charge. Having been a lone wolf for so many years and used to being in control I wonder if he could “demote” himself and function as just an individual contributor on an open-source project. What would happen when he was asked to make a change to one of his pull requests or, heaven forbid, had one of his pull requests rejected.
When adjusting accordance traits for Gossip actors I noticed something interesting happening in the Actor editor.
As you switch between actors the values you set for their core personality traits is updated in the editor but the values for the corresponding accordance traits is not updated if the core trait’s Make Visible checkbox is checked, i.e. set to True.
This is by design since the showActor() code in ActorEditor.java sets the slider value only if Make Visible is unchecked.
The fourth line is where the trait slider’s accordance and weight values are updated if Make Visible is unchecked (the test for this is on the third line of code).
The help text associated with Make Visible says “If this is checked, then actors will perceive this trait in other actors every time they meet.” The More Special Operators page in the original SWAT tutorial talks about the Make Visible checkbox a bit more.
“Unclick the check box to the right of the trait. This means the trait is not readily detectable when two Actors meet (an example of a visible/detectable trait would be Short_Tall. An example of an invisible or non-detectable trait would be Cowardly_Courageous).”
So as I understand it you would uncheck the Make Visible checkbox for a trait like False_Honest, a trait that is not immediately apparent when one actor meets another actor, so the actors would have to use their perceived and confidence values of False_Honest that the hold for the other actor to determine how False_Honest one thinks the other is. For a visible trait like height or weight, a trait that can be visibly assessed, Make Visible should be checked (I am assuming that somewhere in the Storytron engine there is some code that uses Make Visible’s value in some way).
I can understand the logic behind that for “physical” traits. What I don’t understand is why the Make Visible flag is tied to the update of specific actor’s accordance and weight trait values in the Actor editor.
For False_Honest, the accordFalse_Honest and weightFalse_Honest traits are tied to a specific actor and are internal to that actor. Updating or not updating these traits in the editor based on the primary trait’s Make Visible value, especially while you are trying to set them for that particular actor, seems to be a design flaw.
For now I am going to uncheck Make Visible for any “mental” traits so I can see the changes in accordance and weight from actor to actor but it might make a code change to always update accordance and weight in the future.
Update: Chris Conley posted that the reason accordance and weight traits are tied to Make Visible is probably because of the physicality of the trait, no actor would have a different perception of another actor’s height or weight. It’s a good explanation. I don’t know why I didn’t think of it (probably just didn’t think it through to its final connection).
Teen Talk has three traits that model an actor’s personality.
Gullible – How likely an actor will believe or disbelieve what another actor says
Dishonest – How likely an actor will lie or tell the truth to another actor
Vain – How likely an actor will believe what another actor tells them about themselves
The Storytron personality model has three default traits.
Bad_Good – How pleasant or helpful an actor is
False_Honest – The integrity and truthfulness of an actor
Timid_Dominant – The charisma and force of personality of an actor
All traits, whether Teen Talk or Gossip, are relative to other actors.
Teen Talk’s Dishonest can be mapped directly to Storytron’s False_Honest. One down. I could add a Storytron Cynical_Gullible trait to map Teen Talk’s Gullible. There might be another way.
For each Storytron trait, which tells you what an actor is really like, there is an a corresponding accordance trait, which indicates how readily an actor accords or grants high values of an trait to others. For example, False_Honest has an accordance trait of accordFalse_Honest. If Vetvel has a high accord_False_Honest then he readily assumes that other actors have high values of False_Honest. In other words, he is gullible. So I can use Storytron’s accordFalse_Honest to indicate how Teen Talk Gullible an actor is.
I am going to add a new trait, Vain_Humble, to map Teen Talk’s Vain since none of the default Storytron traits or their accordance traits can handle that.
So the initial mapping to Teen Talk traits to Gossip traits looks like this.
While I don’t intend to use Bad_Good or Timid_Dominant in the initial version of the Gossip storyworld I will keep them in the personality model for possible future use.
The initial values for each Teen Talk character’s Gullible, Dishonest, and Vain are as follows.
Reviewing the Teen Talk code does not give any indication of the lower and upper limits of traits so I am going to make an assumption that that their lower and upper limits are 0.0 and 1.0 respectively.
Since the code is no help I took a look at the descriptions associated with each character and pulled out these phrases.
“honest to a fault” “not at all gullible”
“believes anything people tell him” “lonely and wants to make friends” “reasonably honest”
“spent years lying about her past to fit in”
“she found out he was lying to her [for two years]” “is a suspicious fellow”
“always changing her outfit because of something she read” “parents right, ton of clothes” “other than those things, pretty normal”
So I believe my assumption that Teen Talk traits can have values from 0.0 to 1.0 is correct. I am going to make another assumption and say that the closer you are to 1.0, the more of that trait you are.
“honest to a fault” (Dishonest 0.8) “not at all gullible” (Gullible 0.2)
“believes anything people tell him” (Gullible 0.8) is “lonely and wants to make friends” (Vain 0.7) is “reasonably honest” (Dishonest 0.0)
“spent years lying about her past to fit in (Dishonest 0.7)
“she found out he was lying to her” (Dishonest 0.8) “is a suspicious fellow” (Gullible 0.0)
“always changing her outfit because of something she read” (Vain 0.8, Gullible 0.7)
Notice the one outlier? How can Owen be “honest to a fault” with a Dishonest of 0.8? I was unable to find the original Java code that Chris Crawford sent me so I don’t know if the the mistake was in his code or mine. I am going to assume it was a mistake on my part and modify Owen’s Dishonest to reflect the description of him, changing it from 0.8 to 0.0.
So here is the final table to Teen Talk personality values. I am not including Bara in this table because she is the protagonist; you play her in the game so she is whatever you are (I don’t know why her Gullible is 0.5, probably another mistake on my part).
Translating the original trait numbers into BNumber values gives me some initial traits values for the Gossip storyworld.
These will serve as a starting point that can be modified as needed.