“We are not enemies, but friends. We must not be enemies. Though passion may have strained it must not break our bonds of affection.” – Abraham Lincoln (link)
Other Interesting Things
A twenty-two minute recut of Star Trek: The Motion Picture set to Daft Punk’s modern original score fro Tron: Legacy.
We should never forget that the 9/11 terrorists attacked Americans. Not specific Americans but all Americans, whatever their race, creed, or color. They wanted to destroy our way of life and our political system. They wanted to make us afraid of the things that we should not fear, the things that have made America great—diversity, inclusiveness, and tolerance.
We should not help them complete what they started. We should protect ourselves without destroying our country from within. We should stop dividing ourselves based on the differences that have always been our greatest strength.
Here is a quick JavaFX application that I threw together showing how SWAT-FX would look (nothing is functional, the verb outline is hard coded).
And here is the same screen in SWAT 1.3, written using the Swing, JavaFX’s predecessor.
I still haven’t tried to bring over any of the SWAT 1.3 Java code but I am optimistic that my migration approach is going to work. At the very least it will look better.
Now that I’ve decided to turn Storytron into a tool for story generation, what are the next steps? What’s the next best thing to do?
There are a lot of ideas floating around in my head. Here are a few that I wrote down the other day.
- Code documentation
- Code cleanup/refactoring
- Goals, plans, and scripts – what are they, relevance, how to implement?
- Temporarily removing the “interactivity” from Storytron storytelling
- Total actor agency – what is the best way to accomplish it
- Older story generator code and current procedural generation frameworks
Obviously items #1 and #2 apply to the current SWAT 1.x code, the only code currently out there that runs (let’s forget about the encounter and face editors for right now). Learning how this code works, how it’s put together, and cleaning up some of the messier sections (okay, all of it) has always been at to do item on my list. I’ve also toyed with the idea of refactoring JavaFX into the existing Swing/Java code base to spiff up the user interface and make it easier to create new editors and things like that.
I’ve read some Oracle documentation about how to integrate JavaFX into an existing Java application (link) but it doesn’t seem particularly easy or maintainable. So I thought why attempt to put lipstick on a pig? Why not start from scratch, from a Hello World JavaFX application, and go from there?
Of course if you’ve got code that works, no matter how badly architected or buggy, throwing it all away and starting from scratch is anathema (link). I am not talking about doing that, which is what Crawford is doing with his Delta-tron project (link).
The current SWAT code is Java and the code in a JavaFX application is Java. So what I’m going to do is get a JavaFX Hello World application up and running and then cut and paste the Java code that I need from SWAT 1.3 into SWAT-FX. I can migrate just the code I need one step at a time, understands and refactor it along the way, as well as doing what modifications I need make to get it running in the SWAT-FX application.
So what basic functions should the SWAT-FX application be able to do?
- Read in a storyworld XML
- Create a Deikto structure from the XML
- Display the verbs, actors, props, and stages that it created (as “number of” or “list of”)
- Run the storyworld to termination without user intervention
- Display the Storybook and Log
There are two assumptions that I’m making based on the list above.
- Any storyworlds that used by SWAT-FX will have to be created with SWAT 1.3
- All actors will have total agency; the story will start and end without user intervention
Which brings me to items #4 and #5 from my original list (removing interactivity and total actor agency). I believe it is possible to create storyworlds in SWAT 1.3 which start, run, and end without any user interaction. I believe I started doing it with Siboot for Storytron back in 2010 but I never got the whole thing completely working. I believe it can be done with Fate verbs and alarms. I believe that with Fate verbs, consequences, alarms, and some scripting it can be jury rigged.
Which leaves items #3 and #6 in my original list (goals/plans/scripts and old code/new frameworks). The goals/plans/scripts part comes from the title of Roger Schank’s book “Goals, Plans, Scripts, and Understanding” (link). I recently acquired a copy, which I had read many, many years ago back in the late 1980’s when I was trying to figure out how to write my own text adventures. Though I didn’t apply Schank’s concepts back then his ideas have always stuck with me (Schank was James Meehan’s graduate advisor on Tale-Spin).
Shank’s ideas, older story generation code like Tale-Spin, Minstral, and Universe, newer procedural generation frameworks like Tracery (link), Improv (link, link), and Curveship (link) make me ask myself some meta-questions. What is story? What is narrative? What is point-of-view? I’ve struggled with the same questions in my own writing. How do some of the current tools out there like Inform 7, Twine, and Ink been used programmatically to answer these questions and what implementation details can we learn (and steal) from them?
So there you have it, three areas to investigate.
- Old SWAT 1.3 Java code combined with new SWAT-FX user interface
- Figuring out how to create non-interactive stories with SWAT 1.3
- What can old code/new frameworks teach us about story and narrative
Exploring each of these ideas will probably lead to other ideas and experiments.
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.
Over the years I have read about procedural generation in one form or another as it relates to game development. I recently read two books, Procedural Generation in Game Design and Procedural Storytelling in Game Design, that got me thinking about this technique again.
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.
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 .
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
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
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.
Maybe. We’ll see.