From a2a9e4c02cb2fd8a0eb41e5052ab50653c9259da Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Wed, 27 Mar 2019 16:00:56 -0600 Subject: [PATCH] Fixing bugs --- examples/diverts/main.hank | 2 +- {old-examples => examples}/mindfuck/main.hank | 0 .../mindfuck/test1.hlog | 0 examples/parsing/misc.hank | 5 +++ hank/HInterface.hx | 1 + hank/Parser.hx | 11 ++--- hank/Story.hx | 41 ++++++++++--------- tests/ParserTest.hx | 1 + 8 files changed, 35 insertions(+), 26 deletions(-) rename {old-examples => examples}/mindfuck/main.hank (100%) rename {old-examples => examples}/mindfuck/test1.hlog (100%) diff --git a/examples/diverts/main.hank b/examples/diverts/main.hank index 8e95867..a45b8df 100644 --- a/examples/diverts/main.hank +++ b/examples/diverts/main.hank @@ -22,7 +22,7 @@ else = two -Second output. {start} {start.one} {start.two} {one.gather} +Second output. {start} {start.one} {two} {one.gather} -> one.gather -> three diff --git a/old-examples/mindfuck/main.hank b/examples/mindfuck/main.hank similarity index 100% rename from old-examples/mindfuck/main.hank rename to examples/mindfuck/main.hank diff --git a/old-examples/mindfuck/test1.hlog b/examples/mindfuck/test1.hlog similarity index 100% rename from old-examples/mindfuck/test1.hlog rename to examples/mindfuck/test1.hlog diff --git a/examples/parsing/misc.hank b/examples/parsing/misc.hank index 843ec8e..0c5eb3d 100644 --- a/examples/parsing/misc.hank +++ b/examples/parsing/misc.hank @@ -26,6 +26,11 @@ var test2 = 5; ``` , Output "this" ``` +``` +,,, +Output "this" +,,, +``` - no label gather on an output --(labeled) deep gather diff --git a/hank/HInterface.hx b/hank/HInterface.hx index be67192..27ba536 100644 --- a/hank/HInterface.hx +++ b/hank/HInterface.hx @@ -101,6 +101,7 @@ class HInterface { public function runEmbeddedHaxe(h: String, scope: Array) { interp.variables['scope'] = scope; + trace(h); var expr = parser.parseString(h); expr = transmute(expr); interp.execute(expr); diff --git a/hank/Parser.hx b/hank/Parser.hx index b723ff3..2c0ab75 100644 --- a/hank/Parser.hx +++ b/hank/Parser.hx @@ -25,7 +25,7 @@ class Parser { var ast: HankAST = []; public function new() { - + choices = 0; } public function parseString(h: String): HankAST { @@ -35,6 +35,7 @@ class Parser { do { var position = stringBuffer.position(); stringBuffer.skipWhitespace(); + if (stringBuffer.isEmpty()) break; var expr = parseExpr(stringBuffer, position); switch(expr) { case EIncludeFile(file): @@ -200,12 +201,12 @@ class Parser { // Transform , and ,,, expressions into Hank embedded in Haxe embedded in Hank do { var nextLine = blockBuffer.takeLine('lr').unwrap(); - if (StringTools.startsWith(nextLine, ',')) { + if (nextLine == ',,,'){ + var embeddedHankBlock = blockBuffer.takeUntil([',,,'],false,true).unwrap().output; + processedContents += 'story.runEmbeddedHank("${escapeQuotes(embeddedHankBlock)}"); '; + } else if (StringTools.startsWith(nextLine, ',')) { nextLine = StringTools.trim(nextLine.substr(1)); processedContents += 'story.runEmbeddedHank("${escapeQuotes(nextLine)}"); '; - } else if (nextLine == ',,,'){ - var embeddedHankBlock = blockBuffer.takeUntil(['```'],false,true).unwrap().output; - processedContents += 'story.runEmbeddedHank("${escapeQuotes(embeddedHankBlock)}"); '; } else { processedContents += nextLine+' '; } diff --git a/hank/Story.hx b/hank/Story.hx index 37944a8..ca2e830 100644 --- a/hank/Story.hx +++ b/hank/Story.hx @@ -33,7 +33,7 @@ class Story { var parser: Parser; - var embedded: Option = None; + var embeddedBlocks: Array = []; var parent: Option = None; function new(r: Random, p: Parser, ast: HankAST, st: StoryNode, sc: Array, vc: Map, hi: HInterface) { @@ -75,15 +75,18 @@ class Story { } public function nextFrame(): StoryFrame { - switch (embedded) { - case Some(s): - return s.nextFrame(); - case None: - if (exprIndex >= ast.length) { - return Finished; - } - return processExpr(ast[exprIndex].expr); + while (embeddedBlocks.length > 0) { + var nf = embeddedBlocks[0].nextFrame(); + if(nf == Finished) { + embeddedBlocks.remove(embeddedBlocks[0]); + } else { + return nf; + } } + if (exprIndex >= ast.length) { + return Finished; + } + return processExpr(ast[exprIndex].expr); } private function processExpr(expr: ExprType) { @@ -134,7 +137,6 @@ class Story { case Some(node): newScopes = whichScope.slice(i); newScopes.insert(0, node); - trace(newScopes); // Then resolve the rest of the parts inward from there for (part in targetParts.slice(1)) { var scope = newScopes[0]; @@ -154,13 +156,13 @@ class Story { } public function divertTo(target: String) { - trace('diverting to $target'); switch (parent) { case Some(p): - p.embedded = None; // + p.embeddedBlocks = []; // return p.divertTo(target); // A divert from inside embedded hank, ends the embedding default: } + trace('diverting to $target'); var newScopes = resolveNodeInScope(target); var targetIdx = newScopes[0].astIndex; @@ -212,18 +214,17 @@ class Story { } public function choose(choiceIndex: Int): String { - switch (embedded) { - case Some(s): - return s.choose(choiceIndex); - case None: - // TODO if the choice has a label, increment its view count - return ''; + if (embeddedBlocks.length > 0) { + return embeddedBlocks[0].choose(choiceIndex); + } else { + // if not embedded, actually make the choice + // TODO if the choice has a label, increment its view count + return ''; } } /** Parse and run embedded Hank script on the fly. **/ public function runEmbeddedHank(h: String) { - trace(h); - embedded = Some(embeddedStory(h)); + embeddedBlocks.push(embeddedStory(h)); } } \ No newline at end of file diff --git a/tests/ParserTest.hx b/tests/ParserTest.hx index 9035028..4e28810 100644 --- a/tests/ParserTest.hx +++ b/tests/ParserTest.hx @@ -102,6 +102,7 @@ class ParserTest extends utest.Test { assertNextExpr(EHaxeBlock("var haxeVar = 'test'; var test2 = 5; ")); assertNextExpr(EHaxeBlock('story.runEmbeddedHank("Output this"); ')); assertNextExpr(EHaxeBlock('story.runEmbeddedHank("Output \\"this\\""); ')); + assertNextExpr(EHaxeBlock('story.runEmbeddedHank("Output \\"this\\"\n"); ')); assertNextExpr(EGather(None, 1, EOutput(new Output([Text("no label gather on an output")])))); assertNextExpr(EGather(Some('labeled'), 2, EOutput(new Output([Text("deep gather")]))));