diff --git a/examples/duchess_party.html b/examples/duchess_party.html
index fb691cb..c8cf12a 100644
--- a/examples/duchess_party.html
+++ b/examples/duchess_party.html
@@ -123,7 +123,8 @@ StoryManager.getAllStorylets = function(tag=null) {
return allStorylets;
}
-StoryManager.getStorylets = function(n=null, tag=null, respect_interrupt=true) {
+StoryManager.getStorylets =
+ function(n=null, tag=null, selection="ordered", respect_interrupt=true) {
/*
Get n storylets, prioritizing the highest-priority ones first.
@@ -143,12 +144,24 @@ StoryManager.getStorylets = function(n=null, tag=null, respect_interrupt=true) {
if (allStorylets[i].interrupt) return [allStorylets[i]];
}
- // Get n stories in priority order
+ // Return n or the max
if (n != null) {
n = Math.min(n, allStorylets.length);
if (n == 0) return [];
}
else n = allStorylets.length;
+
+ let selectedStorylets;
+ if (selection == "ordered")
+ selectedStorylets = this.sortByPriority(allStorylets, n);
+ else if (selection == "weighted")
+ selectedStorylets = this.weightedRandom(allStorylets, n);
+
+ return selectedStorylets;
+}
+
+// Get storylets strictly by priority
+StoryManager.sortByPriority = function(allStorylets, n) {
let selectedStorylets = [];
// Select by strict priority; randomize among matching priority.
@@ -166,8 +179,29 @@ StoryManager.getStorylets = function(n=null, tag=null, respect_interrupt=true) {
return selectedStorylets;
}
-// Set up macros
+// Get storylets via weighted random choice
+StoryManager.weightedRandom = function(allStorylets, n) {
+ let selectedStorylets = [];
+ let sum, counter, index, rand;
+ while (selectedStorylets.length < n) {
+ sum = allStorylets.reduce((a, x) => a + x.priority, 0);
+ counter = 0;
+ rand = Math.random() * sum;
+ for (let i=0; i a + x.priority, 0);
+ counter = 0;
+ rand = Math.random() * sum;
+ for (let i=0; i>
- <>
+ <> \
+ <> \
[[_storylet.description|_storylet.passage][$currentStorylet=_storylet]]
- <>
- <>
+ <> \
+ <> \
`);
}
})
diff --git a/examples/tutorial.html b/examples/tutorial.html
index 4a6620d..700871a 100644
--- a/examples/tutorial.html
+++ b/examples/tutorial.html
@@ -123,7 +123,8 @@ StoryManager.getAllStorylets = function(tag=null) {
return allStorylets;
}
-StoryManager.getStorylets = function(n=null, tag=null, respect_interrupt=true) {
+StoryManager.getStorylets =
+ function(n=null, tag=null, selection="ordered", respect_interrupt=true) {
/*
Get n storylets, prioritizing the highest-priority ones first.
@@ -143,12 +144,24 @@ StoryManager.getStorylets = function(n=null, tag=null, respect_interrupt=true) {
if (allStorylets[i].interrupt) return [allStorylets[i]];
}
- // Get n stories in priority order
+ // Return n or the max
if (n != null) {
n = Math.min(n, allStorylets.length);
if (n == 0) return [];
}
else n = allStorylets.length;
+
+ let selectedStorylets;
+ if (selection == "ordered")
+ selectedStorylets = this.sortByPriority(allStorylets, n);
+ else if (selection == "weighted")
+ selectedStorylets = this.weightedRandom(allStorylets, n);
+
+ return selectedStorylets;
+}
+
+// Get storylets strictly by priority
+StoryManager.sortByPriority = function(allStorylets, n) {
let selectedStorylets = [];
// Select by strict priority; randomize among matching priority.
@@ -166,19 +179,40 @@ StoryManager.getStorylets = function(n=null, tag=null, respect_interrupt=true) {
return selectedStorylets;
}
-// Set up macros
+// Get storylets via weighted random choice
+StoryManager.weightedRandom = function(allStorylets, n) {
+ let selectedStorylets = [];
+ let sum, counter, index, rand;
+ while (selectedStorylets.length < n) {
+ sum = allStorylets.reduce((a, x) => a + x.priority, 0);
+ counter = 0;
+ rand = Math.random() * sum;
+ for (let i=0; i>
- <>
+ <> \
+ <> \
[[_storylet.description|_storylet.passage][$currentStorylet=_storylet]]
- <>
- <>
+ <> \
+ <> \
`);
}
})
diff --git a/storymanager.js b/storymanager.js
index 130f705..1693809 100644
--- a/storymanager.js
+++ b/storymanager.js
@@ -20,7 +20,8 @@ StoryManager.getAllStorylets = function(tag=null) {
return allStorylets;
}
-StoryManager.getStorylets = function(n=null, tag=null, respect_interrupt=true) {
+StoryManager.getStorylets =
+ function(n=null, tag=null, selection="ordered", respect_interrupt=true) {
/*
Get n storylets, prioritizing the highest-priority ones first.
@@ -40,12 +41,24 @@ StoryManager.getStorylets = function(n=null, tag=null, respect_interrupt=true) {
if (allStorylets[i].interrupt) return [allStorylets[i]];
}
- // Get n stories in priority order
+ // Return n or the max
if (n != null) {
n = Math.min(n, allStorylets.length);
if (n == 0) return [];
}
else n = allStorylets.length;
+
+ let selectedStorylets;
+ if (selection == "ordered")
+ selectedStorylets = this.sortByPriority(allStorylets, n);
+ else if (selection == "weighted")
+ selectedStorylets = this.weightedRandom(allStorylets, n);
+
+ return selectedStorylets;
+}
+
+// Get storylets strictly by priority
+StoryManager.sortByPriority = function(allStorylets, n) {
let selectedStorylets = [];
// Select by strict priority; randomize among matching priority.
@@ -63,8 +76,29 @@ StoryManager.getStorylets = function(n=null, tag=null, respect_interrupt=true) {
return selectedStorylets;
}
-// Set up macros
+// Get storylets via weighted random choice
+StoryManager.weightedRandom = function(allStorylets, n) {
+ let selectedStorylets = [];
+ let sum, counter, index, rand;
+ while (selectedStorylets.length < n) {
+ sum = allStorylets.reduce((a, x) => a + x.priority, 0);
+ counter = 0;
+ rand = Math.random() * sum;
+ for (let i=0; i