Testing linkToNextStorylet macro
This commit is contained in:
278
examples/progress_example.html
Normal file
278
examples/progress_example.html
Normal file
File diff suppressed because one or more lines are too long
51
examples/progress_example.tw
Normal file
51
examples/progress_example.tw
Normal file
@ -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 <<linkToNextStorylet "start walking">> through the woods.
|
||||
|
||||
:: Walking
|
||||
You walk deeper into the woods. You see a <<print $currentStorylet.animal>> <br>
|
||||
<<set $progress = $progress + 1>>
|
||||
<<linkToNextStorylet "Keep walking">>
|
||||
|
||||
:: End
|
||||
You reach the end of the forest!
|
@ -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<allStorylets.length; i++) {
|
||||
if (counter + allStorylets[i].priority) {
|
||||
if (counter + allStorylets[i].priority > 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(`\
|
||||
<<for _storylet range _nextStorylets>> \
|
||||
<<capture _storylet>> \
|
||||
[[_storylet.description|_storylet.passage][$currentStorylet=_storylet]]<br>
|
||||
@ -112,7 +116,15 @@ Macro.add("getStoryletLinks", {
|
||||
<</for>> \
|
||||
`);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
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(`<<capture _nextStorylet>>[[${text}|_nextStorylet.passage][$currentStorylet=_nextStorylet]]<</capture>>`);
|
||||
}
|
||||
});
|
||||
|
||||
window.SM = StoryManager;
|
Reference in New Issue
Block a user