diff --git a/examples/progress_example.html b/examples/progress_example.html
new file mode 100644
index 0000000..c178d72
--- /dev/null
+++ b/examples/progress_example.html
@@ -0,0 +1,278 @@
+
+
+
+
+Simple progress example
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Your browser lacks required capabilities. Please upgrade it or switch to another to continue.
+
+
+ You <<linkToNextStorylet "start walking">> through the woods.You walk deeper into the woods. You see a <<print $currentStorylet.animal>> <br>
+<<set $progress = $progress + 1>>
+<<linkToNextStorylet "Keep walking">>You reach the end of the forest!
+
+
+
diff --git a/examples/progress_example.tw b/examples/progress_example.tw
new file mode 100644
index 0000000..6475c47
--- /dev/null
+++ b/examples/progress_example.tw
@@ -0,0 +1,51 @@
+:: StoryTitle
+Simple progress example
+
+:: StoryData
+{
+ "ifid": "724F804D-9451-4347-BB4D-A0725429BC93"
+}
+
+:: Story JavaScript [script]
+Config.passages.nobr = true; // No unspecified linebreaks.
+
+let animals = ["moose", "fox", "toad"];
+State.variables.progress = 0;
+
+StoryManager.storylets["walk"] = {
+ name: "Walking",
+ generate: function*() {
+ for (let animal of animals) {
+ yield {
+ passage: "Walking",
+ animal: animal,
+ priority: 1
+ }
+ }
+ }
+}
+
+StoryManager.storylets["end"] = {
+ name: "The End",
+ generate: function*() {
+ if (State.variables.progress > 3) {
+ yield {
+ passage: "End",
+ priority: 2
+ }
+ }
+ }
+}
+
+
+:: Start
+
+You <> through the woods.
+
+:: Walking
+You walk deeper into the woods. You see a <>
+<>
+<>
+
+:: End
+You reach the end of the forest!
\ No newline at end of file
diff --git a/storymanager.js b/storymanager.js
index 2200182..5ca0c89 100644
--- a/storymanager.js
+++ b/storymanager.js
@@ -21,7 +21,7 @@ StoryManager.getAllStorylets = function(tag=null) {
}
StoryManager.getStorylets =
- function(n=null, tag=null, selection="weighted", respect_interrupt=true) {
+ function(n=null, tag=null, selection="ordered", respect_interrupt=true) {
/*
Get n storylets, prioritizing the highest-priority ones first.
@@ -35,10 +35,14 @@ StoryManager.getStorylets =
// Check for interruptions
- // TODO: Handle more than one interruption
if (respect_interrupt) {
- for (let i in allStorylets)
- if (allStorylets[i].interrupt) return [allStorylets[i]];
+ let interruptions = [];
+ for (let storylet of allStorylets)
+ if (storylet.interrupt) interruptions.push(storylet);
+ if (interruptions.length > 0) {
+ interruptions.sort((a, b) => b.priority - a.priority);
+ return [interruptions[0]];
+ }
}
// Return n or the max
@@ -85,7 +89,7 @@ StoryManager.weightedRandom = function(allStorylets, n) {
counter = 0;
rand = Math.random() * sum;
for (let i=0; i rand) {
selectedStorylets.push(allStorylets.splice(i, 1)[0]);
break;
}
@@ -102,9 +106,9 @@ StoryManager.weightedRandom = function(allStorylets, n) {
Macro.add("getStoryletLinks", {
handler: function() {
let n, tag;
- [n=null, tag=null] = this.args;
- State.temporary.nextStorylets = StoryManager.getStorylets(n, tag);
- $(this.output).wiki(`
+ [n=null, tag=null, selection="ordered"] = this.args;
+ State.temporary.nextStorylets = StoryManager.getStorylets(n, tag, selection);
+ $(this.output).wiki(`\
<> \
<> \
[[_storylet.description|_storylet.passage][$currentStorylet=_storylet]]
@@ -112,7 +116,15 @@ Macro.add("getStoryletLinks", {
<> \
`);
}
-})
+});
+Macro.add("linkToNextStorylet", {
+ handler: function() {
+ let text, tag, selection;
+ [text, tag=null, selection="weighted"] = this.args;
+ State.temporary.nextStorylet = StoryManager.getStorylets(1, tag, selection)[0];
+ $(this.output).wiki(`<>[[${text}|_nextStorylet.passage][$currentStorylet=_nextStorylet]]<>`);
+ }
+});
window.SM = StoryManager;
\ No newline at end of file