As with many other generative approaches to interactive storytelling, the stories that can be experienced or told with The Virtual Storyteller are part human-authored, part system-determined. In particular if stories are to emerge, it is impossible to determine beforehand what content and processes to write in order to come up with a satisfactory story domain.
Rather, we conceive of the creation process in The Virtual Storyteller as a continuous cycle of writing content, seeing what the system makes of this content, and coming up with new ideas. An authoring paradigma that has proven useful is to not only correct the system if it is not doing what was expected (’debugging’), but also to accept that the system may take the space of potential stories in directions not initially considered (’co-creation’) .
In this process, it is considered important to maintain a tight feedback loop between the steps, making small, incremental changes to the content. Furthermore, it is considered important to actively consider whether certain content can be reused in other situatons. This helps create density of the space of stories.
Content to be created
What needs to be created for a particular story domain? Let’s consider the simple case in which we re-use domain-independent parts of the character models (such as event appraisal and action planning) for a new story domain. In this case, authoring consists of a set of knowledge representations:
||Example from LRRH domain
||Facts about the story world (e.g., a topology, location of characters and objects)
||The Wolf is in the forest, Red has a birthday cake
||Gives semantics to these facts. Created in the Protégé tool 
||A forest is a type of location
||Characters and their initial goals, arranged for a specific purpose (e.g. to achieve a conflict)
||Wolf, Red and Grandma; Red wants to bring a cake to Grandma
||What does a character want to achieve, under which circumstances is this possible, and how important is it to achieve?
||Bring a cake to grandma, eat something, seek revenge
|Goal selection rules
||When is a character motivated or caused to adopt a goal?
||If you are hungry, eat something
||What can a character do, under which circumstances is this possible, and what are the effects?
||Skip to somewhere, eat, steal something, cry
|Action selection rules
||In which circumstances will a character select a certain action that was not planned?
||If you meet someone you haven’t met before, greet them
||What can happen (unintentionally, e.g., a car accident or dropping a vase), under which circumstances is this possible?
||What can a character reasonably expect to happen as a consequence of some event or action?
||If someone is offered a cake, they can be expected to eat it
||What possible inferences can be made given a certain context?
||If someone does not greet you back, they do not like you
||What aspects of the setting can be retroactively defined in service of the story?
||The Wolf in LRRH decides halfway that he is a mean character
This knowledge is currently created as a combination of RDF/Turtle syntax (setting), RDF/OWL knowledge edited in the Protégé tool (ontology) and Prolog files (goals, actions, etc). Eventually we would like to have a tool that supports authoring, for instance by presenting pre-defined fields, checking syntax and semantics, providing visual organisation of the content, and checking interrelatedness of content (e.g. actions that can be strung together in a plan but also, e.g., finding goals that can never occur).
Example of the setting of the LRRH world (in RDF/Turtle):
# Little Red Riding Hood
a red:LittleGirl ;
swc:at :reds_house ;
swc:has :birthday_cake ;
swc:owns :birthday_cake ;
rdfs:label "Little Red Riding Hood" .
# The forest
a red:Forest ;
rdfs:label "the forest" ;
# Path from Red’s house to forest
a swc:Path ;
swc:from :reds_house ;
swc:to :forest ;
rdfs:label "the path leading to the forest" .
Example action for taking something from someone (in Prolog):
arguments([agens(Agens), patiens(Patiens), target(Target)]),
% Two different characters and a location
rule(Agens, owlr:isNot, Target),
rule(Agens, owlr:typeOrSubType, swc:'Character'),
rule(Target, owlr:typeOrSubType, swc:'Character'),
rule(Loc, owlr:typeOrSubType, swc:'Location')
% Agens (who executes the action) is mean
fact(Agens, swc:hasAttribute, red:mean)
% Target has the thing
fact(Target, swc:has, Patiens)
% Agens does not own the thing (otherwise, this is TakeBack)
fact(Agens, swc:owns, Patiens)
% At the same location
fact(Agens, swc:at, Loc),
fact(Target, swc:at, Loc)
% Agens has the thing
fact(Agens, swc:has, Patiens)
% Target no longer has the thing
fact(Target, swc:has, Patiens)