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