1 line
944 KiB
Plaintext
1 line
944 KiB
Plaintext
{"version":3,"file":"ink-full.js","sources":["../src/compiler/CompilerOptions.ts","../src/compiler/Parser/ErrorType.ts","../src/compiler/DebugSourceRange.ts","../src/compiler/Parser/ParsedHierarchy/Argument.ts","../src/engine/TypeAssertion.ts","../src/compiler/Parser/ParsedHierarchy/Object.ts","../src/engine/Debug.ts","../src/compiler/Parser/ParsedHierarchy/AuthorWarning.ts","../src/engine/Path.ts","../src/engine/NullException.ts","../src/engine/Object.ts","../src/engine/StringBuilder.ts","../src/engine/InkList.ts","../src/engine/StoryException.ts","../src/engine/TryGetResult.ts","../src/engine/Value.ts","../src/engine/SearchResult.ts","../src/engine/Container.ts","../src/engine/ControlCommand.ts","../src/compiler/Parser/ParsedHierarchy/Expression/Expression.ts","../src/engine/Void.ts","../src/engine/NativeFunctionCall.ts","../src/compiler/Parser/ParsedHierarchy/Expression/NumberExpression.ts","../src/compiler/Parser/ParsedHierarchy/Expression/UnaryExpression.ts","../src/compiler/Parser/ParsedHierarchy/Expression/BinaryExpression.ts","../src/compiler/Parser/CharacterSet.ts","../src/compiler/Parser/CharacterRange.ts","../src/engine/ChoicePoint.ts","../src/engine/PushPop.ts","../src/engine/Pointer.ts","../src/compiler/Parser/ParsedHierarchy/SymbolType.ts","../src/engine/Divert.ts","../src/engine/VariableAssignment.ts","../src/compiler/Parser/ParsedHierarchy/Choice.ts","../src/compiler/Parser/StringParser/StringParserElement.ts","../src/compiler/Parser/StringParser/StringParserState.ts","../src/compiler/Parser/StringParser/StringParser.ts","../src/compiler/Parser/CommentEliminator.ts","../src/compiler/Parser/ParsedHierarchy/Flow/FlowLevel.ts","../src/compiler/Parser/ParsedHierarchy/Conditional/Conditional.ts","../src/compiler/Parser/ParsedHierarchy/Text.ts","../src/compiler/Parser/ParsedHierarchy/Declaration/ConstantDeclaration.ts","../src/compiler/Parser/ParsedHierarchy/Gather/Gather.ts","../src/compiler/Parser/ParsedHierarchy/Path.ts","../src/compiler/Parser/ParsedHierarchy/ReturnType.ts","../src/compiler/Parser/ParsedHierarchy/Flow/ClosestFlowBase.ts","../src/compiler/Parser/ParsedHierarchy/Identifier.ts","../src/compiler/Parser/ParsedHierarchy/Flow/FlowBase.ts","../src/compiler/Parser/ParsedHierarchy/ContentList.ts","../src/engine/VariableReference.ts","../src/compiler/Parser/ParsedHierarchy/Variable/VariableReference.ts","../src/compiler/Parser/ParsedHierarchy/FunctionCall.ts","../src/compiler/Parser/ParsedHierarchy/Expression/MultipleConditionExpression.ts","../src/compiler/Parser/ParsedHierarchy/Sequence/SequenceType.ts","../src/compiler/Parser/ParsedHierarchy/Divert/DivertTarget.ts","../src/compiler/Parser/ParsedHierarchy/Divert/Divert.ts","../src/compiler/Parser/ParsedHierarchy/Gather/GatherPointToResolve.ts","../src/compiler/Parser/ParsedHierarchy/Sequence/SequenceDivertToResolve.ts","../src/compiler/Parser/ParsedHierarchy/Sequence/Sequence.ts","../src/compiler/Parser/CustomFlags.ts","../src/compiler/Parser/ParsedHierarchy/TunnelOnwards.ts","../src/engine/ListDefinition.ts","../src/compiler/Parser/ParsedHierarchy/List/ListDefinition.ts","../src/compiler/Parser/ParsedHierarchy/Variable/VariableAssignment.ts","../src/compiler/Parser/ParsedHierarchy/Weave.ts","../src/compiler/Parser/ParsedHierarchy/Conditional/ConditionalSingleBranch.ts","../src/engine/DebugMetadata.ts","../src/compiler/Parser/StatementLevel.ts","../src/compiler/Parser/ParsedHierarchy/Declaration/ExternalDeclaration.ts","../src/compiler/Parser/FlowDecl.ts","../src/compiler/Parser/ParsedHierarchy/Glue.ts","../src/compiler/Parser/ParsedHierarchy/Wrap.ts","../src/engine/Glue.ts","../src/compiler/Parser/ParsedHierarchy/Expression/IncDecExpression.ts","../src/compiler/Parser/ParsedHierarchy/IncludedFile.ts","../src/compiler/Parser/InfixOperator.ts","../src/compiler/Parser/ParsedHierarchy/Knot.ts","../src/compiler/Parser/ParsedHierarchy/List/List.ts","../src/compiler/Parser/ParsedHierarchy/List/ListElementDefinition.ts","../src/compiler/Parser/ParsedHierarchy/Stitch.ts","../src/engine/Tag.ts","../src/engine/Choice.ts","../src/engine/ListDefinitionsOrigin.ts","../src/engine/JsonSerialisation.ts","../src/engine/CallStack.ts","../src/engine/VariablesState.ts","../src/engine/PRNG.ts","../src/engine/StatePatch.ts","../src/engine/SimpleJson.ts","../src/engine/Flow.ts","../src/engine/Error.ts","../src/engine/StoryState.ts","../src/engine/StopWatch.ts","../src/engine/Story.ts","../src/compiler/Parser/ParsedHierarchy/Story.ts","../src/compiler/Parser/ParsedHierarchy/Expression/StringExpression.ts","../src/compiler/Parser/ParsedHierarchy/Tag.ts","../src/compiler/FileHandler/DefaultFileHandler.ts","../src/compiler/Parser/InkParser.ts","../src/compiler/FileHandler/JsonFileHandler.ts","../src/compiler/Compiler.ts"],"sourcesContent":["import { ErrorHandler } from \"../engine/Error\";\nimport { IFileHandler } from \"./IFileHandler\";\n\nexport class CompilerOptions {\n constructor(\n public readonly sourceFilename: string | null = null,\n public readonly pluginNames: string[] = [],\n public readonly countAllVisits: boolean = false,\n public readonly errorHandler: ErrorHandler | null = null,\n public readonly fileHandler: IFileHandler | null = null\n ) {}\n}\n","// TODO: Unifify with Engine.\n\nexport enum ErrorType {\n Author,\n Warning,\n Error,\n}\n","import { DebugMetadata } from \"../engine/DebugMetadata\";\n\nexport class DebugSourceRange {\n constructor(\n public readonly length: number,\n public readonly debugMetadata: DebugMetadata | null,\n public text: string\n ) {}\n}\n","import { Identifier } from \"./Identifier\";\n\nexport class Argument {\n constructor(\n public identifier: Identifier | null = null,\n public isByReference: boolean | null = null,\n public isDivertTarget: boolean | null = null\n ) {}\n}\n","import { INamedContent } from \"./INamedContent\";\n\nexport function asOrNull<T>(\n obj: any,\n type: (new (...arg: any[]) => T) | (Function & { prototype: T })\n): T | null {\n if (obj instanceof type) {\n return unsafeTypeAssertion(obj, type);\n } else {\n return null;\n }\n}\n\nexport function asOrThrows<T>(\n obj: any,\n type: (new (...arg: any[]) => T) | (Function & { prototype: T })\n): T | never {\n if (obj instanceof type) {\n return unsafeTypeAssertion(obj, type);\n } else {\n throw new Error(`${obj} is not of type ${type}`);\n }\n}\n\nexport function asNumberOrThrows(obj: any) {\n if (typeof obj === \"number\") {\n return obj as number;\n } else {\n throw new Error(`${obj} is not a number`);\n }\n}\n\nexport function asBooleanOrThrows(obj: any) {\n if (typeof obj === \"boolean\") {\n return obj as boolean;\n } else {\n throw new Error(`${obj} is not a boolean`);\n }\n}\n\n// So here, in the reference implementation, contentObj is casted to an INamedContent\n// but here we use js-style duck typing: if it implements the same props as the interface,\n// we treat it as valid.\nexport function asINamedContentOrNull(obj: any): INamedContent | null {\n if (obj.hasValidName && obj.name) {\n return obj as INamedContent;\n }\n\n return null;\n}\n\nexport function nullIfUndefined<T>(obj: T | undefined): T | null {\n if (typeof obj === \"undefined\") {\n return null;\n }\n\n return obj;\n}\n\nexport function isEquatable(type: any) {\n return typeof type === \"object\" && typeof type.Equals === \"function\";\n}\n\nfunction unsafeTypeAssertion<T>(\n obj: any,\n type: (new () => T) | (Function & { prototype: T })\n) {\n return obj as T;\n}\n\nexport function filterUndef<T>(element: T | undefined): element is T {\n return element != undefined;\n}\n","import { Container as RuntimeContainer } from \"../../../engine/Container\";\nimport { DebugMetadata } from \"../../../engine/DebugMetadata\";\nimport { FindQueryFunc } from \"./FindQueryFunc\";\nimport { InkObject as RuntimeObject } from \"../../../engine/Object\";\nimport { Path as RuntimePath } from \"../../../engine/Path\";\nimport { Story } from \"./Story\";\nimport { asOrNull } from \"../../../engine/TypeAssertion\";\n\nexport abstract class ParsedObject {\n public abstract readonly GenerateRuntimeObject: () => RuntimeObject | null;\n\n private _alreadyHadError: boolean = false;\n private _alreadyHadWarning: boolean = false;\n private _debugMetadata: DebugMetadata | null = null;\n private _runtimeObject: RuntimeObject | null = null;\n\n public content: ParsedObject[] = [];\n public parent: ParsedObject | null = null;\n\n get debugMetadata() {\n if (this._debugMetadata === null && this.parent) {\n return this.parent.debugMetadata;\n }\n\n return this._debugMetadata;\n }\n\n set debugMetadata(value: DebugMetadata | null) {\n this._debugMetadata = value;\n }\n\n get hasOwnDebugMetadata(): boolean {\n return Boolean(this.debugMetadata);\n }\n\n get typeName(): string {\n return \"ParsedObject\";\n }\n\n public readonly GetType = (): string => this.typeName;\n\n get story(): Story {\n let ancestor: ParsedObject = this;\n while (ancestor.parent) {\n ancestor = ancestor.parent;\n }\n\n return ancestor as Story;\n }\n\n get runtimeObject(): RuntimeObject {\n if (!this._runtimeObject) {\n this._runtimeObject = this.GenerateRuntimeObject();\n if (this._runtimeObject) {\n this._runtimeObject.debugMetadata = this.debugMetadata;\n }\n }\n\n return this._runtimeObject as RuntimeObject;\n }\n\n set runtimeObject(value: RuntimeObject) {\n this._runtimeObject = value;\n }\n\n get runtimePath(): RuntimePath {\n if (!this.runtimeObject.path) {\n throw new Error();\n }\n\n return this.runtimeObject.path;\n }\n\n // When counting visits and turns since, different object\n // types may have different containers that needs to be counted.\n // For most it'll just be the object's main runtime object,\n // but for e.g. choices, it'll be the target container.\n get containerForCounting(): RuntimeContainer | null {\n return this.runtimeObject as RuntimeContainer;\n }\n\n get ancestry(): ParsedObject[] {\n let result = [];\n\n let ancestor = this.parent;\n while (ancestor) {\n result.push(ancestor);\n ancestor = ancestor.parent;\n }\n\n result = result.reverse();\n\n return result;\n }\n\n /*\n get descriptionOfScope(): string {\n const locationNames: string[] = [];\n\n let ancestor: ParsedObject | null = this;\n while (ancestor) {\n var ancestorFlow = ancestor as FlowBase;\n if (ancestorFlow && ancestorFlow.name != null) {\n locationNames.push(`'${ancestorFlow.name}'`);\n }\n ancestor = ancestor.parent;\n }\n\n let scopeSB = '';\n if (locationNames.length > 0) {\n const locationsListStr = locationNames.join(', ');\n scopeSB += `${locationsListStr} and`;\n }\n\n scopeSB += 'at top scope';\n\n return scopeSB;\n }\n*/\n\n // Return the object so that method can be chained easily\n public readonly AddContent = <T extends ParsedObject, V extends T | T[]>(\n subContent: V\n ) => {\n if (this.content === null) {\n this.content = [];\n }\n\n const sub = Array.isArray(subContent) ? subContent : [subContent];\n\n // Make resilient to content not existing, which can happen\n // in the case of parse errors where we've already reported\n // an error but still want a valid structure so we can\n // carry on parsing.\n for (const ss of sub) {\n if (ss.hasOwnProperty(\"parent\")) {\n ss.parent = this;\n }\n this.content.push(ss);\n }\n\n if (Array.isArray(subContent)) {\n return;\n } else {\n return subContent;\n }\n };\n\n public readonly InsertContent = <T extends ParsedObject>(\n index: number,\n subContent: T\n ): T => {\n if (this.content === null) {\n this.content = [];\n }\n\n subContent.parent = this;\n this.content.splice(index, 0, subContent);\n\n return subContent;\n };\n\n public readonly Find =\n <T extends ParsedObject>(\n type: (new (...arg: any[]) => T) | (Function & { prototype: T })\n ) =>\n (queryFunc: FindQueryFunc<T> | null = null): T | null => {\n let tObj = asOrNull(this, type) as any as T;\n if (tObj !== null && (queryFunc === null || queryFunc(tObj) === true)) {\n return tObj;\n }\n\n if (this.content === null) {\n return null;\n }\n\n for (const obj of this.content) {\n let nestedResult = obj.Find && obj.Find(type)(queryFunc);\n if (nestedResult) {\n return nestedResult as T;\n }\n }\n\n return null;\n };\n\n public readonly FindAll =\n <T extends ParsedObject>(\n type: (new (...arg: any[]) => T) | (Function & { prototype: T })\n ) =>\n (queryFunc?: FindQueryFunc<T>, foundSoFar?: T[]): T[] => {\n const found = Array.isArray(foundSoFar) ? foundSoFar : [];\n\n const tObj = asOrNull(this, type);\n if (tObj !== null && (!queryFunc || queryFunc(tObj) === true)) {\n found.push(tObj);\n }\n\n if (this.content === null) {\n return [];\n }\n\n for (const obj of this.content) {\n obj.FindAll && obj.FindAll(type)(queryFunc, found);\n }\n\n return found;\n };\n\n public ResolveReferences(context: Story) {\n if (this.content !== null) {\n for (const obj of this.content) {\n obj.ResolveReferences(context);\n }\n }\n }\n\n public Error(\n message: string,\n source: ParsedObject | null = null,\n isWarning: boolean = false\n ): void {\n if (source === null) {\n source = this;\n }\n\n // Only allow a single parsed object to have a single error *directly* associated with it\n if (\n (source._alreadyHadError && !isWarning) ||\n (source._alreadyHadWarning && isWarning)\n ) {\n return;\n }\n\n if (this.parent) {\n this.parent.Error(message, source, isWarning);\n } else {\n throw new Error(`No parent object to send error to: ${message}`);\n }\n\n if (isWarning) {\n source._alreadyHadWarning = true;\n } else {\n source._alreadyHadError = true;\n }\n }\n\n public readonly Warning = (\n message: string,\n source: ParsedObject | null = null\n ): void => {\n this.Error(message, source, true);\n };\n}\n","export namespace Debug {\n export function AssertType<T>(\n variable: any,\n type: new () => T,\n message: string\n ): void | never {\n Assert(variable instanceof type, message);\n }\n\n export function Assert(condition: boolean, message?: string): void | never {\n if (!condition) {\n if (typeof message !== \"undefined\") {\n console.warn(message);\n }\n\n if (console.trace) {\n console.trace();\n }\n\n throw new Error(\"\");\n }\n }\n}\n","import { ParsedObject } from \"./Object\";\n\nexport class AuthorWarning extends ParsedObject {\n constructor(public readonly warningMessage: string) {\n super();\n }\n\n get typeName(): string {\n return \"AuthorWarning\";\n }\n\n public readonly GenerateRuntimeObject = (): null => {\n this.Warning(this.warningMessage);\n return null;\n };\n}\n","export class Path {\n public static parentId = \"^\";\n\n public _isRelative: boolean;\n public _components: Path.Component[];\n public _componentsString: string | null;\n\n constructor();\n constructor(componentsString: string);\n constructor(head: Path.Component, tail: Path);\n constructor(head: Path.Component[], relative?: boolean);\n constructor() {\n this._components = [];\n this._componentsString = null;\n this._isRelative = false;\n\n if (typeof arguments[0] == \"string\") {\n let componentsString = arguments[0] as string;\n this.componentsString = componentsString;\n } else if (\n arguments[0] instanceof Path.Component &&\n arguments[1] instanceof Path\n ) {\n let head = arguments[0] as Path.Component;\n let tail = arguments[1] as Path;\n this._components.push(head);\n this._components = this._components.concat(tail._components);\n } else if (arguments[0] instanceof Array) {\n let head = arguments[0] as Path.Component[];\n let relative = !!arguments[1] as boolean;\n this._components = this._components.concat(head);\n this._isRelative = relative;\n }\n }\n get isRelative() {\n return this._isRelative;\n }\n get componentCount(): number {\n return this._components.length;\n }\n get head(): Path.Component | null {\n if (this._components.length > 0) {\n return this._components[0];\n } else {\n return null;\n }\n }\n get tail(): Path {\n if (this._components.length >= 2) {\n // careful, the original code uses length-1 here. This is because the second argument of\n // List.GetRange is a number of elements to extract, wherease Array.slice uses an index\n let tailComps = this._components.slice(1, this._components.length);\n return new Path(tailComps);\n } else {\n return Path.self;\n }\n }\n get length(): number {\n return this._components.length;\n }\n get lastComponent(): Path.Component | null {\n let lastComponentIdx = this._components.length - 1;\n if (lastComponentIdx >= 0) {\n return this._components[lastComponentIdx];\n } else {\n return null;\n }\n }\n get containsNamedComponent(): boolean {\n for (let i = 0, l = this._components.length; i < l; i++) {\n if (!this._components[i].isIndex) {\n return true;\n }\n }\n return false;\n }\n static get self(): Path {\n let path = new Path();\n path._isRelative = true;\n return path;\n }\n\n public GetComponent(index: number): Path.Component {\n return this._components[index];\n }\n public PathByAppendingPath(pathToAppend: Path): Path {\n let p = new Path();\n\n let upwardMoves = 0;\n for (let i = 0; i < pathToAppend._components.length; ++i) {\n if (pathToAppend._components[i].isParent) {\n upwardMoves++;\n } else {\n break;\n }\n }\n\n for (let i = 0; i < this._components.length - upwardMoves; ++i) {\n p._components.push(this._components[i]);\n }\n\n for (let i = upwardMoves; i < pathToAppend._components.length; ++i) {\n p._components.push(pathToAppend._components[i]);\n }\n\n return p;\n }\n get componentsString(): string {\n if (this._componentsString == null) {\n this._componentsString = this._components.join(\".\");\n if (this.isRelative)\n this._componentsString = \".\" + this._componentsString;\n }\n\n return this._componentsString;\n }\n set componentsString(value: string) {\n this._components.length = 0;\n\n this._componentsString = value;\n\n if (this._componentsString == null || this._componentsString == \"\") return;\n\n if (this._componentsString[0] == \".\") {\n this._isRelative = true;\n this._componentsString = this._componentsString.substring(1);\n }\n\n let componentStrings = this._componentsString.split(\".\");\n for (let str of componentStrings) {\n // we need to distinguish between named components that start with a number, eg \"42somewhere\", and indexed components\n // the normal parseInt won't do for the detection because it's too relaxed.\n // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt\n if (/^(\\-|\\+)?([0-9]+|Infinity)$/.test(str)) {\n this._components.push(new Path.Component(parseInt(str)));\n } else {\n this._components.push(new Path.Component(str));\n }\n }\n }\n public toString(): string {\n return this.componentsString;\n }\n public Equals(otherPath: Path | null): boolean {\n if (otherPath == null) return false;\n\n if (otherPath._components.length != this._components.length) return false;\n\n if (otherPath.isRelative != this.isRelative) return false;\n\n // the original code uses SequenceEqual here, so we need to iterate over the components manually.\n for (let i = 0, l = otherPath._components.length; i < l; i++) {\n // it's not quite clear whether this test should use Equals or a simple == operator,\n // see https://github.com/y-lohse/inkjs/issues/22\n if (!otherPath._components[i].Equals(this._components[i])) return false;\n }\n\n return true;\n }\n public PathByAppendingComponent(c: Path.Component): Path {\n let p = new Path();\n p._components.push(...this._components);\n p._components.push(c);\n return p;\n }\n}\n\nexport namespace Path {\n export class Component {\n public readonly index: number;\n public readonly name: string | null;\n\n constructor(indexOrName: string | number) {\n this.index = -1;\n this.name = null;\n if (typeof indexOrName == \"string\") {\n this.name = indexOrName;\n } else {\n this.index = indexOrName;\n }\n }\n get isIndex(): boolean {\n return this.index >= 0;\n }\n get isParent(): boolean {\n return this.name == Path.parentId;\n }\n\n public static ToParent(): Component {\n return new Component(Path.parentId);\n }\n public toString(): string | null {\n if (this.isIndex) {\n return this.index.toString();\n } else {\n return this.name;\n }\n }\n public Equals(otherComp: Component): boolean {\n if (otherComp != null && otherComp.isIndex == this.isIndex) {\n if (this.isIndex) {\n return this.index == otherComp.index;\n } else {\n return this.name == otherComp.name;\n }\n }\n\n return false;\n }\n }\n}\n","/**\n * In the original C# code, a SystemException would be thrown when passing\n * null to methods expected a valid instance. Javascript has no such\n * concept, but TypeScript will not allow `null` to be passed to methods\n * explicitely requiring a valid type.\n *\n * Whenever TypeScript complain about the possibility of a `null` value,\n * check the offending value and it it's null, throw this exception using\n * `throwNullException(name: string)`.\n */\nexport class NullException extends Error {}\n\n/**\n * Throw a NullException.\n *\n * @param name a short description of the offending value (often its name within the code).\n */\nexport function throwNullException(name: string): never {\n throw new NullException(`${name} is null or undefined`);\n}\n","import { Path } from \"./Path\";\nimport { Container } from \"./Container\";\nimport { Debug } from \"./Debug\";\nimport { asOrNull, asINamedContentOrNull } from \"./TypeAssertion\";\nimport { throwNullException } from \"./NullException\";\nimport { SearchResult } from \"./SearchResult\";\nimport { DebugMetadata } from \"./DebugMetadata\";\n\nexport class InkObject {\n public parent: InkObject | null = null;\n\n get debugMetadata(): DebugMetadata | null {\n if (this._debugMetadata === null) {\n if (this.parent) {\n return this.parent.debugMetadata;\n }\n }\n\n return this._debugMetadata;\n }\n\n set debugMetadata(value) {\n this._debugMetadata = value;\n }\n\n get ownDebugMetadata() {\n return this._debugMetadata;\n }\n\n private _debugMetadata: DebugMetadata | null = null;\n\n public DebugLineNumberOfPath(path: Path) {\n if (path === null) return null;\n\n // Try to get a line number from debug metadata\n let root = this.rootContentContainer;\n if (root) {\n let targetContent = root.ContentAtPath(path).obj;\n if (targetContent) {\n let dm = targetContent.debugMetadata;\n if (dm !== null) {\n return dm.startLineNumber;\n }\n }\n }\n\n return null;\n }\n\n get path() {\n if (this._path == null) {\n if (this.parent == null) {\n this._path = new Path();\n } else {\n let comps: Path.Component[] = [];\n\n let child: InkObject = this;\n let container = asOrNull(child.parent, Container);\n\n while (container !== null) {\n let namedChild = asINamedContentOrNull(child);\n if (namedChild != null && namedChild.hasValidName) {\n if (namedChild.name === null)\n return throwNullException(\"namedChild.name\");\n comps.unshift(new Path.Component(namedChild.name!));\n } else {\n comps.unshift(new Path.Component(container.content.indexOf(child)));\n }\n\n child = container;\n container = asOrNull(container.parent, Container);\n }\n\n this._path = new Path(comps);\n }\n }\n\n return this._path;\n }\n private _path: Path | null = null;\n\n public ResolvePath(path: Path | null): SearchResult {\n if (path === null) return throwNullException(\"path\");\n if (path.isRelative) {\n let nearestContainer = asOrNull(this, Container);\n\n if (nearestContainer === null) {\n Debug.Assert(\n this.parent !== null,\n \"Can't resolve relative path because we don't have a parent\"\n );\n nearestContainer = asOrNull(this.parent, Container);\n Debug.Assert(\n nearestContainer !== null,\n \"Expected parent to be a container\"\n );\n Debug.Assert(path.GetComponent(0).isParent);\n path = path.tail;\n }\n\n if (nearestContainer === null) {\n return throwNullException(\"nearestContainer\");\n }\n return nearestContainer.ContentAtPath(path);\n } else {\n let contentContainer = this.rootContentContainer;\n if (contentContainer === null) {\n return throwNullException(\"contentContainer\");\n }\n return contentContainer.ContentAtPath(path);\n }\n }\n\n public ConvertPathToRelative(globalPath: Path) {\n let ownPath = this.path;\n\n let minPathLength = Math.min(globalPath.length, ownPath.length);\n let lastSharedPathCompIndex = -1;\n\n for (let i = 0; i < minPathLength; ++i) {\n let ownComp = ownPath.GetComponent(i);\n let otherComp = globalPath.GetComponent(i);\n\n if (ownComp.Equals(otherComp)) {\n lastSharedPathCompIndex = i;\n } else {\n break;\n }\n }\n\n // No shared path components, so just use global path\n if (lastSharedPathCompIndex == -1) return globalPath;\n\n let numUpwardsMoves = ownPath.componentCount - 1 - lastSharedPathCompIndex;\n\n let newPathComps: Path.Component[] = [];\n\n for (let up = 0; up < numUpwardsMoves; ++up)\n newPathComps.push(Path.Component.ToParent());\n\n for (\n let down = lastSharedPathCompIndex + 1;\n down < globalPath.componentCount;\n ++down\n )\n newPathComps.push(globalPath.GetComponent(down));\n\n let relativePath = new Path(newPathComps, true);\n return relativePath;\n }\n\n public CompactPathString(otherPath: Path) {\n let globalPathStr = null;\n let relativePathStr = null;\n\n if (otherPath.isRelative) {\n relativePathStr = otherPath.componentsString;\n globalPathStr = this.path.PathByAppendingPath(otherPath).componentsString;\n } else {\n let relativePath = this.ConvertPathToRelative(otherPath);\n relativePathStr = relativePath.componentsString;\n globalPathStr = otherPath.componentsString;\n }\n\n if (relativePathStr.length < globalPathStr.length) return relativePathStr;\n else return globalPathStr;\n }\n\n get rootContentContainer() {\n let ancestor: InkObject = this;\n while (ancestor.parent) {\n ancestor = ancestor.parent;\n }\n return asOrNull(ancestor, Container);\n }\n\n public Copy(): InkObject {\n throw Error(\"Not Implemented: Doesn't support copying\");\n }\n // SetChild works slightly diferently in the js implementation.\n // Since we can't pass an objets property by reference, we instead pass\n // the object and the property string.\n // TODO: This method can probably be rewritten with type-safety in mind.\n public SetChild(obj: any, prop: any, value: any) {\n if (obj[prop]) obj[prop] = null;\n\n obj[prop] = value;\n\n if (obj[prop]) obj[prop].parent = this;\n }\n\n public Equals(obj: any) {\n return obj === this;\n }\n}\n","export class StringBuilder {\n private string: string;\n\n constructor(str?: string) {\n str = typeof str !== \"undefined\" ? str.toString() : \"\";\n this.string = str;\n }\n get Length(): number {\n return this.string.length;\n }\n public Append(str: string | null) {\n if (str !== null) {\n this.string += str;\n }\n }\n public AppendLine(str?: string) {\n if (typeof str !== \"undefined\") this.Append(str);\n this.string += \"\\n\";\n }\n public AppendFormat(format: string, ...args: any[]) {\n // taken from http://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format\n this.string += format.replace(/{(\\d+)}/g, (match: string, num: number) =>\n typeof args[num] != \"undefined\" ? args[num] : match\n );\n }\n public toString(): string {\n return this.string;\n }\n\n public Clear() {\n this.string = \"\";\n }\n}\n","import { throwNullException } from \"./NullException\";\nimport { StringBuilder } from \"./StringBuilder\";\nimport { ListDefinition } from \"./ListDefinition\";\nimport { Story } from \"./Story\";\n\nexport class InkListItem implements IInkListItem {\n // InkListItem is a struct\n\n public readonly originName: string | null = null;\n public readonly itemName: string | null = null;\n\n constructor(originName: string | null, itemName: string | null);\n constructor(fullName: string | null);\n constructor() {\n if (typeof arguments[1] !== \"undefined\") {\n let originName = arguments[0] as string | null;\n let itemName = arguments[1] as string | null;\n\n this.originName = originName;\n this.itemName = itemName;\n } else if (arguments[0]) {\n let fullName = arguments[0] as string;\n\n let nameParts = fullName.toString().split(\".\");\n this.originName = nameParts[0];\n this.itemName = nameParts[1];\n }\n }\n public static get Null() {\n return new InkListItem(null, null);\n }\n public get isNull() {\n return this.originName == null && this.itemName == null;\n }\n get fullName() {\n return (\n (this.originName !== null ? this.originName : \"?\") + \".\" + this.itemName\n );\n }\n public toString(): string {\n return this.fullName;\n }\n public Equals(obj: InkListItem) {\n if (obj instanceof InkListItem) {\n let otherItem = obj;\n return (\n otherItem.itemName == this.itemName &&\n otherItem.originName == this.originName\n );\n }\n\n return false;\n }\n\n // These methods did not exist in the original C# code. Their purpose is to\n // make `InkListItem` mimics the value-type semantics of the original\n // struct. Please refer to the end of this file, for a more in-depth\n // explanation.\n\n /**\n * Returns a shallow clone of the current instance.\n */\n public copy() {\n return new InkListItem(this.originName, this.itemName);\n }\n /**\n * Returns a `SerializedInkListItem` representing the current\n * instance. The result is intended to be used as a key inside a Map.\n */\n public serialized(): SerializedInkListItem {\n // We are simply using a JSON representation as a value-typed key.\n return JSON.stringify({\n originName: this.originName,\n itemName: this.itemName,\n });\n }\n\n /**\n * Reconstructs a `InkListItem` from the given SerializedInkListItem.\n */\n public static fromSerializedKey(key: SerializedInkListItem): InkListItem {\n let obj = JSON.parse(key);\n if (!InkListItem.isLikeInkListItem(obj)) return InkListItem.Null;\n\n let inkListItem = obj as IInkListItem;\n\n return new InkListItem(inkListItem.originName, inkListItem.itemName);\n }\n\n /**\n * Determines whether the given item is sufficiently `InkListItem`-like\n * to be used as a template when reconstructing the InkListItem.\n */\n private static isLikeInkListItem(item: any) {\n if (typeof item !== \"object\") return false;\n if (!item.hasOwnProperty(\"originName\") || !item.hasOwnProperty(\"itemName\"))\n return false;\n if (typeof item.originName !== \"string\" && typeof item.originName !== null)\n return false;\n if (typeof item.itemName !== \"string\" && typeof item.itemName !== null)\n return false;\n\n return true;\n }\n}\n\nexport class InkList extends Map<SerializedInkListItem, number> {\n public origins: ListDefinition[] | null = null;\n public _originNames: string[] | null = [];\n\n constructor();\n constructor(otherList: InkList);\n constructor(singleOriginListName: string, originStory: Story);\n constructor(singleElement: KeyValuePair<InkListItem, number>);\n constructor() {\n // Trying to be smart here, this emulates the constructor inheritance found\n // in the original code, but only if otherList is an InkList. IIFE FTW.\n super(\n (() => {\n if (arguments[0] instanceof InkList) {\n return arguments[0];\n } else {\n return [];\n }\n })()\n );\n\n if (arguments[0] instanceof InkList) {\n let otherList = arguments[0] as InkList;\n\n let otherOriginNames = otherList.originNames as string[];\n if (otherOriginNames !== null)\n this._originNames = otherOriginNames.slice();\n if (otherList.origins !== null) {\n this.origins = otherList.origins.slice();\n }\n } else if (typeof arguments[0] === \"string\") {\n let singleOriginListName = arguments[0] as string;\n let originStory = arguments[1] as Story;\n this.SetInitialOriginName(singleOriginListName);\n\n if (originStory.listDefinitions === null) {\n return throwNullException(\"originStory.listDefinitions\");\n }\n let def = originStory.listDefinitions.TryListGetDefinition(\n singleOriginListName,\n null\n );\n if (def.exists) {\n // Throwing now, because if the value is `null` it will\n // eventually throw down the line.\n if (def.result === null) {\n return throwNullException(\"def.result\");\n }\n this.origins = [def.result];\n } else {\n throw new Error(\n \"InkList origin could not be found in story when constructing new list: \" +\n singleOriginListName\n );\n }\n } else if (\n typeof arguments[0] === \"object\" &&\n arguments[0].hasOwnProperty(\"Key\") &&\n arguments[0].hasOwnProperty(\"Value\")\n ) {\n let singleElement = arguments[0] as KeyValuePair<InkListItem, number>;\n this.Add(singleElement.Key, singleElement.Value);\n }\n }\n\n public static FromString(myListItem: string, originStory: Story) {\n let listValue =\n originStory.listDefinitions?.FindSingleItemListWithName(myListItem);\n if (listValue) {\n if (listValue.value === null) {\n return throwNullException(\"listValue.value\");\n }\n return new InkList(listValue.value);\n } else {\n throw new Error(\n \"Could not find the InkListItem from the string '\" +\n myListItem +\n \"' to create an InkList because it doesn't exist in the original list definition in ink.\"\n );\n }\n }\n\n public AddItem(itemOrItemName: InkListItem | string | null) {\n if (itemOrItemName instanceof InkListItem) {\n let item = itemOrItemName;\n\n if (item.originName == null) {\n this.AddItem(item.itemName);\n return;\n }\n\n if (this.origins === null) return throwNullException(\"this.origins\");\n\n for (let origin of this.origins) {\n if (origin.name == item.originName) {\n let intVal = origin.TryGetValueForItem(item, 0);\n if (intVal.exists) {\n this.Add(item, intVal.result);\n return;\n } else {\n throw new Error(\n \"Could not add the item \" +\n item +\n \" to this list because it doesn't exist in the original list definition in ink.\"\n );\n }\n }\n }\n\n throw new Error(\n \"Failed to add item to list because the item was from a new list definition that wasn't previously known to this list. Only items from previously known lists can be used, so that the int value can be found.\"\n );\n } else {\n let itemName = itemOrItemName as string | null;\n\n let foundListDef: ListDefinition | null = null;\n\n if (this.origins === null) return throwNullException(\"this.origins\");\n\n for (let origin of this.origins) {\n if (itemName === null) return throwNullException(\"itemName\");\n\n if (origin.ContainsItemWithName(itemName)) {\n if (foundListDef != null) {\n throw new Error(\n \"Could not add the item \" +\n itemName +\n \" to this list because it could come from either \" +\n origin.name +\n \" or \" +\n foundListDef.name\n );\n } else {\n foundListDef = origin;\n }\n }\n }\n\n if (foundListDef == null)\n throw new Error(\n \"Could not add the item \" +\n itemName +\n \" to this list because it isn't known to any list definitions previously associated with this list.\"\n );\n\n let item = new InkListItem(foundListDef.name, itemName);\n let itemVal = foundListDef.ValueForItem(item);\n this.Add(item, itemVal);\n }\n }\n public ContainsItemNamed(itemName: string | null) {\n for (let [key] of this) {\n let item = InkListItem.fromSerializedKey(key);\n if (item.itemName == itemName) return true;\n }\n\n return false;\n }\n public ContainsKey(key: InkListItem) {\n return this.has(key.serialized());\n }\n public Add(key: InkListItem, value: number) {\n let serializedKey = key.serialized();\n if (this.has(serializedKey)) {\n // Throw an exception to match the C# behavior.\n throw new Error(`The Map already contains an entry for ${key}`);\n }\n this.set(serializedKey, value);\n }\n public Remove(key: InkListItem) {\n return this.delete(key.serialized());\n }\n get Count() {\n return this.size;\n }\n get originOfMaxItem(): ListDefinition | null {\n if (this.origins == null) return null;\n\n let maxOriginName = this.maxItem.Key.originName;\n let result = null;\n this.origins.every((origin) => {\n if (origin.name == maxOriginName) {\n result = origin;\n return false;\n } else return true;\n });\n\n return result;\n }\n get originNames(): string[] {\n if (this.Count > 0) {\n if (this._originNames == null && this.Count > 0) this._originNames = [];\n else {\n if (!this._originNames) this._originNames = [];\n this._originNames.length = 0;\n }\n\n for (let [key] of this) {\n let item = InkListItem.fromSerializedKey(key);\n if (item.originName === null)\n return throwNullException(\"item.originName\");\n this._originNames.push(item.originName);\n }\n }\n\n return this._originNames as string[];\n }\n public SetInitialOriginName(initialOriginName: string) {\n this._originNames = [initialOriginName];\n }\n public SetInitialOriginNames(initialOriginNames: string[]) {\n if (initialOriginNames == null) this._originNames = null;\n else this._originNames = initialOriginNames.slice(); // store a copy\n }\n get maxItem() {\n let max: KeyValuePair<InkListItem, number> = {\n Key: InkListItem.Null,\n Value: 0,\n };\n for (let [key, value] of this) {\n let item = InkListItem.fromSerializedKey(key);\n if (max.Key.isNull || value > max.Value)\n max = { Key: item, Value: value };\n }\n\n return max;\n }\n get minItem() {\n let min: KeyValuePair<InkListItem, number> = {\n Key: InkListItem.Null,\n Value: 0,\n };\n for (let [key, value] of this) {\n let item = InkListItem.fromSerializedKey(key);\n if (min.Key.isNull || value < min.Value) {\n min = { Key: item, Value: value };\n }\n }\n return min;\n }\n get inverse() {\n let list = new InkList();\n if (this.origins != null) {\n for (let origin of this.origins) {\n for (let [key, value] of origin.items) {\n let item = InkListItem.fromSerializedKey(key);\n if (!this.ContainsKey(item)) list.Add(item, value);\n }\n }\n }\n return list;\n }\n get all() {\n let list = new InkList();\n if (this.origins != null) {\n for (let origin of this.origins) {\n for (let [key, value] of origin.items) {\n let item = InkListItem.fromSerializedKey(key);\n list.set(item.serialized(), value);\n }\n }\n }\n return list;\n }\n public Union(otherList: InkList) {\n let union = new InkList(this);\n for (let [key, value] of otherList) {\n union.set(key, value);\n }\n return union;\n }\n public Intersect(otherList: InkList) {\n let intersection = new InkList();\n for (let [key, value] of this) {\n if (otherList.has(key)) intersection.set(key, value);\n }\n\n return intersection;\n }\n public HasIntersection(otherList: InkList): boolean {\n for (let [key] of this) {\n if (otherList.has(key)) return true;\n }\n return false;\n }\n public Without(listToRemove: InkList) {\n let result = new InkList(this);\n for (let [key] of listToRemove) {\n result.delete(key);\n }\n\n return result;\n }\n\n public Contains(key: string): boolean;\n public Contains(otherList: InkList): boolean;\n public Contains(what: string | InkList): boolean {\n if (typeof what == \"string\") return this.ContainsItemNamed(what);\n const otherList = what;\n if (otherList.size == 0 || this.size == 0) return false;\n for (let [key] of otherList) {\n if (!this.has(key)) return false;\n }\n\n return true;\n }\n public GreaterThan(otherList: InkList) {\n if (this.Count == 0) return false;\n if (otherList.Count == 0) return true;\n\n return this.minItem.Value > otherList.maxItem.Value;\n }\n public GreaterThanOrEquals(otherList: InkList) {\n if (this.Count == 0) return false;\n if (otherList.Count == 0) return true;\n\n return (\n this.minItem.Value >= otherList.minItem.Value &&\n this.maxItem.Value >= otherList.maxItem.Value\n );\n }\n public LessThan(otherList: InkList) {\n if (otherList.Count == 0) return false;\n if (this.Count == 0) return true;\n\n return this.maxItem.Value < otherList.minItem.Value;\n }\n public LessThanOrEquals(otherList: InkList) {\n if (otherList.Count == 0) return false;\n if (this.Count == 0) return true;\n\n return (\n this.maxItem.Value <= otherList.maxItem.Value &&\n this.minItem.Value <= otherList.minItem.Value\n );\n }\n public MaxAsList() {\n if (this.Count > 0) return new InkList(this.maxItem);\n else return new InkList();\n }\n public MinAsList() {\n if (this.Count > 0) return new InkList(this.minItem);\n else return new InkList();\n }\n public ListWithSubRange(minBound: any, maxBound: any) {\n if (this.Count == 0) return new InkList();\n\n let ordered = this.orderedItems;\n\n let minValue = 0;\n let maxValue = Number.MAX_SAFE_INTEGER;\n\n if (Number.isInteger(minBound)) {\n minValue = minBound;\n } else {\n if (minBound instanceof InkList && minBound.Count > 0)\n minValue = minBound.minItem.Value;\n }\n\n if (Number.isInteger(maxBound)) {\n maxValue = maxBound;\n } else {\n if (minBound instanceof InkList && minBound.Count > 0)\n maxValue = maxBound.maxItem.Value;\n }\n\n let subList = new InkList();\n subList.SetInitialOriginNames(this.originNames);\n for (let item of ordered) {\n if (item.Value >= minValue && item.Value <= maxValue) {\n subList.Add(item.Key, item.Value);\n }\n }\n\n return subList;\n }\n public Equals(otherInkList: InkList) {\n if (otherInkList instanceof InkList === false) return false;\n if (otherInkList.Count != this.Count) return false;\n\n for (let [key] of this) {\n if (!otherInkList.has(key)) return false;\n }\n\n return true;\n }\n // GetHashCode not implemented\n get orderedItems() {\n // List<KeyValuePair<InkListItem, int>>\n let ordered = new Array<KeyValuePair<InkListItem, number>>();\n\n for (let [key, value] of this) {\n let item = InkListItem.fromSerializedKey(key);\n ordered.push({ Key: item, Value: value });\n }\n\n ordered.sort((x, y) => {\n if (x.Key.originName === null) {\n return throwNullException(\"x.Key.originName\");\n }\n if (y.Key.originName === null) {\n return throwNullException(\"y.Key.originName\");\n }\n\n if (x.Value == y.Value) {\n return x.Key.originName.localeCompare(y.Key.originName);\n } else {\n // TODO: refactor this bit into a numberCompareTo method?\n if (x.Value < y.Value) return -1;\n return x.Value > y.Value ? 1 : 0;\n }\n });\n\n return ordered;\n }\n public toString() {\n let ordered = this.orderedItems;\n\n let sb = new StringBuilder();\n for (let i = 0; i < ordered.length; i++) {\n if (i > 0) sb.Append(\", \");\n\n let item = ordered[i].Key;\n if (item.itemName === null) return throwNullException(\"item.itemName\");\n sb.Append(item.itemName);\n }\n\n return sb.toString();\n }\n // casting a InkList to a Number, for somereason, actually gives a number.\n // This messes up the type detection when creating a Value from a InkList.\n // Returning NaN here prevents that.\n public valueOf() {\n return NaN;\n }\n}\n\n/**\n * In the original C# code, `InkListItem` was defined as value type, meaning\n * that two `InkListItem` would be considered equal as long as they held the\n * same values. This doesn't hold true in Javascript, as `InkListItem` is a\n * reference type (Javascript doesn't allow the creation of custom value types).\n *\n * The key equality of Map objects is based on the \"SameValueZero\" algorithm;\n * since `InkListItem` is a value type, two keys will only be considered\n * equal if they are, in fact, the same object. As we are trying to emulate\n * the original behavior as close as possible, this will lead to unforeseen\n * side effects.\n *\n * In order to have a key equality based on value semantics, we'll convert\n * `InkListItem` to a valid string representation and use this representation\n * as a key (strings are value types in Javascript). Rather than using the\n * type `string` directly, we'll alias it to `SerializedInkListItem` and use\n * this type as the key for our Map-based `InkList`.\n *\n * Reducing `InkListItem` to a JSON representation would not be bulletproof\n * in the general case, but for our needs it works well. The major downside of\n * this method is that we will have to to reconstruct the original `InkListItem`\n * every time we'll need to access its properties.\n */\nexport type SerializedInkListItem = string;\n\n/**\n * An interface inherited by `InkListItem`, defining exposed\n * properties. It's mainly used when deserializing a `InkListItem` from its\n * key (`SerializedInkListItem`)\n */\ninterface IInkListItem {\n readonly originName: string | null;\n readonly itemName: string | null;\n}\nexport interface KeyValuePair<K, V> {\n Key: K;\n Value: V;\n}\n","export class StoryException extends Error {\n public useEndLineNumber: boolean;\n public message: string;\n public name: string;\n\n constructor(message: string) {\n super(message);\n this.useEndLineNumber = false;\n this.message = message;\n this.name = \"StoryException\";\n }\n}\n","/**\n * This interface normalize the `TryGet` behavior found in the original\n * C# project. Any `TryGet` method will return a object conforming to this\n * interface.\n *\n * The original function returns a boolean and has a second parameter called\n * item that is an `out`. Both are needed and we can't just return the item\n * because it'll always be truthy. Instead, we return an object containing\n * whether the result exists (`exists`) and the result itself (`result`).\n *\n * For instance a `TryGet` prototype would look like this:\n```\nTryGetItemWithValue(val: number, item: InkListItem): TryGetResult<InkListItem>{\n```\n *\n * On the other hand, dealing with the result can be done in the following way:\n```\nvar item = item.TryGetItemWithValue(intVal, InkListItem.Null);\nif (item.exists) {\n\tconsole.log(item.result)\n}\n```\n *\n */\nexport interface TryGetResult<T> {\n result: T;\n exists: boolean;\n}\n\nexport function tryGetValueFromMap<K, V>(\n map: Map<K, V> | null,\n key: K,\n /* out */ value: V\n): TryGetResult<V> {\n if (map === null) {\n return { result: value, exists: false };\n }\n\n let val = map.get(key);\n\n if (typeof val === \"undefined\") {\n return { result: value, exists: false };\n } else {\n return { result: val, exists: true };\n }\n}\n\nexport function tryParseInt(\n value: any,\n /* out */ defaultValue: number = 0\n): TryGetResult<number> {\n let val = parseInt(value);\n\n if (!Number.isNaN(val)) {\n return { result: val, exists: true };\n } else {\n return { result: defaultValue, exists: false };\n }\n}\n\nexport function tryParseFloat(\n value: any,\n /* out */ defaultValue: number = 0\n): TryGetResult<number> {\n let val = parseFloat(value);\n\n if (!Number.isNaN(val)) {\n return { result: val, exists: true };\n } else {\n return { result: defaultValue, exists: false };\n }\n}\n","import { InkObject } from \"./Object\";\nimport { Path } from \"./Path\";\nimport { InkList, InkListItem } from \"./InkList\";\nimport { StoryException } from \"./StoryException\";\nimport { asOrNull, asOrThrows } from \"./TypeAssertion\";\nimport { tryParseInt, tryParseFloat } from \"./TryGetResult\";\nimport { throwNullException } from \"./NullException\";\n\nexport abstract class AbstractValue extends InkObject {\n public abstract get valueType(): ValueType;\n public abstract get isTruthy(): boolean;\n public abstract get valueObject(): any;\n\n public abstract Cast(newType: ValueType): Value<any>;\n\n public static Create(\n val: any,\n preferredNumberType?: ValueType\n ): Value<any> | null {\n // This code doesn't exist in upstream and is simply here to enforce\n // the creation of the proper number value.\n // If `preferredNumberType` is not provided or if value doesn't match\n // `preferredNumberType`, this conditional does nothing.\n if (preferredNumberType) {\n if (\n preferredNumberType === (ValueType.Int as ValueType) &&\n Number.isInteger(Number(val))\n ) {\n return new IntValue(Number(val));\n } else if (\n preferredNumberType === (ValueType.Float as ValueType) &&\n !isNaN(val)\n ) {\n return new FloatValue(Number(val));\n }\n }\n\n if (typeof val === \"boolean\") {\n return new BoolValue(Boolean(val));\n }\n\n // https://github.com/y-lohse/inkjs/issues/425\n // Changed condition sequence, because Number('') is\n // parsed to 0, which made setting string to empty\n // impossible\n if (typeof val === \"string\") {\n return new StringValue(String(val));\n } else if (Number.isInteger(Number(val))) {\n return new IntValue(Number(val));\n } else if (!isNaN(val)) {\n return new FloatValue(Number(val));\n } else if (val instanceof Path) {\n return new DivertTargetValue(asOrThrows(val, Path));\n } else if (val instanceof InkList) {\n return new ListValue(asOrThrows(val, InkList));\n }\n\n return null;\n }\n public Copy() {\n return asOrThrows(AbstractValue.Create(this.valueObject), InkObject);\n }\n public BadCastException(targetType: ValueType) {\n return new StoryException(\n \"Can't cast \" +\n this.valueObject +\n \" from \" +\n this.valueType +\n \" to \" +\n targetType\n );\n }\n}\n\nexport abstract class Value<\n T extends { toString: () => string }\n> extends AbstractValue {\n public value: T | null;\n\n constructor(val: T | null) {\n super();\n this.value = val;\n }\n public get valueObject() {\n return this.value;\n }\n public toString() {\n if (this.value === null) return throwNullException(\"Value.value\");\n return this.value.toString();\n }\n}\n\nexport class BoolValue extends Value<boolean> {\n constructor(val: boolean) {\n super(val || false);\n }\n public get isTruthy() {\n return Boolean(this.value);\n }\n public get valueType() {\n return ValueType.Bool;\n }\n\n public Cast(newType: ValueType): Value<any> {\n if (this.value === null) return throwNullException(\"Value.value\");\n\n if (newType == this.valueType) {\n return this;\n }\n\n if (newType == ValueType.Int) {\n return new IntValue(this.value ? 1 : 0);\n }\n\n if (newType == ValueType.Float) {\n return new FloatValue(this.value ? 1.0 : 0.0);\n }\n\n if (newType == ValueType.String) {\n return new StringValue(this.value ? \"true\" : \"false\");\n }\n\n throw this.BadCastException(newType);\n }\n\n public toString() {\n return this.value ? \"true\" : \"false\";\n }\n}\n\nexport class IntValue extends Value<number> {\n constructor(val: number) {\n super(val || 0);\n }\n public get isTruthy() {\n return this.value != 0;\n }\n public get valueType() {\n return ValueType.Int;\n }\n\n public Cast(newType: ValueType): Value<any> {\n if (this.value === null) return throwNullException(\"Value.value\");\n\n if (newType == this.valueType) {\n return this;\n }\n\n if (newType == ValueType.Bool) {\n return new BoolValue(this.value === 0 ? false : true);\n }\n\n if (newType == ValueType.Float) {\n return new FloatValue(this.value);\n }\n\n if (newType == ValueType.String) {\n return new StringValue(\"\" + this.value);\n }\n\n throw this.BadCastException(newType);\n }\n}\n\nexport class FloatValue extends Value<number> {\n constructor(val: number) {\n super(val || 0.0);\n }\n public get isTruthy() {\n return this.value != 0.0;\n }\n public get valueType() {\n return ValueType.Float;\n }\n\n public Cast(newType: ValueType): Value<any> {\n if (this.value === null) return throwNullException(\"Value.value\");\n\n if (newType == this.valueType) {\n return this;\n }\n\n if (newType == ValueType.Bool) {\n return new BoolValue(this.value === 0.0 ? false : true);\n }\n\n if (newType == ValueType.Int) {\n return new IntValue(this.value);\n }\n\n if (newType == ValueType.String) {\n return new StringValue(\"\" + this.value);\n }\n\n throw this.BadCastException(newType);\n }\n}\n\nexport class StringValue extends Value<string> {\n public _isNewline: boolean;\n public _isInlineWhitespace: boolean;\n\n constructor(val: string) {\n super(val || \"\");\n\n this._isNewline = this.value == \"\\n\";\n this._isInlineWhitespace = true;\n\n if (this.value === null) return throwNullException(\"Value.value\");\n\n if (this.value.length > 0) {\n this.value.split(\"\").every((c) => {\n if (c != \" \" && c != \"\\t\") {\n this._isInlineWhitespace = false;\n return false;\n }\n\n return true;\n });\n }\n }\n public get valueType() {\n return ValueType.String;\n }\n public get isTruthy() {\n if (this.value === null) return throwNullException(\"Value.value\");\n return this.value.length > 0;\n }\n public get isNewline() {\n return this._isNewline;\n }\n public get isInlineWhitespace() {\n return this._isInlineWhitespace;\n }\n public get isNonWhitespace() {\n return !this.isNewline && !this.isInlineWhitespace;\n }\n\n public Cast(newType: ValueType): Value<any> {\n if (newType == this.valueType) {\n return this;\n }\n\n if (newType == ValueType.Int) {\n let parsedInt = tryParseInt(this.value);\n if (parsedInt.exists) {\n return new IntValue(parsedInt.result);\n } else {\n throw this.BadCastException(newType);\n }\n }\n\n if (newType == ValueType.Float) {\n let parsedFloat = tryParseFloat(this.value);\n if (parsedFloat.exists) {\n return new FloatValue(parsedFloat.result);\n } else {\n throw this.BadCastException(newType);\n }\n }\n\n throw this.BadCastException(newType);\n }\n}\n\nexport class DivertTargetValue extends Value<Path> {\n constructor(targetPath: Path | null = null) {\n super(targetPath);\n }\n public get valueType() {\n return ValueType.DivertTarget;\n }\n public get targetPath() {\n if (this.value === null) return throwNullException(\"Value.value\");\n return this.value;\n }\n public set targetPath(value: Path) {\n this.value = value;\n }\n public get isTruthy(): never {\n throw new Error(\"Shouldn't be checking the truthiness of a divert target\");\n }\n\n public Cast(newType: ValueType): Value<any> {\n if (newType == this.valueType) return this;\n\n throw this.BadCastException(newType);\n }\n public toString() {\n return \"DivertTargetValue(\" + this.targetPath + \")\";\n }\n}\n\nexport class VariablePointerValue extends Value<string> {\n public _contextIndex: number;\n\n constructor(variableName: string, contextIndex: number = -1) {\n super(variableName);\n\n this._contextIndex = contextIndex;\n }\n\n public get contextIndex() {\n return this._contextIndex;\n }\n public set contextIndex(value: number) {\n this._contextIndex = value;\n }\n public get variableName() {\n if (this.value === null) return throwNullException(\"Value.value\");\n return this.value;\n }\n public set variableName(value: string) {\n this.value = value;\n }\n public get valueType() {\n return ValueType.VariablePointer;\n }\n\n public get isTruthy(): never {\n throw new Error(\n \"Shouldn't be checking the truthiness of a variable pointer\"\n );\n }\n\n public Cast(newType: ValueType): Value<any> {\n if (newType == this.valueType) return this;\n\n throw this.BadCastException(newType);\n }\n public toString() {\n return \"VariablePointerValue(\" + this.variableName + \")\";\n }\n public Copy() {\n return new VariablePointerValue(this.variableName, this.contextIndex);\n }\n}\n\nexport class ListValue extends Value<InkList> {\n public get isTruthy() {\n if (this.value === null) {\n return throwNullException(\"this.value\");\n }\n return this.value.Count > 0;\n }\n public get valueType() {\n return ValueType.List;\n }\n public Cast(newType: ValueType): Value<any> {\n if (this.value === null) return throwNullException(\"Value.value\");\n\n if (newType == ValueType.Int) {\n let max = this.value.maxItem;\n if (max.Key.isNull) return new IntValue(0);\n else return new IntValue(max.Value);\n } else if (newType == ValueType.Float) {\n let max = this.value.maxItem;\n if (max.Key.isNull) return new FloatValue(0.0);\n else return new FloatValue(max.Value);\n } else if (newType == ValueType.String) {\n let max = this.value.maxItem;\n if (max.Key.isNull) return new StringValue(\"\");\n else {\n return new StringValue(max.Key.toString());\n }\n }\n\n if (newType == this.valueType) return this;\n\n throw this.BadCastException(newType);\n }\n constructor();\n constructor(list: InkList);\n constructor(listOrSingleItem: InkListItem, singleValue: number);\n constructor(listOrSingleItem?: InkListItem | InkList, singleValue?: number) {\n super(null);\n\n if (!listOrSingleItem && !singleValue) {\n this.value = new InkList();\n } else if (listOrSingleItem instanceof InkList) {\n this.value = new InkList(listOrSingleItem);\n } else if (\n listOrSingleItem instanceof InkListItem &&\n typeof singleValue === \"number\"\n ) {\n this.value = new InkList({\n Key: listOrSingleItem,\n Value: singleValue,\n });\n }\n }\n public static RetainListOriginsForAssignment(\n oldValue: InkObject | null,\n newValue: InkObject\n ) {\n let oldList = asOrNull(oldValue, ListValue);\n let newList = asOrNull(newValue, ListValue);\n\n if (newList && newList.value === null)\n return throwNullException(\"newList.value\");\n if (oldList && oldList.value === null)\n return throwNullException(\"oldList.value\");\n\n // When assigning the empty list, try to retain any initial origin names\n if (oldList && newList && newList.value!.Count == 0)\n newList.value!.SetInitialOriginNames(oldList.value!.originNames);\n }\n}\n\nexport enum ValueType {\n Bool = -1,\n Int = 0,\n Float = 1,\n List = 2,\n String = 3,\n DivertTarget = 4,\n VariablePointer = 5,\n}\n","import { InkObject } from \"./Object\";\nimport { Container } from \"./Container\";\n\nexport class SearchResult {\n public obj: InkObject | null = null;\n public approximate: boolean = false;\n\n get correctObj() {\n return this.approximate ? null : this.obj;\n }\n\n get container() {\n return this.obj instanceof Container ? this.obj : null;\n }\n\n public copy() {\n let searchResult = new SearchResult();\n searchResult.obj = this.obj;\n searchResult.approximate = this.approximate;\n\n return searchResult;\n }\n}\n","import { StringValue } from \"./Value\";\nimport { throwNullException } from \"./NullException\";\nimport { StringBuilder } from \"./StringBuilder\";\nimport { INamedContent } from \"./INamedContent\";\nimport { InkObject } from \"./Object\";\nimport { SearchResult } from \"./SearchResult\";\nimport { Path } from \"./Path\";\nimport { Debug } from \"./Debug\";\nimport { tryGetValueFromMap } from \"./TryGetResult\";\nimport { asINamedContentOrNull, asOrNull, asOrThrows } from \"./TypeAssertion\";\n\nexport class Container extends InkObject implements INamedContent {\n public name: string | null = null;\n\n public _content: InkObject[] = [];\n public namedContent: Map<string, INamedContent> = new Map();\n\n public visitsShouldBeCounted: boolean = false;\n public turnIndexShouldBeCounted: boolean = false;\n public countingAtStartOnly: boolean = false;\n\n public _pathToFirstLeafContent: Path | null = null;\n\n get hasValidName() {\n return this.name != null && this.name.length > 0;\n }\n get content() {\n return this._content;\n }\n set content(value: InkObject[]) {\n this.AddContent(value);\n }\n get namedOnlyContent() {\n let namedOnlyContentDict: Map<string, InkObject> | null = new Map();\n\n for (let [key, value] of this.namedContent) {\n let inkObject = asOrThrows(value, InkObject);\n namedOnlyContentDict.set(key, inkObject);\n }\n\n for (let c of this.content) {\n let named = asINamedContentOrNull(c);\n if (named != null && named.hasValidName) {\n namedOnlyContentDict.delete(named.name!);\n }\n }\n\n if (namedOnlyContentDict.size == 0) namedOnlyContentDict = null;\n\n return namedOnlyContentDict;\n }\n set namedOnlyContent(value: Map<string, InkObject> | null) {\n let existingNamedOnly = this.namedOnlyContent;\n if (existingNamedOnly != null) {\n for (let [key] of existingNamedOnly) {\n this.namedContent.delete(key);\n }\n }\n\n if (value == null) return;\n\n for (let [, val] of value) {\n let named = asINamedContentOrNull(val);\n if (named != null) this.AddToNamedContentOnly(named);\n }\n }\n get countFlags(): number {\n let flags: Container.CountFlags = 0;\n if (this.visitsShouldBeCounted) flags |= Container.CountFlags.Visits;\n if (this.turnIndexShouldBeCounted) flags |= Container.CountFlags.Turns;\n if (this.countingAtStartOnly) flags |= Container.CountFlags.CountStartOnly;\n\n if (flags == Container.CountFlags.CountStartOnly) {\n flags = 0;\n }\n\n return flags;\n }\n set countFlags(value: number) {\n let flag: Container.CountFlags = value;\n if ((flag & Container.CountFlags.Visits) > 0)\n this.visitsShouldBeCounted = true;\n if ((flag & Container.CountFlags.Turns) > 0)\n this.turnIndexShouldBeCounted = true;\n if ((flag & Container.CountFlags.CountStartOnly) > 0)\n this.countingAtStartOnly = true;\n }\n get pathToFirstLeafContent() {\n if (this._pathToFirstLeafContent == null)\n this._pathToFirstLeafContent = this.path.PathByAppendingPath(\n this.internalPathToFirstLeafContent\n );\n\n return this._pathToFirstLeafContent;\n }\n get internalPathToFirstLeafContent() {\n let components: Path.Component[] = [];\n let container: Container = this;\n while (container instanceof Container) {\n if (container.content.length > 0) {\n components.push(new Path.Component(0));\n container = container.content[0] as Container;\n }\n }\n return new Path(components);\n }\n\n public AddContent(contentObjOrList: InkObject | InkObject[]) {\n if (contentObjOrList instanceof Array) {\n let contentList = contentObjOrList as InkObject[];\n\n for (let c of contentList) {\n this.AddContent(c);\n }\n } else {\n let contentObj = contentObjOrList as InkObject;\n\n this._content.push(contentObj);\n\n if (contentObj.parent) {\n throw new Error(\"content is already in \" + contentObj.parent);\n }\n\n contentObj.parent = this;\n\n this.TryAddNamedContent(contentObj);\n }\n }\n public TryAddNamedContent(contentObj: InkObject) {\n let namedContentObj = asINamedContentOrNull(contentObj);\n if (namedContentObj != null && namedContentObj.hasValidName) {\n this.AddToNamedContentOnly(namedContentObj);\n }\n }\n public AddToNamedContentOnly(namedContentObj: INamedContent) {\n Debug.AssertType(\n namedContentObj,\n InkObject,\n \"Can only add Runtime.Objects to a Runtime.Container\"\n );\n let runtimeObj = asOrThrows(namedContentObj, InkObject);\n runtimeObj.parent = this;\n\n if (namedContentObj.name === null)\n return throwNullException(\"namedContentObj.name\");\n this.namedContent.set(namedContentObj.name!, namedContentObj);\n }\n public ContentAtPath(\n path: Path,\n partialPathStart: number = 0,\n partialPathLength: number = -1\n ) {\n if (partialPathLength == -1) partialPathLength = path.length;\n\n let result = new SearchResult();\n result.approximate = false;\n\n let currentContainer: Container | null = this;\n let currentObj: InkObject = this;\n\n for (let i = partialPathStart; i < partialPathLength; ++i) {\n let comp = path.GetComponent(i);\n if (currentContainer == null) {\n result.approximate = true;\n break;\n }\n\n let foundObj: InkObject | null =\n currentContainer.ContentWithPathComponent(comp);\n\n if (foundObj == null) {\n result.approximate = true;\n break;\n }\n\n currentObj = foundObj;\n currentContainer = asOrNull(foundObj, Container);\n }\n\n result.obj = currentObj;\n\n return result;\n }\n public InsertContent(contentObj: InkObject, index: number) {\n this.content.splice(index, 0, contentObj);\n\n if (contentObj.parent) {\n throw new Error(\"content is already in \" + contentObj.parent);\n }\n\n contentObj.parent = this;\n\n this.TryAddNamedContent(contentObj);\n }\n public AddContentsOfContainer(otherContainer: Container) {\n this.content.push(...otherContainer.content);\n\n for (let obj of otherContainer.content) {\n obj.parent = this;\n this.TryAddNamedContent(obj);\n }\n }\n public ContentWithPathComponent(component: Path.Component): InkObject | null {\n if (component.isIndex) {\n if (component.index >= 0 && component.index < this.content.length) {\n return this.content[component.index];\n } else {\n return null;\n }\n } else if (component.isParent) {\n return this.parent;\n } else {\n if (component.name === null) {\n return throwNullException(\"component.name\");\n }\n let foundContent = tryGetValueFromMap(\n this.namedContent,\n component.name,\n null\n );\n if (foundContent.exists) {\n return asOrThrows(foundContent.result, InkObject);\n } else {\n return null;\n }\n }\n }\n public BuildStringOfHierarchy(): string;\n public BuildStringOfHierarchy(\n sb: StringBuilder,\n indentation: number,\n pointedObj: InkObject | null\n ): string;\n public BuildStringOfHierarchy() {\n let sb: StringBuilder;\n if (arguments.length == 0) {\n sb = new StringBuilder();\n this.BuildStringOfHierarchy(sb, 0, null);\n return sb.toString();\n }\n\n sb = arguments[0] as StringBuilder;\n let indentation = arguments[1] as number;\n let pointedObj = arguments[2] as InkObject | null;\n\n function appendIndentation() {\n const spacesPerIndent = 4; // Truly const in the original code\n for (let i = 0; i < spacesPerIndent * indentation; ++i) {\n sb.Append(\" \");\n }\n }\n\n appendIndentation();\n sb.Append(\"[\");\n\n if (this.hasValidName) {\n sb.AppendFormat(\" ({0})\", this.name);\n }\n\n if (this == pointedObj) {\n sb.Append(\" <---\");\n }\n\n sb.AppendLine();\n\n indentation++;\n\n for (let i = 0; i < this.content.length; ++i) {\n let obj = this.content[i];\n\n if (obj instanceof Container) {\n let container = obj as Container;\n\n container.BuildStringOfHierarchy(sb, indentation, pointedObj);\n } else {\n appendIndentation();\n if (obj instanceof StringValue) {\n sb.Append('\"');\n sb.Append(obj.toString().replace(\"\\n\", \"\\\\n\"));\n sb.Append('\"');\n } else {\n sb.Append(obj.toString());\n }\n }\n\n if (i != this.content.length - 1) {\n sb.Append(\",\");\n }\n\n if (!(obj instanceof Container) && obj == pointedObj) {\n sb.Append(\" <---\");\n }\n\n sb.AppendLine();\n }\n\n let onlyNamed: Map<string, INamedContent> = new Map();\n\n for (let [key, value] of this.namedContent) {\n if (this.content.indexOf(asOrThrows(value, InkObject)) >= 0) {\n continue;\n } else {\n onlyNamed.set(key, value);\n }\n }\n\n if (onlyNamed.size > 0) {\n appendIndentation();\n sb.AppendLine(\"-- named: --\");\n\n for (let [, value] of onlyNamed) {\n Debug.AssertType(\n value,\n Container,\n \"Can only print out named Containers\"\n );\n let container = value as Container;\n container.BuildStringOfHierarchy(sb, indentation, pointedObj);\n sb.AppendLine();\n }\n }\n\n indentation--;\n\n appendIndentation();\n sb.Append(\"]\");\n }\n}\n\nexport namespace Container {\n export enum CountFlags {\n Visits = 1,\n Turns = 2,\n CountStartOnly = 4,\n }\n}\n","import { InkObject } from \"./Object\";\n\nexport class ControlCommand extends InkObject {\n private _commandType: ControlCommand.CommandType;\n\n get commandType(): ControlCommand.CommandType {\n return this._commandType;\n }\n\n constructor(\n commandType: ControlCommand.CommandType = ControlCommand.CommandType.NotSet\n ) {\n super();\n this._commandType = commandType;\n }\n\n public Copy() {\n return new ControlCommand(this.commandType);\n }\n public static EvalStart() {\n return new ControlCommand(ControlCommand.CommandType.EvalStart);\n }\n public static EvalOutput() {\n return new ControlCommand(ControlCommand.CommandType.EvalOutput);\n }\n public static EvalEnd() {\n return new ControlCommand(ControlCommand.CommandType.EvalEnd);\n }\n public static Duplicate() {\n return new ControlCommand(ControlCommand.CommandType.Duplicate);\n }\n public static PopEvaluatedValue() {\n return new ControlCommand(ControlCommand.CommandType.PopEvaluatedValue);\n }\n public static PopFunction() {\n return new ControlCommand(ControlCommand.CommandType.PopFunction);\n }\n public static PopTunnel() {\n return new ControlCommand(ControlCommand.CommandType.PopTunnel);\n }\n public static BeginString() {\n return new ControlCommand(ControlCommand.CommandType.BeginString);\n }\n public static EndString() {\n return new ControlCommand(ControlCommand.CommandType.EndString);\n }\n public static NoOp() {\n return new ControlCommand(ControlCommand.CommandType.NoOp);\n }\n public static ChoiceCount() {\n return new ControlCommand(ControlCommand.CommandType.ChoiceCount);\n }\n public static Turns() {\n return new ControlCommand(ControlCommand.CommandType.Turns);\n }\n public static TurnsSince() {\n return new ControlCommand(ControlCommand.CommandType.TurnsSince);\n }\n public static ReadCount() {\n return new ControlCommand(ControlCommand.CommandType.ReadCount);\n }\n public static Random() {\n return new ControlCommand(ControlCommand.CommandType.Random);\n }\n public static SeedRandom() {\n return new ControlCommand(ControlCommand.CommandType.SeedRandom);\n }\n public static VisitIndex() {\n return new ControlCommand(ControlCommand.CommandType.VisitIndex);\n }\n public static SequenceShuffleIndex() {\n return new ControlCommand(ControlCommand.CommandType.SequenceShuffleIndex);\n }\n public static StartThread() {\n return new ControlCommand(ControlCommand.CommandType.StartThread);\n }\n public static Done() {\n return new ControlCommand(ControlCommand.CommandType.Done);\n }\n public static End() {\n return new ControlCommand(ControlCommand.CommandType.End);\n }\n public static ListFromInt() {\n return new ControlCommand(ControlCommand.CommandType.ListFromInt);\n }\n public static ListRange() {\n return new ControlCommand(ControlCommand.CommandType.ListRange);\n }\n public static ListRandom() {\n return new ControlCommand(ControlCommand.CommandType.ListRandom);\n }\n public static BeginTag() {\n return new ControlCommand(ControlCommand.CommandType.BeginTag);\n }\n public static EndTag() {\n return new ControlCommand(ControlCommand.CommandType.EndTag);\n }\n public toString() {\n return this.commandType.toString();\n }\n}\n\nexport namespace ControlCommand {\n export enum CommandType {\n NotSet = -1,\n EvalStart, // 0\n EvalOutput, // 1\n EvalEnd, // 2\n Duplicate, // 3\n PopEvaluatedValue, // 4\n PopFunction, // 5\n PopTunnel, // 6\n BeginString, // 7\n EndString, // 8\n NoOp, // 9\n ChoiceCount, // 10\n Turns, // 11\n TurnsSince, // 12\n ReadCount, // 13\n Random, // 14\n SeedRandom, // 15\n VisitIndex, // 16\n SequenceShuffleIndex, // 17\n StartThread, // 18\n Done, // 19\n End, // 20\n ListFromInt, // 21\n ListRange, // 22\n ListRandom, // 23\n BeginTag, // 24\n EndTag, // 25\n\n TOTAL_VALUES,\n }\n}\n","import { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { ControlCommand as RuntimeControlCommand } from \"../../../../engine/ControlCommand\";\nimport { ParsedObject } from \"../Object\";\nimport { InkObject as RuntimeObject } from \"../../../../engine/Object\";\n\nexport abstract class Expression extends ParsedObject {\n public abstract GenerateIntoContainer: (container: RuntimeContainer) => void;\n\n private _prototypeRuntimeConstantExpression: RuntimeContainer | null = null;\n public outputWhenComplete: boolean = false;\n\n public readonly GenerateRuntimeObject = (): RuntimeObject => {\n const container = new RuntimeContainer();\n\n // Tell Runtime to start evaluating the following content as an expression\n container.AddContent(RuntimeControlCommand.EvalStart());\n\n this.GenerateIntoContainer(container);\n\n // Tell Runtime to output the result of the expression evaluation to the output stream\n if (this.outputWhenComplete) {\n container.AddContent(RuntimeControlCommand.EvalOutput());\n }\n\n // Tell Runtime to stop evaluating the content as an expression\n container.AddContent(RuntimeControlCommand.EvalEnd());\n\n return container;\n };\n\n // When generating the value of a constant expression,\n // we can't just keep generating the same constant expression into\n // different places where the constant value is referenced, since then\n // the same runtime objects would be used in multiple places, which\n // is impossible since each runtime object should have one parent.\n // Instead, we generate a prototype of the runtime object(s), then\n // copy them each time they're used.\n public readonly GenerateConstantIntoContainer = (\n container: RuntimeContainer\n ): void => {\n if (this._prototypeRuntimeConstantExpression === null) {\n this._prototypeRuntimeConstantExpression = new RuntimeContainer();\n this.GenerateIntoContainer(this._prototypeRuntimeConstantExpression);\n }\n\n for (const runtimeObj of this._prototypeRuntimeConstantExpression.content) {\n const copy = runtimeObj.Copy();\n if (copy) {\n container.AddContent(copy);\n }\n }\n };\n\n get typeName(): string {\n return \"Expression\";\n }\n\n public Equals(obj: ParsedObject): boolean {\n return false;\n }\n\n public readonly toString = () => \"No string value in JavaScript.\";\n}\n","import { InkObject } from \"./Object\";\n\nexport class Void extends InkObject {}\n","import { Value, ValueType, IntValue, ListValue, BoolValue } from \"./Value\";\nimport { StoryException } from \"./StoryException\";\nimport { Void } from \"./Void\";\nimport { Path } from \"./Path\";\nimport { InkList, InkListItem } from \"./InkList\";\nimport { InkObject } from \"./Object\";\nimport { asOrNull, asOrThrows, asBooleanOrThrows } from \"./TypeAssertion\";\nimport { throwNullException } from \"./NullException\";\n\ntype BinaryOp<T> = (left: T, right: T) => any;\ntype UnaryOp<T> = (val: T) => any;\n\nexport class NativeFunctionCall extends InkObject {\n public static readonly Add: string = \"+\";\n public static readonly Subtract: string = \"-\";\n public static readonly Divide: string = \"/\";\n public static readonly Multiply: string = \"*\";\n public static readonly Mod: string = \"%\";\n public static readonly Negate: string = \"_\";\n public static readonly Equal: string = \"==\";\n public static readonly Greater: string = \">\";\n public static readonly Less: string = \"<\";\n public static readonly GreaterThanOrEquals: string = \">=\";\n public static readonly LessThanOrEquals: string = \"<=\";\n public static readonly NotEquals: string = \"!=\";\n public static readonly Not: string = \"!\";\n public static readonly And: string = \"&&\";\n public static readonly Or: string = \"||\";\n public static readonly Min: string = \"MIN\";\n public static readonly Max: string = \"MAX\";\n public static readonly Pow: string = \"POW\";\n public static readonly Floor: string = \"FLOOR\";\n public static readonly Ceiling: string = \"CEILING\";\n public static readonly Int: string = \"INT\";\n public static readonly Float: string = \"FLOAT\";\n public static readonly Has: string = \"?\";\n public static readonly Hasnt: string = \"!?\";\n public static readonly Intersect: string = \"^\";\n public static readonly ListMin: string = \"LIST_MIN\";\n public static readonly ListMax: string = \"LIST_MAX\";\n public static readonly All: string = \"LIST_ALL\";\n public static readonly Count: string = \"LIST_COUNT\";\n public static readonly ValueOfList: string = \"LIST_VALUE\";\n public static readonly Invert: string = \"LIST_INVERT\";\n\n public static CallWithName(functionName: string) {\n return new NativeFunctionCall(functionName);\n }\n\n public static CallExistsWithName(functionName: string) {\n this.GenerateNativeFunctionsIfNecessary();\n return this._nativeFunctions!.get(functionName);\n }\n\n get name() {\n if (this._name === null)\n return throwNullException(\"NativeFunctionCall._name\");\n return this._name;\n }\n set name(value: string) {\n this._name = value;\n if (!this._isPrototype) {\n if (NativeFunctionCall._nativeFunctions === null)\n throwNullException(\"NativeFunctionCall._nativeFunctions\");\n else\n this._prototype =\n NativeFunctionCall._nativeFunctions.get(this._name) || null;\n }\n }\n public _name: string | null = null;\n\n get numberOfParameters() {\n if (this._prototype) {\n return this._prototype.numberOfParameters;\n } else {\n return this._numberOfParameters;\n }\n }\n set numberOfParameters(value: number) {\n this._numberOfParameters = value;\n }\n public _numberOfParameters: number = 0;\n\n public Call(parameters: InkObject[]): InkObject | null {\n if (this._prototype) {\n return this._prototype.Call(parameters);\n }\n\n if (this.numberOfParameters != parameters.length) {\n throw new Error(\"Unexpected number of parameters\");\n }\n\n let hasList = false;\n for (let p of parameters) {\n if (p instanceof Void)\n throw new StoryException(\n 'Attempting to perform operation on a void value. Did you forget to \"return\" a value from a function you called here?'\n );\n if (p instanceof ListValue) hasList = true;\n }\n\n if (parameters.length == 2 && hasList) {\n return this.CallBinaryListOperation(parameters);\n }\n\n let coercedParams = this.CoerceValuesToSingleType(parameters);\n let coercedType = coercedParams[0].valueType;\n\n if (coercedType == ValueType.Int) {\n return this.CallType<number>(coercedParams);\n } else if (coercedType == ValueType.Float) {\n return this.CallType<number>(coercedParams);\n } else if (coercedType == ValueType.String) {\n return this.CallType<string>(coercedParams);\n } else if (coercedType == ValueType.DivertTarget) {\n return this.CallType<Path>(coercedParams);\n } else if (coercedType == ValueType.List) {\n return this.CallType<InkList>(coercedParams);\n }\n\n return null;\n }\n\n public CallType<T>(parametersOfSingleType: Array<Value<T>>) {\n let param1 = asOrThrows(parametersOfSingleType[0], Value);\n let valType = param1.valueType;\n\n let val1 = param1 as Value<T>;\n\n let paramCount = parametersOfSingleType.length;\n\n if (paramCount == 2 || paramCount == 1) {\n if (this._operationFuncs === null)\n return throwNullException(\"NativeFunctionCall._operationFuncs\");\n let opForTypeObj = this._operationFuncs.get(valType);\n if (!opForTypeObj) {\n const key = ValueType[valType];\n throw new StoryException(\n \"Cannot perform operation \" + this.name + \" on \" + key\n );\n }\n\n if (paramCount == 2) {\n let param2 = asOrThrows(parametersOfSingleType[1], Value);\n\n let val2 = param2 as Value<T>;\n\n let opForType = opForTypeObj as BinaryOp<T>;\n\n if (val1.value === null || val2.value === null)\n return throwNullException(\"NativeFunctionCall.Call BinaryOp values\");\n let resultVal = opForType(val1.value, val2.value);\n\n return Value.Create(resultVal);\n } else {\n let opForType = opForTypeObj as UnaryOp<T>;\n\n if (val1.value === null)\n return throwNullException(\"NativeFunctionCall.Call UnaryOp value\");\n let resultVal = opForType(val1.value);\n\n // This code is different from upstream. Since JavaScript treats\n // integers and floats as the same numbers, it's impossible\n // to force an number to be either an integer or a float.\n //\n // It can be useful to force a specific number type\n // (especially for divisions), so the result of INT() & FLOAT()\n // is coerced to the the proper value type.\n //\n // Note that we also force all other unary operation to\n // return the same value type, although this is only\n // meaningful for numbers. See `Value.Create`.\n if (this.name === NativeFunctionCall.Int) {\n return Value.Create(resultVal, ValueType.Int);\n } else if (this.name === NativeFunctionCall.Float) {\n return Value.Create(resultVal, ValueType.Float);\n } else {\n return Value.Create(resultVal, param1.valueType);\n }\n }\n } else {\n throw new Error(\n \"Unexpected number of parameters to NativeFunctionCall: \" +\n parametersOfSingleType.length\n );\n }\n }\n\n public CallBinaryListOperation(parameters: InkObject[]) {\n if (\n (this.name == \"+\" || this.name == \"-\") &&\n parameters[0] instanceof ListValue &&\n parameters[1] instanceof IntValue\n )\n return this.CallListIncrementOperation(parameters);\n\n let v1 = asOrThrows(parameters[0], Value);\n let v2 = asOrThrows(parameters[1], Value);\n\n if (\n (this.name == \"&&\" || this.name == \"||\") &&\n (v1.valueType != ValueType.List || v2.valueType != ValueType.List)\n ) {\n if (this._operationFuncs === null)\n return throwNullException(\"NativeFunctionCall._operationFuncs\");\n let op = this._operationFuncs.get(ValueType.Int) as BinaryOp<number>;\n if (op === null)\n return throwNullException(\n \"NativeFunctionCall.CallBinaryListOperation op\"\n );\n let result = asBooleanOrThrows(\n op(v1.isTruthy ? 1 : 0, v2.isTruthy ? 1 : 0)\n );\n return new BoolValue(result);\n }\n\n if (v1.valueType == ValueType.List && v2.valueType == ValueType.List)\n return this.CallType<InkList>([v1, v2]);\n\n throw new StoryException(\n \"Can not call use \" +\n this.name +\n \" operation on \" +\n ValueType[v1.valueType] +\n \" and \" +\n ValueType[v2.valueType]\n );\n }\n\n public CallListIncrementOperation(listIntParams: InkObject[]) {\n let listVal = asOrThrows(listIntParams[0], ListValue);\n let intVal = asOrThrows(listIntParams[1], IntValue);\n\n let resultInkList = new InkList();\n\n if (listVal.value === null)\n return throwNullException(\n \"NativeFunctionCall.CallListIncrementOperation listVal.value\"\n );\n for (let [listItemKey, listItemValue] of listVal.value) {\n let listItem = InkListItem.fromSerializedKey(listItemKey);\n\n if (this._operationFuncs === null)\n return throwNullException(\"NativeFunctionCall._operationFuncs\");\n let intOp = this._operationFuncs.get(ValueType.Int) as BinaryOp<number>;\n\n if (intVal.value === null)\n return throwNullException(\n \"NativeFunctionCall.CallListIncrementOperation intVal.value\"\n );\n let targetInt = intOp(listItemValue, intVal.value);\n\n let itemOrigin = null;\n if (listVal.value.origins === null)\n return throwNullException(\n \"NativeFunctionCall.CallListIncrementOperation listVal.value.origins\"\n );\n for (let origin of listVal.value.origins) {\n if (origin.name == listItem.originName) {\n itemOrigin = origin;\n break;\n }\n }\n if (itemOrigin != null) {\n let incrementedItem = itemOrigin.TryGetItemWithValue(\n targetInt,\n InkListItem.Null\n );\n if (incrementedItem.exists)\n resultInkList.Add(incrementedItem.result, targetInt);\n }\n }\n\n return new ListValue(resultInkList);\n }\n\n public CoerceValuesToSingleType(parametersIn: InkObject[]) {\n let valType = ValueType.Int;\n\n let specialCaseList: null | ListValue = null;\n\n for (let obj of parametersIn) {\n let val = asOrThrows(obj, Value);\n if (val.valueType > valType) {\n valType = val.valueType;\n }\n\n if (val.valueType == ValueType.List) {\n specialCaseList = asOrNull(val, ListValue);\n }\n }\n\n let parametersOut = [];\n\n if (ValueType[valType] == ValueType[ValueType.List]) {\n for (let inkObjectVal of parametersIn) {\n let val = asOrThrows(inkObjectVal, Value);\n if (val.valueType == ValueType.List) {\n parametersOut.push(val);\n } else if (val.valueType == ValueType.Int) {\n let intVal = parseInt(val.valueObject);\n\n specialCaseList = asOrThrows(specialCaseList, ListValue);\n if (specialCaseList.value === null)\n return throwNullException(\n \"NativeFunctionCall.CoerceValuesToSingleType specialCaseList.value\"\n );\n let list = specialCaseList.value.originOfMaxItem;\n\n if (list === null)\n return throwNullException(\n \"NativeFunctionCall.CoerceValuesToSingleType list\"\n );\n let item = list.TryGetItemWithValue(intVal, InkListItem.Null);\n if (item.exists) {\n let castedValue = new ListValue(item.result, intVal);\n parametersOut.push(castedValue);\n } else\n throw new StoryException(\n \"Could not find List item with the value \" +\n intVal +\n \" in \" +\n list.name\n );\n } else {\n const key = ValueType[val.valueType];\n throw new StoryException(\n \"Cannot mix Lists and \" + key + \" values in this operation\"\n );\n }\n }\n } else {\n for (let inkObjectVal of parametersIn) {\n let val = asOrThrows(inkObjectVal, Value);\n let castedValue = val.Cast(valType);\n parametersOut.push(castedValue);\n }\n }\n\n return parametersOut;\n }\n\n constructor(name: string);\n constructor(name: string, numberOfParameters: number);\n constructor();\n constructor() {\n super();\n\n if (arguments.length === 0) {\n NativeFunctionCall.GenerateNativeFunctionsIfNecessary();\n } else if (arguments.length === 1) {\n let name = arguments[0];\n NativeFunctionCall.GenerateNativeFunctionsIfNecessary();\n this.name = name;\n } else if (arguments.length === 2) {\n let name = arguments[0];\n let numberOfParameters = arguments[1];\n\n this._isPrototype = true;\n this.name = name;\n this.numberOfParameters = numberOfParameters;\n }\n }\n\n public static Identity<T>(t: T): any {\n return t;\n }\n\n public static GenerateNativeFunctionsIfNecessary() {\n if (this._nativeFunctions == null) {\n this._nativeFunctions = new Map();\n\n // Int operations\n this.AddIntBinaryOp(this.Add, (x, y) => x + y);\n this.AddIntBinaryOp(this.Subtract, (x, y) => x - y);\n this.AddIntBinaryOp(this.Multiply, (x, y) => x * y);\n this.AddIntBinaryOp(this.Divide, (x, y) => Math.floor(x / y));\n this.AddIntBinaryOp(this.Mod, (x, y) => x % y);\n this.AddIntUnaryOp(this.Negate, (x) => -x);\n\n this.AddIntBinaryOp(this.Equal, (x, y) => x == y);\n this.AddIntBinaryOp(this.Greater, (x, y) => x > y);\n this.AddIntBinaryOp(this.Less, (x, y) => x < y);\n this.AddIntBinaryOp(this.GreaterThanOrEquals, (x, y) => x >= y);\n this.AddIntBinaryOp(this.LessThanOrEquals, (x, y) => x <= y);\n this.AddIntBinaryOp(this.NotEquals, (x, y) => x != y);\n this.AddIntUnaryOp(this.Not, (x) => x == 0);\n\n this.AddIntBinaryOp(this.And, (x, y) => x != 0 && y != 0);\n this.AddIntBinaryOp(this.Or, (x, y) => x != 0 || y != 0);\n\n this.AddIntBinaryOp(this.Max, (x, y) => Math.max(x, y));\n this.AddIntBinaryOp(this.Min, (x, y) => Math.min(x, y));\n\n this.AddIntBinaryOp(this.Pow, (x, y) => Math.pow(x, y));\n this.AddIntUnaryOp(this.Floor, NativeFunctionCall.Identity);\n this.AddIntUnaryOp(this.Ceiling, NativeFunctionCall.Identity);\n this.AddIntUnaryOp(this.Int, NativeFunctionCall.Identity);\n this.AddIntUnaryOp(this.Float, (x) => x);\n\n // Float operations\n this.AddFloatBinaryOp(this.Add, (x, y) => x + y);\n this.AddFloatBinaryOp(this.Subtract, (x, y) => x - y);\n this.AddFloatBinaryOp(this.Multiply, (x, y) => x * y);\n this.AddFloatBinaryOp(this.Divide, (x, y) => x / y);\n this.AddFloatBinaryOp(this.Mod, (x, y) => x % y);\n this.AddFloatUnaryOp(this.Negate, (x) => -x);\n\n this.AddFloatBinaryOp(this.Equal, (x, y) => x == y);\n this.AddFloatBinaryOp(this.Greater, (x, y) => x > y);\n this.AddFloatBinaryOp(this.Less, (x, y) => x < y);\n this.AddFloatBinaryOp(this.GreaterThanOrEquals, (x, y) => x >= y);\n this.AddFloatBinaryOp(this.LessThanOrEquals, (x, y) => x <= y);\n this.AddFloatBinaryOp(this.NotEquals, (x, y) => x != y);\n this.AddFloatUnaryOp(this.Not, (x) => x == 0.0);\n\n this.AddFloatBinaryOp(this.And, (x, y) => x != 0.0 && y != 0.0);\n this.AddFloatBinaryOp(this.Or, (x, y) => x != 0.0 || y != 0.0);\n\n this.AddFloatBinaryOp(this.Max, (x, y) => Math.max(x, y));\n this.AddFloatBinaryOp(this.Min, (x, y) => Math.min(x, y));\n\n this.AddFloatBinaryOp(this.Pow, (x, y) => Math.pow(x, y));\n this.AddFloatUnaryOp(this.Floor, (x) => Math.floor(x));\n this.AddFloatUnaryOp(this.Ceiling, (x) => Math.ceil(x));\n this.AddFloatUnaryOp(this.Int, (x) => Math.floor(x));\n this.AddFloatUnaryOp(this.Float, NativeFunctionCall.Identity);\n\n // String operations\n this.AddStringBinaryOp(this.Add, (x, y) => x + y); // concat\n this.AddStringBinaryOp(this.Equal, (x, y) => x === y);\n this.AddStringBinaryOp(this.NotEquals, (x, y) => !(x === y));\n this.AddStringBinaryOp(this.Has, (x, y) => x.includes(y));\n this.AddStringBinaryOp(this.Hasnt, (x, y) => !x.includes(y));\n\n this.AddListBinaryOp(this.Add, (x, y) => x.Union(y));\n this.AddListBinaryOp(this.Subtract, (x, y) => x.Without(y));\n this.AddListBinaryOp(this.Has, (x, y) => x.Contains(y));\n this.AddListBinaryOp(this.Hasnt, (x, y) => !x.Contains(y));\n this.AddListBinaryOp(this.Intersect, (x, y) => x.Intersect(y));\n\n this.AddListBinaryOp(this.Equal, (x, y) => x.Equals(y));\n this.AddListBinaryOp(this.Greater, (x, y) => x.GreaterThan(y));\n this.AddListBinaryOp(this.Less, (x, y) => x.LessThan(y));\n this.AddListBinaryOp(this.GreaterThanOrEquals, (x, y) =>\n x.GreaterThanOrEquals(y)\n );\n this.AddListBinaryOp(this.LessThanOrEquals, (x, y) =>\n x.LessThanOrEquals(y)\n );\n this.AddListBinaryOp(this.NotEquals, (x, y) => !x.Equals(y));\n\n this.AddListBinaryOp(this.And, (x, y) => x.Count > 0 && y.Count > 0);\n this.AddListBinaryOp(this.Or, (x, y) => x.Count > 0 || y.Count > 0);\n\n this.AddListUnaryOp(this.Not, (x) => (x.Count == 0 ? 1 : 0));\n\n this.AddListUnaryOp(this.Invert, (x) => x.inverse);\n this.AddListUnaryOp(this.All, (x) => x.all);\n this.AddListUnaryOp(this.ListMin, (x) => x.MinAsList());\n this.AddListUnaryOp(this.ListMax, (x) => x.MaxAsList());\n this.AddListUnaryOp(this.Count, (x) => x.Count);\n this.AddListUnaryOp(this.ValueOfList, (x) => x.maxItem.Value);\n\n let divertTargetsEqual = (d1: Path, d2: Path) => d1.Equals(d2);\n let divertTargetsNotEqual = (d1: Path, d2: Path) => !d1.Equals(d2);\n this.AddOpToNativeFunc(\n this.Equal,\n 2,\n ValueType.DivertTarget,\n divertTargetsEqual\n );\n this.AddOpToNativeFunc(\n this.NotEquals,\n 2,\n ValueType.DivertTarget,\n divertTargetsNotEqual\n );\n }\n }\n\n public AddOpFuncForType(\n valType: ValueType,\n op: UnaryOp<number | InkList> | BinaryOp<number | string | InkList | Path>\n ): void {\n if (this._operationFuncs == null) {\n this._operationFuncs = new Map();\n }\n\n this._operationFuncs.set(valType, op);\n }\n\n public static AddOpToNativeFunc(\n name: string,\n args: number,\n valType: ValueType,\n op: UnaryOp<any> | BinaryOp<any>\n ): void {\n if (this._nativeFunctions === null)\n return throwNullException(\"NativeFunctionCall._nativeFunctions\");\n let nativeFunc = this._nativeFunctions.get(name);\n if (!nativeFunc) {\n nativeFunc = new NativeFunctionCall(name, args);\n this._nativeFunctions.set(name, nativeFunc);\n }\n\n nativeFunc.AddOpFuncForType(valType, op);\n }\n\n public static AddIntBinaryOp(name: string, op: BinaryOp<number>) {\n this.AddOpToNativeFunc(name, 2, ValueType.Int, op);\n }\n public static AddIntUnaryOp(name: string, op: UnaryOp<number>) {\n this.AddOpToNativeFunc(name, 1, ValueType.Int, op);\n }\n\n public static AddFloatBinaryOp(name: string, op: BinaryOp<number>) {\n this.AddOpToNativeFunc(name, 2, ValueType.Float, op);\n }\n public static AddFloatUnaryOp(name: string, op: UnaryOp<number>) {\n this.AddOpToNativeFunc(name, 1, ValueType.Float, op);\n }\n\n public static AddStringBinaryOp(name: string, op: BinaryOp<string>) {\n this.AddOpToNativeFunc(name, 2, ValueType.String, op);\n }\n\n public static AddListBinaryOp(name: string, op: BinaryOp<InkList>) {\n this.AddOpToNativeFunc(name, 2, ValueType.List, op);\n }\n public static AddListUnaryOp(name: string, op: UnaryOp<InkList>) {\n this.AddOpToNativeFunc(name, 1, ValueType.List, op);\n }\n\n public toString() {\n return 'Native \"' + this.name + '\"';\n }\n\n public _prototype: NativeFunctionCall | null = null;\n public _isPrototype: boolean = false;\n public _operationFuncs: Map<ValueType, BinaryOp<any> | UnaryOp<any>> | null =\n null;\n public static _nativeFunctions: Map<string, NativeFunctionCall> | null = null;\n}\n","import { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { Expression } from \"./Expression\";\nimport { BoolValue, FloatValue, IntValue } from \"../../../../engine/Value\";\nimport { asOrNull } from \"../../../../engine/TypeAssertion\";\nimport { ParsedObject } from \"../Object\";\n\n// This class is named Number in the C# codebase\n// but this conflict with the built-in Number class\nexport class NumberExpression extends Expression {\n public value: number | boolean;\n public subtype: \"int\" | \"float\" | \"bool\";\n\n constructor(value: number | boolean, subtype: \"int\" | \"float\" | \"bool\") {\n super();\n\n if (\n (typeof value === \"number\" && !Number.isNaN(value)) ||\n typeof value == \"boolean\"\n ) {\n this.value = value;\n this.subtype = subtype;\n } else {\n throw new Error(\"Unexpected object type in NumberExpression.\");\n }\n }\n\n get typeName(): string {\n return \"Number\";\n }\n\n public isInt = (): boolean => this.subtype == \"int\";\n\n public isFloat = (): boolean => this.subtype == \"float\";\n\n public isBool = (): boolean => this.subtype == \"bool\";\n\n public readonly GenerateIntoContainer = (\n container: RuntimeContainer\n ): void => {\n if (this.isInt()) {\n container.AddContent(new IntValue(this.value as number));\n } else if (this.isFloat()) {\n container.AddContent(new FloatValue(this.value as number));\n } else if (this.isBool()) {\n container.AddContent(new BoolValue(this.value as boolean));\n }\n };\n\n public readonly toString = (): string => String(this.value);\n\n public Equals(obj: ParsedObject): boolean {\n const numberExpression = asOrNull(obj, NumberExpression);\n if (!numberExpression) return false;\n\n return (\n numberExpression.subtype == this.subtype &&\n numberExpression.value == this.value\n );\n }\n}\n","import { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { Expression } from \"./Expression\";\nimport { NativeFunctionCall } from \"../../../../engine/NativeFunctionCall\";\nimport { NumberExpression } from \"./NumberExpression\";\nimport { asOrNull } from \"../../../../engine/TypeAssertion\";\n\nexport class UnaryExpression extends Expression {\n get nativeNameForOp(): string {\n // Replace \"-\" with \"_\" to make it unique (compared to subtraction)\n if (this.op === \"-\") {\n return \"_\";\n } else if (this.op === \"not\") {\n return \"!\";\n }\n\n return this.op;\n }\n\n public innerExpression: Expression;\n\n // Attempt to flatten inner expression immediately\n // e.g. convert (-(5)) into (-5)\n public static readonly WithInner = (\n inner: Expression,\n op: string\n ): Expression => {\n const innerNumber = asOrNull(inner, NumberExpression);\n\n if (innerNumber) {\n if (op === \"-\") {\n if (innerNumber.isInt()) {\n return new NumberExpression(-innerNumber.value, \"int\");\n } else if (innerNumber.isFloat()) {\n return new NumberExpression(-innerNumber.value, \"float\");\n }\n } else if (op == \"!\" || op == \"not\") {\n if (innerNumber.isInt()) {\n return new NumberExpression(innerNumber.value == 0, \"bool\");\n } else if (innerNumber.isFloat()) {\n return new NumberExpression(innerNumber.value == 0.0, \"bool\");\n } else if (innerNumber.isBool()) {\n return new NumberExpression(!innerNumber.value, \"bool\");\n }\n }\n\n throw new Error(\"Unexpected operation or number type\");\n }\n\n // Normal fallback\n const unary = new UnaryExpression(inner, op);\n\n return unary;\n };\n\n constructor(inner: Expression, public readonly op: string) {\n super();\n\n this.innerExpression = this.AddContent(inner) as Expression;\n }\n\n get typeName(): string {\n return \"UnaryExpression\";\n }\n\n public readonly GenerateIntoContainer = (container: RuntimeContainer) => {\n this.innerExpression.GenerateIntoContainer(container);\n container.AddContent(NativeFunctionCall.CallWithName(this.nativeNameForOp));\n };\n\n public readonly toString = (): string =>\n this.nativeNameForOp + this.innerExpression;\n}\n","import { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { Expression } from \"./Expression\";\nimport { NativeFunctionCall } from \"../../../../engine/NativeFunctionCall\";\nimport { Story } from \"../Story\";\nimport { UnaryExpression } from \"./UnaryExpression\";\nimport { asOrNull } from \"../../../../engine/TypeAssertion\";\n\nexport class BinaryExpression extends Expression {\n public readonly leftExpression: Expression;\n public readonly rightExpression: Expression;\n\n constructor(left: Expression, right: Expression, public opName: string) {\n super();\n\n this.leftExpression = this.AddContent(left) as Expression;\n this.rightExpression = this.AddContent(right) as Expression;\n\n this.opName = opName;\n }\n\n get typeName(): string {\n return \"BinaryExpression\";\n }\n\n public readonly GenerateIntoContainer = (container: RuntimeContainer) => {\n this.leftExpression.GenerateIntoContainer(container);\n this.rightExpression.GenerateIntoContainer(container);\n this.opName = this.NativeNameForOp(this.opName);\n container.AddContent(NativeFunctionCall.CallWithName(this.opName));\n };\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n\n // Check for the following case:\n //\n // (not A) ? B\n //\n // Since this easy to accidentally do:\n //\n // not A ? B\n //\n // when you intend:\n //\n // not (A ? B)\n if (this.NativeNameForOp(this.opName) === \"?\") {\n const leftUnary = asOrNull(this.leftExpression, UnaryExpression);\n if (\n leftUnary !== null &&\n (leftUnary.op === \"not\" || leftUnary.op === \"!\")\n ) {\n this.Error(\n `Using 'not' or '!' here negates '${leftUnary.innerExpression}' rather than the result of the '?' or 'has' operator. You need to add parentheses around the (A ? B) expression.`\n );\n }\n }\n }\n\n public readonly NativeNameForOp = (opName: string): string => {\n if (opName === \"and\") {\n return \"&&\";\n } else if (opName === \"or\") {\n return \"||\";\n } else if (opName === \"mod\") {\n return \"%\";\n } else if (opName === \"has\") {\n return \"?\";\n } else if (opName === \"hasnt\") {\n return \"!?\";\n }\n\n return opName;\n };\n\n public readonly toString = (): string =>\n `(${this.leftExpression} ${this.opName} ${this.rightExpression})`;\n}\n","export class CharacterSet {\n public static readonly FromRange = (\n start: string,\n end: string\n ): CharacterSet => new CharacterSet().AddRange(start, end);\n\n public set: Set<string> = new Set<string>();\n\n constructor(arg?: string | string[] | CharacterSet) {\n if (arg) {\n this.AddCharacters(arg);\n }\n }\n\n public readonly Add = (arg: string) => this.set.add(arg);\n\n public readonly AddRange = (start: string, end: string): CharacterSet => {\n for (let c = start.charCodeAt(0); c <= end.charCodeAt(0); ++c) {\n this.Add(String.fromCharCode(c));\n }\n\n return this;\n };\n\n public readonly AddCharacters = (\n chars: string | string[] | CharacterSet\n ): CharacterSet => {\n if (typeof chars === \"string\" || Array.isArray(chars)) {\n for (const c of chars) {\n this.Add(c);\n }\n } else {\n for (const c of chars.set) {\n this.Add(c);\n }\n }\n\n return this;\n };\n}\n","import { CharacterSet } from \"./CharacterSet\";\n\n/// <summary>\n/// A class representing a character range. Allows for lazy-loading a corresponding <see cref=\"CharacterSet\">character set</see>.\n/// </summary>\nexport class CharacterRange {\n public static Define = (\n start: string,\n end: string,\n excludes: string[] | CharacterSet = []\n ): CharacterRange => new CharacterRange(start, end, excludes);\n\n private _correspondingCharSet: CharacterSet = new CharacterSet();\n private _excludes = new Set<string>();\n\n constructor(\n private _start: string,\n private _end: string,\n excludes: string[] | CharacterSet = []\n ) {\n if (excludes instanceof CharacterSet) {\n this._excludes = excludes.set;\n } else {\n for (const item of excludes) {\n this._excludes.add(item);\n }\n }\n }\n\n get start(): string {\n return this._start;\n }\n\n get end(): string {\n return this._end;\n }\n\n /// <summary>\n /// Returns a <see cref=\"CharacterSet\">character set</see> instance corresponding to the character range\n /// represented by the current instance.\n /// </summary>\n /// <remarks>\n /// The internal character set is created once and cached in memory.\n /// </remarks>\n /// <returns>The char set.</returns>\n public readonly ToCharacterSet = (): CharacterSet => {\n if (this._correspondingCharSet.set.size === 0) {\n for (\n let ii = this.start.charCodeAt(0), c = String.fromCharCode(ii);\n ii <= this.end.charCodeAt(0);\n ii += 1\n ) {\n if (!this._excludes.has(c)) {\n this._correspondingCharSet.AddCharacters(c);\n }\n }\n }\n\n return this._correspondingCharSet;\n };\n}\n","import { InkObject } from \"./Object\";\nimport { Path } from \"./Path\";\nimport { Container } from \"./Container\";\nimport { throwNullException } from \"./NullException\";\n\nexport class ChoicePoint extends InkObject {\n public _pathOnChoice: Path | null = null;\n public hasCondition: boolean = false;\n public hasStartContent: boolean = false;\n public hasChoiceOnlyContent: boolean = false;\n public isInvisibleDefault: boolean = false;\n public onceOnly: boolean = true;\n\n constructor(onceOnly: boolean = true) {\n super();\n this.onceOnly = onceOnly;\n }\n get pathOnChoice(): Path | null {\n if (this._pathOnChoice != null && this._pathOnChoice.isRelative) {\n let choiceTargetObj = this.choiceTarget;\n if (choiceTargetObj) {\n this._pathOnChoice = choiceTargetObj.path;\n }\n }\n return this._pathOnChoice;\n }\n set pathOnChoice(value: Path | null) {\n this._pathOnChoice = value;\n }\n get choiceTarget(): Container | null {\n if (this._pathOnChoice === null)\n return throwNullException(\"ChoicePoint._pathOnChoice\");\n return this.ResolvePath(this._pathOnChoice).container;\n }\n get pathStringOnChoice(): string {\n if (this.pathOnChoice === null)\n return throwNullException(\"ChoicePoint.pathOnChoice\");\n return this.CompactPathString(this.pathOnChoice);\n }\n set pathStringOnChoice(value: string) {\n this.pathOnChoice = new Path(value);\n }\n get flags(): number {\n let flags = 0;\n if (this.hasCondition) flags |= 1;\n if (this.hasStartContent) flags |= 2;\n if (this.hasChoiceOnlyContent) flags |= 4;\n if (this.isInvisibleDefault) flags |= 8;\n if (this.onceOnly) flags |= 16;\n return flags;\n }\n set flags(value: number) {\n this.hasCondition = (value & 1) > 0;\n this.hasStartContent = (value & 2) > 0;\n this.hasChoiceOnlyContent = (value & 4) > 0;\n this.isInvisibleDefault = (value & 8) > 0;\n this.onceOnly = (value & 16) > 0;\n }\n public toString(): string {\n if (this.pathOnChoice === null)\n return throwNullException(\"ChoicePoint.pathOnChoice\");\n // int? targetLineNum = DebugLineNumberOfPath (pathOnChoice);\n let targetLineNum = null;\n let targetString = this.pathOnChoice.toString();\n\n if (targetLineNum != null) {\n targetString = \" line \" + targetLineNum + \"(\" + targetString + \")\";\n }\n\n return \"Choice: -> \" + targetString;\n }\n}\n","export enum PushPopType {\n Tunnel = 0,\n Function = 1,\n FunctionEvaluationFromGame = 2,\n}\n","import { Path } from \"./Path\";\nimport { Container } from \"./Container\";\nimport { InkObject } from \"./Object\";\n\nexport class Pointer {\n public container: Container | null = null;\n public index: number = -1;\n\n constructor();\n constructor(container: Container | null, index: number);\n constructor() {\n if (arguments.length === 2) {\n this.container = arguments[0];\n this.index = arguments[1];\n }\n }\n\n public Resolve(): InkObject | null {\n if (this.index < 0) return this.container;\n if (this.container == null) return null;\n if (this.container.content.length == 0) return this.container;\n if (this.index >= this.container.content.length) return null;\n\n return this.container.content[this.index];\n }\n\n get isNull(): boolean {\n return this.container == null;\n }\n\n get path(): Path | null {\n if (this.isNull) return null;\n\n if (this.index >= 0)\n return this.container!.path.PathByAppendingComponent(\n new Path.Component(this.index)\n );\n else return this.container!.path;\n }\n\n public toString(): string {\n if (!this.container) return \"Ink Pointer (null)\";\n\n return (\n \"Ink Pointer -> \" +\n this.container.path.toString() +\n \" -- index \" +\n this.index\n );\n }\n\n // This method does not exist in the original C# code, but is here to maintain the\n // value semantics of Pointer.\n public copy(): Pointer {\n return new Pointer(this.container, this.index);\n }\n\n public static StartOf(container: Container | null): Pointer {\n return new Pointer(container, 0);\n }\n\n public static get Null(): Pointer {\n return new Pointer(null, -1);\n }\n}\n","export enum SymbolType {\n Knot = 0,\n List = 1,\n ListItem = 2,\n Var = 3,\n SubFlowAndWeave = 4,\n Arg = 5,\n Temp = 6,\n}\n","import { Path } from \"./Path\";\nimport { PushPopType } from \"./PushPop\";\nimport { StringBuilder } from \"./StringBuilder\";\nimport { InkObject } from \"./Object\";\nimport { Pointer } from \"./Pointer\";\nimport { Container } from \"./Container\";\nimport { throwNullException } from \"./NullException\";\n\nexport class Divert extends InkObject {\n get targetPath() {\n if (this._targetPath != null && this._targetPath.isRelative) {\n let targetObj = this.targetPointer.Resolve();\n if (targetObj) {\n this._targetPath = targetObj.path;\n }\n }\n\n return this._targetPath;\n }\n set targetPath(value: Path | null) {\n this._targetPath = value;\n this._targetPointer = Pointer.Null;\n }\n\n public _targetPath: Path | null = null;\n\n get targetPointer() {\n if (this._targetPointer.isNull) {\n let targetObj = this.ResolvePath(this._targetPath).obj;\n\n if (this._targetPath === null)\n return throwNullException(\"this._targetPath\");\n if (this._targetPath.lastComponent === null)\n return throwNullException(\"this._targetPath.lastComponent\");\n\n if (this._targetPath.lastComponent.isIndex) {\n if (targetObj === null) return throwNullException(\"targetObj\");\n this._targetPointer.container =\n targetObj.parent instanceof Container ? targetObj.parent : null;\n this._targetPointer.index = this._targetPath.lastComponent.index;\n } else {\n this._targetPointer = Pointer.StartOf(\n targetObj instanceof Container ? targetObj : null\n );\n }\n }\n\n return this._targetPointer.copy();\n }\n\n public _targetPointer: Pointer = Pointer.Null;\n\n get targetPathString() {\n if (this.targetPath == null) return null;\n\n return this.CompactPathString(this.targetPath);\n }\n set targetPathString(value: string | null) {\n if (value == null) {\n this.targetPath = null;\n } else {\n this.targetPath = new Path(value);\n }\n }\n\n public variableDivertName: string | null = null;\n get hasVariableTarget() {\n return this.variableDivertName != null;\n }\n\n public pushesToStack: boolean = false;\n public stackPushType: PushPopType = 0;\n\n public isExternal: boolean = false;\n public externalArgs: number = 0;\n\n public isConditional: boolean = false;\n\n constructor(stackPushType?: PushPopType) {\n super();\n this.pushesToStack = false;\n\n if (typeof stackPushType !== \"undefined\") {\n this.pushesToStack = true;\n this.stackPushType = stackPushType;\n }\n }\n\n public Equals(obj: Divert | null) {\n let otherDivert = obj;\n if (otherDivert instanceof Divert) {\n if (this.hasVariableTarget == otherDivert.hasVariableTarget) {\n if (this.hasVariableTarget) {\n return this.variableDivertName == otherDivert.variableDivertName;\n } else {\n if (this.targetPath === null)\n return throwNullException(\"this.targetPath\");\n return this.targetPath.Equals(otherDivert.targetPath);\n }\n }\n }\n return false;\n }\n\n public toString() {\n if (this.hasVariableTarget) {\n return \"Divert(variable: \" + this.variableDivertName + \")\";\n } else if (this.targetPath == null) {\n return \"Divert(null)\";\n } else {\n let sb = new StringBuilder();\n\n let targetStr = this.targetPath.toString();\n // int? targetLineNum = DebugLineNumberOfPath (targetPath);\n let targetLineNum = null;\n if (targetLineNum != null) {\n targetStr = \"line \" + targetLineNum;\n }\n\n sb.Append(\"Divert\");\n\n if (this.isConditional) sb.Append(\"?\");\n\n if (this.pushesToStack) {\n if (this.stackPushType == PushPopType.Function) {\n sb.Append(\" function\");\n } else {\n sb.Append(\" tunnel\");\n }\n }\n\n sb.Append(\" -> \");\n sb.Append(this.targetPathString);\n\n sb.Append(\" (\");\n sb.Append(targetStr);\n sb.Append(\")\");\n\n return sb.toString();\n }\n }\n}\n","import { InkObject } from \"./Object\";\n\nexport class VariableAssignment extends InkObject {\n public readonly variableName: string | null;\n public readonly isNewDeclaration: boolean;\n public isGlobal: boolean;\n\n constructor(variableName: string | null, isNewDeclaration: boolean) {\n super();\n this.variableName = variableName || null;\n this.isNewDeclaration = !!isNewDeclaration;\n this.isGlobal = false;\n }\n\n public toString(): string {\n return \"VarAssign to \" + this.variableName;\n }\n}\n","import { ChoicePoint } from \"../../../engine/ChoicePoint\";\nimport { Container as RuntimeContainer } from \"../../../engine/Container\";\nimport { ContentList } from \"./ContentList\";\nimport { ControlCommand as RuntimeControlCommand } from \"../../../engine/ControlCommand\";\nimport { Divert as RuntimeDivert } from \"../../../engine/Divert\";\nimport { DivertTargetValue } from \"../../../engine/Value\";\nimport { INamedContent } from \"../../../engine/INamedContent\";\nimport { IWeavePoint } from \"./IWeavePoint\";\nimport { ParsedObject } from \"./Object\";\nimport { InkObject as RuntimeObject } from \"../../../engine/Object\";\nimport { Path as RuntimePath } from \"../../../engine/Path\";\nimport { Story } from \"./Story\";\nimport { SymbolType } from \"./SymbolType\";\nimport { VariableAssignment as RuntimeVariableAssignment } from \"../../../engine/VariableAssignment\";\nimport { Expression } from \"./Expression/Expression\";\nimport { Identifier } from \"./Identifier\";\n\nexport class Choice extends ParsedObject implements IWeavePoint, INamedContent {\n private _condition: Expression | null = null;\n private _innerContentContainer: RuntimeContainer | null = null;\n private _outerContainer: RuntimeContainer | null = null;\n private _runtimeChoice: ChoicePoint | null = null;\n get runtimeChoice(): ChoicePoint {\n if (!this._runtimeChoice) {\n throw new Error();\n }\n\n return this._runtimeChoice;\n }\n\n private _returnToR1: DivertTargetValue | null = null;\n private _returnToR2: DivertTargetValue | null = null;\n private _r1Label: RuntimeContainer | null = null;\n private _r2Label: RuntimeContainer | null = null;\n private _divertToStartContentOuter: RuntimeDivert | null = null;\n private _divertToStartContentInner: RuntimeDivert | null = null;\n private _startContentRuntimeContainer: RuntimeContainer | null = null;\n\n public startContent: ContentList;\n public choiceOnlyContent: ContentList;\n public innerContent: ContentList;\n public identifier?: Identifier;\n get name() {\n return this.identifier?.name || null;\n }\n public onceOnly: boolean;\n public isInvisibleDefault: boolean = false;\n public indentationDepth: number;\n public hasWeaveStyleInlineBrackets: boolean = false;\n\n get condition() {\n return this._condition;\n }\n\n set condition(value) {\n this._condition = value;\n if (value) {\n this.AddContent(value as ParsedObject);\n }\n }\n\n // Required for IWeavePoint interface\n // Choice's target container. Used by weave to append any extra\n // nested weave content into.\n get runtimeContainer() {\n return this._innerContentContainer;\n }\n\n get innerContentContainer() {\n return this._innerContentContainer;\n }\n\n get containerForCounting() {\n return this._innerContentContainer;\n }\n\n // Override runtimePath to point to the Choice's target content (after it's chosen),\n // as opposed to the default implementation which would point to the choice itself\n // (or it's outer container), which is what runtimeObject is.\n get runtimePath(): RuntimePath {\n if (!this.innerContentContainer || !this.innerContentContainer.path) {\n throw new Error();\n }\n\n return this.innerContentContainer.path;\n }\n\n constructor(\n startContent: ContentList,\n choiceOnlyContent: ContentList,\n innerContent: ContentList\n ) {\n super();\n\n this.startContent = startContent;\n this.choiceOnlyContent = choiceOnlyContent;\n this.innerContent = innerContent;\n this.indentationDepth = 1;\n\n if (startContent) {\n this.AddContent(this.startContent);\n }\n\n if (choiceOnlyContent) {\n this.AddContent(this.choiceOnlyContent);\n }\n\n if (innerContent) {\n this.AddContent(this.innerContent);\n }\n\n this.onceOnly = true; // default\n }\n\n get typeName(): string {\n return \"Choice\";\n }\n\n public readonly GenerateRuntimeObject = (): RuntimeObject => {\n this._outerContainer = new RuntimeContainer();\n\n // Content names for different types of choice:\n // * start content [choice only content] inner content\n // * start content -> divert\n // * start content\n // * [choice only content]\n\n // Hmm, this structure has become slightly insane!\n //\n // [\n // EvalStart\n // assign $r = $r1 -- return target = return label 1\n // BeginString\n // -> s\n // [(r1)] -- return label 1 (after start content)\n // EndString\n // BeginString\n // ... choice only content\n // EndEval\n // Condition expression\n // choice: -> \"c-0\"\n // (s) = [\n // start content\n // -> r -- goto return label 1 or 2\n // ]\n // ]\n //\n // in parent's container: (the inner content for the choice)\n //\n // (c-0) = [\n // EvalStart\n // assign $r = $r2 -- return target = return label 2\n // EndEval\n // -> s\n // [(r2)] -- return label 1 (after start content)\n // inner content\n // ]\n //\n\n this._runtimeChoice = new ChoicePoint(this.onceOnly);\n this._runtimeChoice.isInvisibleDefault = this.isInvisibleDefault;\n\n if (this.startContent || this.choiceOnlyContent || this.condition) {\n this._outerContainer.AddContent(RuntimeControlCommand.EvalStart());\n }\n\n // Start content is put into a named container that's referenced both\n // when displaying the choice initially, and when generating the text\n // when the choice is chosen.\n if (this.startContent) {\n // Generate start content and return\n // - We can't use a function since it uses a call stack element, which would\n // put temporary values out of scope. Instead we manually divert around.\n // - $r is a variable divert target contains the return point\n this._returnToR1 = new DivertTargetValue();\n this._outerContainer.AddContent(this._returnToR1);\n\n const varAssign = new RuntimeVariableAssignment(\"$r\", true);\n this._outerContainer.AddContent(varAssign);\n\n // Mark the start of the choice text generation, so that the runtime\n // knows where to rewind to to extract the content from the output stream.\n this._outerContainer.AddContent(RuntimeControlCommand.BeginString());\n\n this._divertToStartContentOuter = new RuntimeDivert();\n this._outerContainer.AddContent(this._divertToStartContentOuter);\n\n // Start content itself in a named container\n this._startContentRuntimeContainer =\n this.startContent.GenerateRuntimeObject() as RuntimeContainer;\n this._startContentRuntimeContainer.name = \"s\";\n\n // Effectively, the \"return\" statement - return to the point specified by $r\n const varDivert = new RuntimeDivert();\n varDivert.variableDivertName = \"$r\";\n this._startContentRuntimeContainer.AddContent(varDivert);\n\n // Add the container\n this._outerContainer.AddToNamedContentOnly(\n this._startContentRuntimeContainer\n );\n\n // This is the label to return to\n this._r1Label = new RuntimeContainer();\n this._r1Label.name = \"$r1\";\n this._outerContainer.AddContent(this._r1Label);\n\n this._outerContainer.AddContent(RuntimeControlCommand.EndString());\n\n this._runtimeChoice.hasStartContent = true;\n }\n\n // Choice only content - mark the start, then generate it directly into the outer container\n if (this.choiceOnlyContent) {\n this._outerContainer.AddContent(RuntimeControlCommand.BeginString());\n\n const choiceOnlyRuntimeContent =\n this.choiceOnlyContent.GenerateRuntimeObject() as RuntimeContainer;\n this._outerContainer.AddContentsOfContainer(choiceOnlyRuntimeContent);\n\n this._outerContainer.AddContent(RuntimeControlCommand.EndString());\n\n this._runtimeChoice.hasChoiceOnlyContent = true;\n }\n\n // Generate any condition for this choice\n if (this.condition) {\n this.condition.GenerateIntoContainer(this._outerContainer);\n this._runtimeChoice.hasCondition = true;\n }\n\n if (this.startContent || this.choiceOnlyContent || this.condition) {\n this._outerContainer.AddContent(RuntimeControlCommand.EvalEnd());\n }\n\n // Add choice itself\n this._outerContainer.AddContent(this._runtimeChoice);\n\n // Container that choice points to for when it's chosen\n this._innerContentContainer = new RuntimeContainer();\n\n // Repeat start content by diverting to its container\n if (this.startContent) {\n // Set the return point when jumping back into the start content\n // - In this case, it's the $r2 point, within the choice content \"c\".\n this._returnToR2 = new DivertTargetValue();\n this._innerContentContainer.AddContent(RuntimeControlCommand.EvalStart());\n this._innerContentContainer.AddContent(this._returnToR2);\n this._innerContentContainer.AddContent(RuntimeControlCommand.EvalEnd());\n const varAssign = new RuntimeVariableAssignment(\"$r\", true);\n this._innerContentContainer.AddContent(varAssign);\n\n // Main divert into start content\n this._divertToStartContentInner = new RuntimeDivert();\n this._innerContentContainer.AddContent(this._divertToStartContentInner);\n\n // Define label to return to\n this._r2Label = new RuntimeContainer();\n this._r2Label.name = \"$r2\";\n this._innerContentContainer.AddContent(this._r2Label);\n }\n\n // Choice's own inner content\n if (this.innerContent) {\n const innerChoiceOnlyContent =\n this.innerContent.GenerateRuntimeObject() as RuntimeContainer;\n this._innerContentContainer.AddContentsOfContainer(\n innerChoiceOnlyContent\n );\n }\n\n if (this.story.countAllVisits) {\n this._innerContentContainer.visitsShouldBeCounted = true;\n }\n\n this._innerContentContainer.countingAtStartOnly = true;\n\n return this._outerContainer;\n };\n\n public ResolveReferences(context: Story): void {\n // Weave style choice - target own content container\n if (this._innerContentContainer) {\n this.runtimeChoice.pathOnChoice = this._innerContentContainer.path;\n\n if (this.onceOnly) {\n this._innerContentContainer.visitsShouldBeCounted = true;\n }\n }\n\n if (this._returnToR1) {\n if (!this._r1Label) {\n throw new Error();\n }\n\n this._returnToR1.targetPath = this._r1Label.path;\n }\n\n if (this._returnToR2) {\n if (!this._r2Label) {\n throw new Error();\n }\n\n this._returnToR2.targetPath = this._r2Label.path;\n }\n\n if (this._divertToStartContentOuter) {\n if (!this._startContentRuntimeContainer) {\n throw new Error();\n }\n\n this._divertToStartContentOuter.targetPath =\n this._startContentRuntimeContainer.path;\n }\n\n if (this._divertToStartContentInner) {\n if (!this._startContentRuntimeContainer) {\n throw new Error();\n }\n\n this._divertToStartContentInner.targetPath =\n this._startContentRuntimeContainer.path;\n }\n\n super.ResolveReferences(context);\n\n if (this.identifier && (this.identifier?.name || \"\").length > 0) {\n context.CheckForNamingCollisions(\n this as ParsedObject,\n this.identifier,\n SymbolType.SubFlowAndWeave\n );\n }\n }\n\n public readonly toString = () => {\n if (this.choiceOnlyContent !== null) {\n return `* ${this.startContent}[${this.choiceOnlyContent}]...`;\n }\n\n return `* ${this.startContent}...`;\n };\n}\n","export class StringParserElement {\n public static _uniqueIdCounter: number = 1000;\n\n public characterIndex: number = 0;\n public characterInLineIndex: number = 0;\n public lineIndex: number = 0;\n public reportedErrorInScope: boolean = false;\n public uniqueId: number = 0;\n public customFlags: number = 0;\n\n public readonly CopyFrom = (fromElement: StringParserElement): void => {\n StringParserElement._uniqueIdCounter++;\n this.uniqueId = StringParserElement._uniqueIdCounter;\n this.characterIndex = fromElement.characterIndex;\n this.characterInLineIndex = fromElement.characterInLineIndex;\n this.lineIndex = fromElement.lineIndex;\n this.customFlags = fromElement.customFlags;\n this.reportedErrorInScope = false;\n };\n\n // Squash is used when succeeding from a rule,\n // so only the state information we wanted to carry forward is\n // retained. e.g. characterIndex and lineIndex are global,\n // however uniqueId is specific to the individual rule,\n // and likewise, custom flags are designed for the temporary\n // state of the individual rule too.\n public readonly SquashFrom = (fromElement: StringParserElement): void => {\n this.characterIndex = fromElement.characterIndex;\n this.characterInLineIndex = fromElement.characterInLineIndex;\n this.lineIndex = fromElement.lineIndex;\n this.reportedErrorInScope = fromElement.reportedErrorInScope;\n this.customFlags = fromElement.customFlags;\n };\n}\n","import { StringParserElement } from \"./StringParserElement\";\n\nexport class StringParserState {\n private _stack: StringParserElement[] = [];\n private _numElements: number = 0;\n\n get currentElement(): StringParserElement {\n return this._stack[this._numElements - 1];\n }\n\n get lineIndex(): number {\n return this.currentElement.lineIndex;\n }\n\n set lineIndex(value: number) {\n this.currentElement.lineIndex = value;\n }\n\n get characterIndex(): number {\n return this.currentElement.characterIndex;\n }\n\n set characterIndex(value: number) {\n this.currentElement.characterIndex = value;\n }\n\n get characterInLineIndex(): number {\n return this.currentElement.characterInLineIndex;\n }\n\n set characterInLineIndex(value: number) {\n this.currentElement.characterInLineIndex = value;\n }\n\n get customFlags(): number {\n return this.currentElement.customFlags;\n }\n\n set customFlags(value: number) {\n this.currentElement.customFlags = value;\n }\n\n get errorReportedAlreadyInScope(): boolean {\n return this.currentElement.reportedErrorInScope;\n }\n\n get stackHeight(): number {\n return this._numElements;\n }\n\n constructor() {\n const kExpectedMaxStackDepth = 200;\n for (let i = 0; i < kExpectedMaxStackDepth; i++) {\n this._stack[i] = new StringParserElement();\n }\n this._numElements = 1;\n }\n\n public readonly StringParserState = (): void => {\n const kExpectedMaxStackDepth: number = 200;\n this._stack = new Array(kExpectedMaxStackDepth);\n\n for (let ii = 0; ii < kExpectedMaxStackDepth; ++ii) {\n this._stack[ii] = new StringParserElement();\n }\n\n this._numElements = 1;\n };\n\n public readonly Push = (): number => {\n if (this._numElements >= this._stack.length && this._numElements > 0) {\n throw new Error(\"Stack overflow in parser state.\");\n }\n\n const prevElement = this._stack[this._numElements - 1];\n const newElement = this._stack[this._numElements];\n this._numElements++;\n\n newElement.CopyFrom(prevElement);\n\n return newElement.uniqueId;\n };\n\n public readonly Pop = (expectedRuleId: number): void => {\n if (this._numElements == 1) {\n throw new Error(\n \"Attempting to remove final stack element is illegal! Mismatched Begin/Succceed/Fail?\"\n );\n }\n\n if (this.currentElement.uniqueId != expectedRuleId) {\n throw new Error(\n \"Mismatched rule IDs while Poping - do you have mismatched Begin/Succeed/Fail?\"\n );\n }\n\n // Restore state\n this._numElements -= 1;\n };\n\n public Peek = (expectedRuleId: number) => {\n if (this.currentElement.uniqueId != expectedRuleId) {\n throw new Error(\n \"Mismatched rule IDs while Peeking - do you have mismatched Begin/Succeed/Fail?\"\n );\n }\n\n return this._stack[this._numElements - 1];\n };\n\n public readonly PeekPenultimate = (): StringParserElement | null => {\n if (this._numElements >= 2) {\n return this._stack[this._numElements - 2];\n }\n\n return null;\n };\n\n // Reduce stack height while maintaining currentElement\n // Remove second last element: i.e. \"squash last two elements together\"\n // Used when succeeding from a rule (and ONLY when succeeding, since\n // the state of the top element is retained).\n public readonly Squash = (): void => {\n if (this._numElements < 2) {\n throw new Error(\n \"Attempting to remove final stack element is illegal! Mismatched Begin/Succceed/Fail?\"\n );\n }\n\n const penultimateEl = this._stack[this._numElements - 2];\n const lastEl = this._stack[this._numElements - 1];\n\n penultimateEl.SquashFrom(lastEl);\n\n this._numElements -= 1;\n };\n\n public readonly NoteErrorReported = (): void => {\n for (const el of this._stack) {\n el.reportedErrorInScope = true;\n }\n };\n}\n","import { CharacterSet } from \"../CharacterSet\";\nimport { ParsedObject } from \"../ParsedHierarchy/Object\";\nimport { StringParserState } from \"./StringParserState\";\nimport { StringParserElement } from \"./StringParserElement\";\n\nexport const ParseSuccess = Symbol(\"ParseSuccessStruct\");\n\nexport type ParseRule = () => ParseRuleReturn;\n\nexport type ParseRuleReturn =\n | object\n | string\n | null\n | number\n | typeof StringParser[\"ParseSuccess\"];\n\nexport type SpecificParseRule<T extends ParseRule> = T;\n\nexport class StringParser {\n public ParseRule: ParseRule | null = null;\n\n public static readonly ParseSuccess: typeof ParseSuccess = ParseSuccess;\n public static readonly numbersCharacterSet = new CharacterSet(\"0123456789\");\n\n private _chars: string[];\n\n public errorHandler:\n | null\n | ((\n message: string,\n index: number,\n lineIndex?: number,\n isWarning?: boolean\n ) => void) = null;\n public state: StringParserState;\n public hadError: boolean = false;\n\n constructor(str: string) {\n const strPreProc = this.PreProcessInputString(str);\n this.state = new StringParserState();\n\n if (str) {\n this._chars = strPreProc.split(\"\");\n } else {\n this._chars = [];\n }\n\n this.inputString = strPreProc;\n }\n\n get currentCharacter(): string {\n if (this.index >= 0 && this.remainingLength > 0) {\n return this._chars[this.index];\n }\n\n return \"0\";\n }\n\n // Don't do anything by default, but provide ability for subclasses\n // to manipulate the string before it's used as input (converted to a char array)\n public PreProcessInputString(str: string): string {\n return str;\n }\n\n //--------------------------------\n // Parse state\n //--------------------------------\n\n public readonly BeginRule = (): number => this.state.Push();\n\n public readonly FailRule = (expectedRuleId: number): ParseRuleReturn => {\n this.state.Pop(expectedRuleId);\n return null;\n };\n\n public readonly CancelRule = (expectedRuleId: number): void => {\n this.state.Pop(expectedRuleId);\n };\n\n public readonly SucceedRule = (\n expectedRuleId: number,\n result: ParseRuleReturn = null\n ): ParseRuleReturn => {\n // Get state at point where this rule stared evaluating\n const stateAtSucceedRule = this.state.Peek(expectedRuleId);\n const stateAtBeginRule = this.state.PeekPenultimate();\n\n // Allow subclass to receive callback\n if (this.RuleDidSucceed) {\n this.RuleDidSucceed(result, stateAtBeginRule, stateAtSucceedRule);\n }\n\n // Flatten state stack so that we maintain the same values,\n // but remove one level in the stack.\n this.state.Squash();\n\n let finalResult: ParseRuleReturn = result;\n if (finalResult === null) {\n finalResult = StringParser.ParseSuccess;\n }\n\n return finalResult;\n };\n\n public RuleDidSucceed?: (\n result: ParseRuleReturn,\n startState: StringParserElement | null,\n endState: StringParserElement\n ) => void;\n\n public readonly Expect = (\n rule: ParseRule,\n message: string | null = null,\n recoveryRule: ParseRule | null = null\n ): ParseRuleReturn => {\n let result: ParseRuleReturn = this.ParseObject(rule);\n if (result === null) {\n if (message === null) {\n message = rule.name;\n }\n\n let butSaw: string;\n const lineRemainder: string = this.LineRemainder();\n if (lineRemainder === null || lineRemainder.length === 0) {\n butSaw = \"end of line\";\n } else {\n butSaw = `'${lineRemainder}'`;\n }\n\n this.Error(`Expected ${message} but saw ${butSaw}`);\n\n if (recoveryRule !== null) {\n result = recoveryRule();\n }\n }\n\n return result;\n };\n\n public Error = (message: string, isWarning: boolean = false): void => {\n this.ErrorOnLine(message, this.lineIndex + 1, isWarning);\n };\n\n public readonly ErrorWithParsedObject = (\n message: string,\n result: ParsedObject,\n isWarning: boolean = false\n ): void => {\n this.ErrorOnLine(\n message,\n result.debugMetadata ? result.debugMetadata.startLineNumber : -1,\n isWarning\n );\n };\n\n public readonly ErrorOnLine = (\n message: string,\n lineNumber: number,\n isWarning: boolean\n ): void => {\n if (!this.state.errorReportedAlreadyInScope) {\n const errorType = isWarning ? \"Warning\" : \"Error\";\n\n if (!this.errorHandler) {\n throw new Error(`${errorType} on line ${lineNumber}: ${message}`);\n } else {\n this.errorHandler(message, this.index, lineNumber - 1, isWarning);\n }\n\n this.state.NoteErrorReported();\n }\n\n if (!isWarning) {\n this.hadError = true;\n }\n };\n\n public readonly Warning = (message: string): void =>\n this.Error(message, true);\n\n get endOfInput(): boolean {\n return this.index >= this._chars.length;\n }\n\n get remainingString(): string {\n return this._chars\n .slice(this.index, this.index + this.remainingLength)\n .join(\"\");\n }\n\n public readonly LineRemainder = (): string =>\n this.Peek(() => this.ParseUntilCharactersFromString(\"\\n\\r\")) as string;\n\n get remainingLength() {\n return this._chars.length - this.index;\n }\n\n public inputString: string;\n\n get lineIndex() {\n return this.state.lineIndex;\n }\n\n set lineIndex(value: number) {\n this.state.lineIndex = value;\n }\n\n set characterInLineIndex(value: number) {\n this.state.characterInLineIndex = value;\n }\n\n get characterInLineIndex() {\n return this.state.characterInLineIndex;\n }\n\n get index(): number {\n // If we want subclass parsers to be able to set the index directly,\n // then we would need to know what the lineIndex of the new\n // index would be - would we have to step through manually\n // counting the newlines to do so?\n return this.state.characterIndex;\n }\n\n set index(value: number) {\n this.state.characterIndex = value;\n }\n\n public readonly SetFlag = (flag: number, trueOrFalse: boolean): void => {\n if (trueOrFalse) {\n this.state.customFlags |= flag;\n } else {\n this.state.customFlags &= ~flag;\n }\n };\n\n public readonly GetFlag = (flag: number): boolean =>\n Boolean(this.state.customFlags & flag);\n\n //--------------------------------\n // Structuring\n //--------------------------------\n\n public ParseObject = (rule: ParseRule): ParseRuleReturn => {\n const ruleId: number = this.BeginRule();\n const stackHeightBefore = this.state.stackHeight;\n const result = rule();\n\n if (stackHeightBefore !== this.state.stackHeight) {\n throw new Error(\"Mismatched Begin/Fail/Succeed rules\");\n }\n\n if (result === null) {\n return this.FailRule(ruleId);\n }\n\n this.SucceedRule(ruleId, result);\n\n return result;\n };\n\n public readonly Parse = <T extends ParseRule>(\n rule: SpecificParseRule<T>\n ): ParseRuleReturn => {\n const ruleId: number = this.BeginRule();\n\n const result: ParseRuleReturn = rule();\n if (result === null) {\n this.FailRule(ruleId);\n return null;\n }\n\n this.SucceedRule(ruleId, result);\n\n return result;\n };\n\n public readonly OneOf = (array: ParseRule[]): ParseRuleReturn => {\n for (const rule of array) {\n const result = this.ParseObject(rule);\n if (result !== null) {\n return result;\n }\n }\n\n return null;\n };\n\n public readonly OneOrMore = (rule: ParseRule): ParseRuleReturn[] | null => {\n const results: ParseRuleReturn[] = [];\n let result: ParseRuleReturn = null;\n\n do {\n result = this.ParseObject(rule);\n if (result !== null) {\n results.push(result);\n }\n } while (result !== null);\n\n if (results.length > 0) {\n return results;\n }\n\n return null;\n };\n\n public readonly Optional =\n (rule: ParseRule): ParseRule =>\n () => {\n const result = this.ParseObject(rule);\n if (result === null) return StringParser.ParseSuccess;\n return result;\n };\n\n // Return ParseSuccess instead the real result so that it gets excluded\n // from result arrays (e.g. Interleave)\n public readonly Exclude =\n (rule: ParseRule): ParseRule =>\n () =>\n this.ParseObject(rule) && StringParser.ParseSuccess;\n\n // Combination of both of the above\n public readonly OptionalExclude =\n (rule: ParseRule): ParseRule =>\n () => {\n this.ParseObject(rule);\n return StringParser.ParseSuccess;\n };\n\n // Convenience method for creating more readable ParseString rules that can be combined\n // in other structuring rules (like OneOf etc)\n // e.g. OneOf(String(\"one\"), String(\"two\"))\n public readonly String =\n (str: string): ParseRule =>\n () =>\n this.ParseString(str);\n\n private readonly TryAddResultToList = <T>(\n result: ParseRuleReturn,\n list: T[],\n flatten: boolean = true\n ): void => {\n if (result === StringParser.ParseSuccess) {\n return;\n }\n\n if (flatten && Array.isArray(result)) {\n const resultCollection = result as ParseRuleReturn[];\n if (resultCollection !== null) {\n for (const obj of resultCollection) {\n list.push(obj as any);\n }\n\n return;\n }\n }\n\n list.push(result as any);\n };\n\n public readonly Interleave = <T>(\n ruleA: ParseRule,\n ruleB: ParseRule,\n untilTerminator: ParseRule | null = null,\n flatten: boolean = true\n ): T[] => {\n const ruleId: number = this.BeginRule();\n const results: T[] = [];\n\n // First outer padding\n const firstA = this.ParseObject(ruleA);\n if (firstA === null) {\n return this.FailRule(ruleId) as any;\n } else {\n this.TryAddResultToList(firstA, results, flatten);\n }\n\n let lastMainResult: ParseRuleReturn | null = null;\n let outerResult: ParseRuleReturn | null = null;\n do {\n // \"until\" condition hit?\n if (untilTerminator !== null && this.Peek(untilTerminator) !== null) {\n break;\n }\n\n // Main inner\n lastMainResult = this.ParseObject(ruleB);\n if (lastMainResult === null) {\n break;\n } else {\n this.TryAddResultToList(lastMainResult, results, flatten);\n }\n\n // Outer result (i.e. last A in ABA)\n outerResult = null;\n if (lastMainResult !== null) {\n outerResult = this.ParseObject(ruleA);\n\n if (outerResult === null) {\n break;\n } else {\n this.TryAddResultToList(outerResult, results, flatten);\n }\n }\n\n // Stop if there are no results, or if both are the placeholder \"ParseSuccess\" (i.e. Optional success rather than a true value)\n } while (\n (lastMainResult !== null || outerResult !== null) &&\n !(\n (lastMainResult as any) === StringParser.ParseSuccess &&\n outerResult == StringParser.ParseSuccess\n ) &&\n this.remainingLength > 0\n );\n\n if (results.length === 0) {\n return this.FailRule(ruleId) as T[];\n }\n\n return this.SucceedRule(ruleId, results) as T[];\n };\n\n //--------------------------------\n // Basic string parsing\n //--------------------------------\n\n public readonly ParseString = (str: string): string | null => {\n if (str.length > this.remainingLength) {\n return null;\n }\n\n const ruleId: number = this.BeginRule();\n\n // Optimisation from profiling:\n // Store in temporary local variables\n // since they're properties that would have to access\n // the rule stack every time otherwise.\n let i: number = this.index;\n let cli: number = this.characterInLineIndex;\n let li: number = this.lineIndex;\n\n let success: boolean = true;\n for (let tempIdx = 0; tempIdx < str.length; tempIdx += 1) {\n const c = str[tempIdx];\n\n if (this._chars[i] !== c) {\n success = false;\n break;\n }\n if (c === \"\\n\") {\n li++;\n cli = -1;\n }\n\n i++;\n cli++;\n }\n\n this.index = i;\n this.characterInLineIndex = cli;\n this.lineIndex = li;\n\n if (success) {\n return this.SucceedRule(ruleId, str) as any;\n }\n\n return this.FailRule(ruleId) as any;\n };\n\n public readonly ParseSingleCharacter = (): string => {\n if (this.remainingLength > 0) {\n const c = this._chars[this.index];\n if (c === \"\\n\") {\n this.lineIndex += 1;\n this.characterInLineIndex = -1;\n }\n\n this.index += 1;\n this.characterInLineIndex += 1;\n\n return c;\n }\n\n return \"0\";\n };\n\n public readonly ParseUntilCharactersFromString = (\n str: string,\n maxCount: number = -1\n ): string | null => this.ParseCharactersFromString(str, false, maxCount);\n\n public readonly ParseUntilCharactersFromCharSet = (\n charSet: CharacterSet,\n maxCount: number = -1\n ): string | null => this.ParseCharactersFromCharSet(charSet, false, maxCount);\n\n public readonly ParseCharactersFromString = (\n str: string,\n maxCountOrShouldIncludeStrChars: boolean | number = -1,\n maxCount: number = -1\n ): string | null => {\n const charSet = new CharacterSet(str);\n if (typeof maxCountOrShouldIncludeStrChars === \"number\") {\n return this.ParseCharactersFromCharSet(\n charSet,\n true,\n maxCountOrShouldIncludeStrChars\n );\n }\n\n return this.ParseCharactersFromCharSet(\n charSet,\n maxCountOrShouldIncludeStrChars,\n maxCount\n );\n };\n\n public readonly ParseCharactersFromCharSet = (\n charSet: CharacterSet,\n shouldIncludeChars: boolean = true,\n maxCount: number = -1\n ): string | null => {\n if (maxCount === -1) {\n maxCount = Number.MAX_SAFE_INTEGER;\n }\n\n const startIndex: number = this.index;\n\n // Optimisation from profiling:\n // Store in temporary local variables\n // since they're properties that would have to access\n // the rule stack every time otherwise.\n let ii: number = this.index;\n let cli: number = this.characterInLineIndex;\n let li: number = this.lineIndex;\n let count: number = 0;\n while (\n ii < this._chars.length &&\n charSet.set.has(this._chars[ii]) === shouldIncludeChars &&\n count < maxCount\n ) {\n if (this._chars[ii] === \"\\n\") {\n li += 1;\n cli = -1;\n }\n\n ii += 1;\n cli += 1;\n count += 1;\n }\n\n this.index = ii;\n this.characterInLineIndex = cli;\n this.lineIndex = li;\n\n const lastCharIndex: number = this.index;\n if (lastCharIndex > startIndex) {\n return this._chars.slice(startIndex, this.index).join(\"\");\n }\n\n return null;\n };\n\n public readonly Peek = (rule: ParseRule): ParseRuleReturn => {\n const ruleId: number = this.BeginRule();\n const result: ParseRuleReturn = rule();\n this.CancelRule(ruleId);\n\n return result;\n };\n\n public ParseUntil(\n stopRule: ParseRule,\n pauseCharacters: CharacterSet | null = null,\n endCharacters: CharacterSet | null = null\n ): string {\n const ruleId: number = this.BeginRule();\n const pauseAndEnd: CharacterSet = new CharacterSet();\n if (pauseCharacters !== null) {\n pauseAndEnd.set = new Set([\n ...pauseAndEnd.set.values(),\n ...pauseCharacters.set.values(),\n ]);\n }\n\n if (endCharacters !== null) {\n pauseAndEnd.set = new Set([\n ...pauseAndEnd.set.values(),\n ...endCharacters.set.values(),\n ]);\n }\n\n let parsedString = \"\";\n let ruleResultAtPause: ParseRuleReturn | null = null;\n\n // Keep attempting to parse strings up to the pause (and end) points.\n // - At each of the pause points, attempt to parse according to the rule\n // - When the end point is reached (or EOF), we're done\n do {\n // TODO: Perhaps if no pause or end characters are passed, we should check *every* character for stopRule?\n const partialParsedString: string | null =\n this.ParseUntilCharactersFromCharSet(pauseAndEnd);\n\n if (partialParsedString) {\n parsedString += partialParsedString;\n }\n\n // Attempt to run the parse rule at this pause point\n ruleResultAtPause = this.Peek(stopRule);\n\n // Rule completed - we're done\n if (ruleResultAtPause !== null) {\n break;\n } else {\n if (this.endOfInput) {\n break;\n }\n\n // Reached a pause point, but rule failed. Step past and continue parsing string\n const pauseCharacter: string = this.currentCharacter;\n if (\n pauseCharacters !== null &&\n pauseCharacters.set.has(pauseCharacter)\n ) {\n parsedString += pauseCharacter;\n if (pauseCharacter === \"\\n\") {\n this.lineIndex += 1;\n this.characterInLineIndex = -1;\n }\n\n this.index += 1;\n this.characterInLineIndex += 1;\n\n continue;\n } else {\n break;\n }\n }\n } while (true);\n\n if (parsedString.length > 0) {\n return this.SucceedRule(ruleId, String(parsedString)) as string;\n }\n\n return this.FailRule(ruleId) as string;\n }\n\n // No need to Begin/End rule since we never parse a newline, so keeping oldIndex is good enough\n public readonly ParseInt = (): number | null => {\n const oldIndex: number = this.index;\n const oldCharacterInLineIndex: number = this.characterInLineIndex;\n const negative: boolean = this.ParseString(\"-\") !== null;\n\n // Optional whitespace\n this.ParseCharactersFromString(\" \\t\");\n\n const parsedString = this.ParseCharactersFromCharSet(\n StringParser.numbersCharacterSet\n );\n if (parsedString === null) {\n // Roll back and fail\n this.index = oldIndex;\n this.characterInLineIndex = oldCharacterInLineIndex;\n\n return null;\n }\n\n let parsedInt: number;\n if (!Number.isNaN(Number(parsedString))) {\n parsedInt = Number(parsedString);\n return negative ? -parsedInt : parsedInt;\n }\n\n this.Error(\n \"Failed to read integer value: \" +\n parsedString +\n \". Perhaps it's out of the range of acceptable numbers ink supports? (\" +\n Number.MIN_SAFE_INTEGER +\n \" to \" +\n Number.MAX_SAFE_INTEGER +\n \")\"\n );\n\n return null;\n };\n\n // No need to Begin/End rule since we never parse a newline, so keeping oldIndex is good enough\n public readonly ParseFloat = (): number | null => {\n const oldIndex: number = this.index;\n const oldCharacterInLineIndex: number = this.characterInLineIndex;\n\n const leadingInt: number | null = this.ParseInt();\n if (leadingInt !== null) {\n if (this.ParseString(\".\") !== null) {\n const afterDecimalPointStr = this.ParseCharactersFromCharSet(\n StringParser.numbersCharacterSet\n );\n\n return Number(`${leadingInt}.${afterDecimalPointStr}`);\n }\n }\n\n // Roll back and fail\n this.index = oldIndex;\n this.characterInLineIndex = oldCharacterInLineIndex;\n\n return null;\n };\n\n public readonly ParseNewline = (): string => {\n const ruleId: number = this.BeginRule();\n\n // Optional \\r, definite \\n to support Windows (\\r\\n) and Mac/Unix (\\n)\n // 2nd May 2016: Always collapse \\r\\n to just \\n\n this.ParseString(\"\\r\");\n\n if (this.ParseString(\"\\n\") === null) {\n return this.FailRule(ruleId) as string;\n }\n\n return this.SucceedRule(ruleId, \"\\n\") as string;\n };\n}\n","import { CharacterSet } from \"./CharacterSet\";\nimport { StringParser } from \"./StringParser/StringParser\";\n\n/// <summary>\n/// Pre-pass before main ink parser runs. It actually performs two main tasks:\n/// - comment elimination to simplify the parse rules in the main parser\n/// - Conversion of Windows line endings (\\r\\n) to the simpler Unix style (\\n), so\n/// we don't have to worry about them later.\n/// </summary>\nexport class CommentEliminator extends StringParser {\n public _commentOrNewlineStartCharacter = new CharacterSet(\"/\\r\\n\");\n public _commentBlockEndCharacter = new CharacterSet(\"*\");\n public _newlineCharacters = new CharacterSet(\"\\n\\r\");\n\n public readonly Process = (): string => {\n // Make both comments and non-comments optional to handle trivial empty file case (or *only* comments)\n const stringList: string[] = this.Interleave<string>(\n this.Optional(this.CommentsAndNewlines),\n this.Optional(this.MainInk)\n );\n\n if (stringList !== null) {\n return stringList.join(\"\");\n } else {\n return \"\";\n }\n };\n\n public readonly MainInk = () =>\n this.ParseUntil(\n this.CommentsAndNewlines,\n this._commentOrNewlineStartCharacter,\n null\n );\n\n public readonly CommentsAndNewlines = () => {\n let newLines: string[] = this.Interleave<string>(\n this.Optional(this.ParseNewline),\n this.Optional(this.ParseSingleComment)\n );\n\n if (newLines !== null) {\n return newLines.join(\"\");\n }\n\n return null;\n };\n\n // Valid comments always return either an empty string or pure newlines,\n // which we want to keep so that line numbers stay the same\n public readonly ParseSingleComment = () =>\n this.OneOf([this.EndOfLineComment, this.BlockComment]);\n\n public readonly EndOfLineComment = () => {\n if (this.ParseString(\"//\") === null) {\n return null;\n }\n\n this.ParseUntilCharactersFromCharSet(this._newlineCharacters);\n\n return \"\";\n };\n\n public readonly BlockComment = () => {\n if (this.ParseString(\"/*\") === null) {\n return null;\n }\n\n const startLineIndex: number = this.lineIndex;\n const commentResult = this.ParseUntil(\n this.String(\"*/\"),\n this._commentBlockEndCharacter,\n null\n );\n\n if (!this.endOfInput) {\n this.ParseString(\"*/\");\n }\n\n // Count the number of lines that were inside the block, and replicate them as newlines\n // so that the line indexing still works from the original source\n if (commentResult != null) {\n return \"\\n\".repeat(this.lineIndex - startLineIndex);\n }\n\n // No comment at all\n return null;\n };\n\n public PreProcessInputString(str: string): string {\n return str;\n }\n}\n","export enum FlowLevel {\n Story, // 0\n Knot, // 1\n Stitch, // 2\n // not actually a FlowBase, but used for diverts\n WeavePoint, // 3\n}\n","import { ConditionalSingleBranch } from \"./ConditionalSingleBranch\";\nimport { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { ControlCommand as RuntimeControlCommand } from \"../../../../engine/ControlCommand\";\nimport { Expression } from \"../Expression/Expression\";\nimport { ParsedObject } from \"../Object\";\nimport { InkObject as RuntimeObject } from \"../../../../engine/Object\";\nimport { Story } from \"../Story\";\n\nexport class Conditional extends ParsedObject {\n private _reJoinTarget: RuntimeControlCommand | null = null;\n\n constructor(\n public initialCondition: Expression,\n public branches: ConditionalSingleBranch[]\n ) {\n super();\n\n if (this.initialCondition) {\n this.AddContent(this.initialCondition);\n }\n\n if (this.branches !== null) {\n this.AddContent(this.branches);\n }\n }\n\n get typeName(): string {\n return \"Conditional\";\n }\n\n public readonly GenerateRuntimeObject = (): RuntimeObject => {\n const container = new RuntimeContainer();\n\n // Initial condition\n if (this.initialCondition) {\n container.AddContent(this.initialCondition.runtimeObject);\n }\n\n // Individual branches\n for (const branch of this.branches) {\n const branchContainer = branch.runtimeObject;\n container.AddContent(branchContainer);\n }\n\n // If it's a switch-like conditional, each branch\n // will have a \"duplicate\" operation for the original\n // switched value. If there's no final else clause\n // and we fall all the way through, we need to clean up.\n // (An else clause doesn't dup but it *does* pop)\n if (\n this.initialCondition !== null &&\n this.branches[0].ownExpression !== null &&\n !this.branches[this.branches.length - 1].isElse\n ) {\n container.AddContent(RuntimeControlCommand.PopEvaluatedValue());\n }\n\n // Target for branches to rejoin to\n this._reJoinTarget = RuntimeControlCommand.NoOp();\n container.AddContent(this._reJoinTarget);\n\n return container;\n };\n\n public ResolveReferences(context: Story): void {\n const pathToReJoin = this._reJoinTarget!.path;\n\n for (const branch of this.branches) {\n if (!branch.returnDivert) {\n throw new Error();\n }\n\n branch.returnDivert.targetPath = pathToReJoin;\n }\n\n super.ResolveReferences(context);\n }\n}\n","import { ParsedObject } from \"./Object\";\nimport { InkObject as RuntimeObject } from \"../../../engine/Object\";\nimport { StringValue } from \"../../../engine/Value\";\n\nexport class Text extends ParsedObject {\n constructor(public text: string) {\n super();\n }\n get typeName(): string {\n return \"Text\";\n }\n\n public readonly GenerateRuntimeObject = (): RuntimeObject =>\n new StringValue(this.text);\n\n public readonly toString = (): string => this.text;\n}\n","import { Expression } from \"../Expression/Expression\";\nimport { ParsedObject } from \"../Object\";\nimport { InkObject as RuntimeObject } from \"../../../../engine/Object\";\nimport { Story } from \"../Story\";\nimport { SymbolType } from \"../SymbolType\";\nimport { Identifier } from \"../Identifier\";\n\nexport class ConstantDeclaration extends ParsedObject {\n get constantName(): string | undefined {\n return this.constantIdentifier?.name;\n }\n public constantIdentifier: Identifier;\n\n private _expression: Expression | null = null;\n\n get expression(): Expression {\n if (!this._expression) {\n throw new Error();\n }\n\n return this._expression;\n }\n\n constructor(name: Identifier, assignedExpression: Expression) {\n super();\n\n this.constantIdentifier = name;\n\n // Defensive programming in case parsing of assignedExpression failed\n if (assignedExpression) {\n this._expression = this.AddContent(assignedExpression) as Expression;\n }\n }\n\n get typeName(): string {\n return \"CONST\";\n }\n\n public readonly GenerateRuntimeObject = (): RuntimeObject | null => {\n // Global declarations don't generate actual procedural\n // runtime objects, but instead add a global variable to the story itself.\n // The story then initialises them all in one go at the start of the game.\n return null;\n };\n\n public ResolveReferences(context: Story) {\n super.ResolveReferences(context);\n context.CheckForNamingCollisions(\n this,\n this.constantIdentifier,\n SymbolType.Var\n );\n }\n}\n","import { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { INamedContent } from \"../../../../engine/INamedContent\";\nimport { IWeavePoint } from \"../IWeavePoint\";\nimport { ParsedObject } from \"../Object\";\nimport { InkObject as RuntimeObject } from \"../../../../engine/Object\";\nimport { Story } from \"../Story\";\nimport { SymbolType } from \"../SymbolType\";\nimport { Identifier } from \"../Identifier\";\n\nexport class Gather extends ParsedObject implements INamedContent, IWeavePoint {\n get name(): string | null {\n return this.identifier?.name || null;\n }\n public identifier?: Identifier;\n\n get runtimeContainer(): RuntimeContainer {\n return this.runtimeObject as RuntimeContainer;\n }\n\n constructor(\n identifier: Identifier | null,\n public readonly indentationDepth: number\n ) {\n super();\n\n if (identifier) this.identifier = identifier;\n }\n\n get typeName(): string {\n return \"Gather\";\n }\n\n public readonly GenerateRuntimeObject = (): RuntimeObject => {\n const container = new RuntimeContainer();\n container.name = this.name;\n\n if (this.story.countAllVisits) {\n container.visitsShouldBeCounted = true;\n }\n\n container.countingAtStartOnly = true;\n\n // A gather can have null content, e.g. it's just purely a line with \"-\"\n if (this.content) {\n for (const c of this.content) {\n container.AddContent(c.runtimeObject);\n }\n }\n\n return container;\n };\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n\n if (this.identifier && (this.identifier.name || \"\").length > 0) {\n context.CheckForNamingCollisions(\n this,\n this.identifier,\n SymbolType.SubFlowAndWeave\n );\n }\n }\n\n public readonly toString = (): string =>\n `- ${this.identifier?.name ? \"(\" + this.identifier?.name + \")\" : \"gather\"}`;\n}\n","import { asOrNull, filterUndef } from \"../../../engine/TypeAssertion\";\nimport { FlowBase } from \"./Flow/FlowBase\";\nimport { FlowLevel } from \"./Flow/FlowLevel\";\nimport { Identifier } from \"./Identifier\";\nimport { ParsedObject } from \"./Object\";\nimport { Weave } from \"./Weave\";\n\nexport class Path {\n private _baseTargetLevel: FlowLevel | null;\n private components: Identifier[] | null;\n\n get baseTargetLevel() {\n if (this.baseLevelIsAmbiguous) {\n return FlowLevel.Story;\n }\n\n return this._baseTargetLevel;\n }\n\n get baseLevelIsAmbiguous(): boolean {\n return !this._baseTargetLevel;\n }\n\n get firstComponent(): string | null {\n if (this.components == null || !this.components.length) {\n return null;\n }\n\n return this.components[0].name;\n }\n\n get numberOfComponents(): number {\n return this.components ? this.components.length : 0;\n }\n\n private _dotSeparatedComponents: string | null = null;\n\n get dotSeparatedComponents(): string {\n if (this._dotSeparatedComponents == null) {\n this._dotSeparatedComponents = (this.components ? this.components : [])\n .map((c) => c.name)\n .filter(filterUndef)\n .join(\".\");\n }\n return this._dotSeparatedComponents;\n }\n\n constructor(\n argOne: FlowLevel | Identifier[] | Identifier,\n argTwo?: Identifier[]\n ) {\n if (Object.values(FlowLevel).includes(argOne as FlowLevel)) {\n this._baseTargetLevel = argOne as FlowLevel;\n this.components = argTwo || [];\n } else if (Array.isArray(argOne)) {\n this._baseTargetLevel = null;\n this.components = argOne || [];\n } else {\n this._baseTargetLevel = null;\n this.components = [argOne as Identifier];\n }\n }\n\n get typeName(): string {\n return \"Path\";\n }\n\n public readonly toString = (): string => {\n if (this.components === null || this.components.length === 0) {\n if (this.baseTargetLevel === FlowLevel.WeavePoint) {\n return \"-> <next gather point>\";\n }\n\n return \"<invalid Path>\";\n }\n\n return `-> ${this.dotSeparatedComponents}`;\n };\n\n public readonly ResolveFromContext = (\n context: ParsedObject\n ): ParsedObject | null => {\n if (this.components == null || this.components.length == 0) {\n return null;\n }\n\n // Find base target of path from current context. e.g.\n // ==> BASE.sub.sub\n let baseTargetObject = this.ResolveBaseTarget(context);\n if (baseTargetObject === null) {\n return null;\n }\n\n // Given base of path, resolve final target by working deeper into hierarchy\n // e.g. ==> base.mid.FINAL\n if (this.components.length > 1) {\n return this.ResolveTailComponents(baseTargetObject);\n }\n\n return baseTargetObject;\n };\n\n // Find the root object from the base, i.e. root from:\n // root.sub1.sub2\n public readonly ResolveBaseTarget = (\n originalContext: ParsedObject\n ): ParsedObject | null => {\n const firstComp = this.firstComponent;\n\n // Work up the ancestry to find the node that has the named object\n let ancestorContext: ParsedObject | null = originalContext;\n while (ancestorContext) {\n // Only allow deep search when searching deeper from original context.\n // Don't allow search upward *then* downward, since that's searching *everywhere*!\n // Allowed examples:\n // - From an inner gather of a stitch, you should search up to find a knot called 'x'\n // at the root of a story, but not a stitch called 'x' in that knot.\n // - However, from within a knot, you should be able to find a gather/choice\n // anywhere called 'x'\n // (that latter example is quite loose, but we allow it)\n const deepSearch: boolean = ancestorContext === originalContext;\n\n const foundBase = this.GetChildFromContext(\n ancestorContext,\n firstComp,\n null,\n deepSearch\n );\n\n if (foundBase) {\n return foundBase;\n }\n\n ancestorContext = ancestorContext.parent;\n }\n\n return null;\n };\n\n // Find the final child from path given root, i.e.:\n // root.sub.finalChild\n public readonly ResolveTailComponents = (\n rootTarget: ParsedObject\n ): ParsedObject | null => {\n let foundComponent: ParsedObject | null = rootTarget;\n\n if (!this.components) return null;\n\n for (let ii = 1; ii < this.components.length; ++ii) {\n const compName = this.components[ii].name;\n\n let minimumExpectedLevel: FlowLevel;\n let foundFlow = asOrNull(foundComponent, FlowBase);\n if (foundFlow !== null) {\n minimumExpectedLevel = (foundFlow.flowLevel + 1) as FlowLevel;\n } else {\n minimumExpectedLevel = FlowLevel.WeavePoint;\n }\n\n foundComponent = this.GetChildFromContext(\n foundComponent,\n compName,\n minimumExpectedLevel\n );\n\n if (foundComponent === null) {\n break;\n }\n }\n\n return foundComponent;\n };\n\n // See whether \"context\" contains a child with a given name at a given flow level\n // Can either be a named knot/stitch (a FlowBase) or a weave point within a Weave (Choice or Gather)\n // This function also ignores any other object types that are neither FlowBase nor Weave.\n // Called from both ResolveBase (force deep) and ResolveTail for the individual components.\n public readonly GetChildFromContext = (\n context: ParsedObject,\n childName: string | null,\n minimumLevel: FlowLevel | null,\n forceDeepSearch: boolean = false\n ): ParsedObject | null => {\n // null childLevel means that we don't know where to find it\n const ambiguousChildLevel: boolean = minimumLevel === null;\n\n // Search for WeavePoint within Weave\n const weaveContext = asOrNull(context, Weave);\n if (\n childName &&\n weaveContext !== null &&\n (ambiguousChildLevel || minimumLevel === FlowLevel.WeavePoint)\n ) {\n return weaveContext.WeavePointNamed(childName) as ParsedObject;\n }\n\n // Search for content within Flow (either a sub-Flow or a WeavePoint)\n let flowContext = asOrNull(context, FlowBase);\n if (childName && flowContext !== null) {\n // When searching within a Knot, allow a deep searches so that\n // named weave points (choices and gathers) can be found within any stitch\n // Otherwise, we just search within the immediate object.\n const shouldDeepSearch =\n forceDeepSearch || flowContext.flowLevel === FlowLevel.Knot;\n\n return flowContext.ContentWithNameAtLevel(\n childName,\n minimumLevel,\n shouldDeepSearch\n );\n }\n\n return null;\n };\n}\n","import { Expression } from \"./Expression/Expression\";\nimport { ParsedObject } from \"./Object\";\nimport { Container as RuntimeContainer } from \"../../../engine/Container\";\nimport { ControlCommand as RuntimeControlCommand } from \"../../../engine/ControlCommand\";\nimport { InkObject as RuntimeObject } from \"../../../engine/Object\";\nimport { Void } from \"../../../engine/Void\";\n\nexport class ReturnType extends ParsedObject {\n public returnedExpression: Expression | null = null;\n\n constructor(returnedExpression: Expression | null = null) {\n super();\n\n if (returnedExpression) {\n this.returnedExpression = this.AddContent(\n returnedExpression\n ) as Expression;\n }\n }\n\n get typeName(): string {\n return \"ReturnType\";\n }\n\n public readonly GenerateRuntimeObject = (): RuntimeObject => {\n const container = new RuntimeContainer();\n\n if (this.returnedExpression) {\n // Evaluate expression\n container.AddContent(this.returnedExpression.runtimeObject);\n } else {\n // Return Runtime.Void when there's no expression to evaluate\n // (This evaluation will just add the Void object to the evaluation stack)\n container.AddContent(RuntimeControlCommand.EvalStart());\n container.AddContent(new Void());\n container.AddContent(RuntimeControlCommand.EvalEnd());\n }\n\n // Then pop the call stack\n // (the evaluated expression will leave the return value on the evaluation stack)\n container.AddContent(RuntimeControlCommand.PopFunction());\n\n return container;\n };\n}\n","// import { FlowBase } from './FlowBase';\n\nexport function ClosestFlowBase(obj: any): any | null {\n let ancestor = obj.parent;\n while (ancestor) {\n if (ancestor.hasOwnProperty(\"iamFlowbase\") && ancestor.iamFlowbase()) {\n return ancestor as any;\n }\n\n ancestor = ancestor.parent;\n }\n\n return null;\n}\n","import { DebugMetadata } from \"../../../engine/DebugMetadata\";\n\nexport class Identifier {\n public name: string;\n public debugMetadata: DebugMetadata | null = null;\n\n constructor(name: string) {\n this.name = name;\n }\n\n get typeName(): string {\n return \"Identifier\";\n }\n\n public static Done(): Identifier {\n return new Identifier(\"DONE\");\n }\n\n public readonly toString = (): string => this.name || \"undefined identifer\";\n}\n","import { Argument } from \"../Argument\";\nimport { Choice } from \"../Choice\";\nimport { Divert } from \"../Divert/Divert\";\nimport { DivertTarget } from \"../Divert/DivertTarget\";\nimport { FlowLevel } from \"./FlowLevel\";\nimport { Gather } from \"../Gather/Gather\";\nimport { INamedContent } from \"../../../../engine/INamedContent\";\n// import { Knot } from '../Knot';\nimport { ParsedObject } from \"../Object\";\nimport { Path } from \"../Path\";\nimport { ReturnType } from \"../ReturnType\";\nimport { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { Divert as RuntimeDivert } from \"../../../../engine/Divert\";\nimport { InkObject as RuntimeObject } from \"../../../../engine/Object\";\nimport { VariableAssignment as RuntimeVariableAssignment } from \"../../../../engine/VariableAssignment\";\n//import { Story } from '../Story';\nimport { SymbolType } from \"../SymbolType\";\nimport { VariableAssignment } from \"../Variable/VariableAssignment\";\nimport { Weave } from \"../Weave\";\nimport { ClosestFlowBase } from \"./ClosestFlowBase\";\nimport { Identifier } from \"../Identifier\";\nimport { asOrNull } from \"../../../../engine/TypeAssertion\";\n\ntype VariableResolveResult = {\n found: boolean;\n isGlobal: boolean;\n isArgument: boolean;\n isTemporary: boolean;\n ownerFlow: FlowBase;\n};\n\n// Base class for Knots and Stitches\nexport abstract class FlowBase extends ParsedObject implements INamedContent {\n public abstract readonly flowLevel: FlowLevel;\n\n public _rootWeave: Weave | null = null;\n public _subFlowsByName: Map<string, FlowBase> = new Map();\n public _startingSubFlowDivert: RuntimeDivert | null = null;\n public _startingSubFlowRuntime: RuntimeObject | null = null;\n public _firstChildFlow: FlowBase | null = null;\n public variableDeclarations: Map<string, VariableAssignment> = new Map();\n\n get hasParameters() {\n return this.args !== null && this.args.length > 0;\n }\n\n get subFlowsByName() {\n return this._subFlowsByName;\n }\n\n get typeName(): string {\n if (this.isFunction) {\n return \"Function\";\n }\n\n return String(this.flowLevel);\n }\n\n get name(): string | null {\n return this.identifier?.name || null;\n }\n\n public identifier: Identifier | null = null;\n public args: Argument[] | null = null;\n\n constructor(\n identifier: Identifier | null,\n topLevelObjects: ParsedObject[] | null = null,\n args: Argument[] | null = null,\n public readonly isFunction: boolean = false,\n isIncludedStory: boolean = false\n ) {\n super();\n\n this.identifier = identifier;\n this.args = args;\n\n if (topLevelObjects === null) {\n topLevelObjects = [];\n }\n\n // Used by story to add includes\n this.PreProcessTopLevelObjects(topLevelObjects);\n\n topLevelObjects = this.SplitWeaveAndSubFlowContent(\n topLevelObjects,\n this.GetType() == \"Story\" && !isIncludedStory\n );\n\n this.AddContent(topLevelObjects);\n }\n\n public iamFlowbase = () => true;\n\n public readonly SplitWeaveAndSubFlowContent = (\n contentObjs: ParsedObject[],\n isRootStory: boolean\n ): ParsedObject[] => {\n const weaveObjs: ParsedObject[] = [];\n const subFlowObjs: ParsedObject[] = [];\n\n this._subFlowsByName = new Map();\n\n for (const obj of contentObjs) {\n const subFlow = asOrNull(obj, FlowBase);\n if (subFlow) {\n if (this._firstChildFlow === null) {\n this._firstChildFlow = subFlow;\n }\n\n subFlowObjs.push(obj);\n if (subFlow.identifier?.name) {\n this._subFlowsByName.set(subFlow.identifier?.name, subFlow);\n }\n } else {\n weaveObjs.push(obj);\n }\n }\n\n // Implicit final gather in top level story for ending without warning that you run out of content\n if (isRootStory) {\n weaveObjs.push(\n new Gather(null, 1),\n new Divert(new Path(Identifier.Done()))\n );\n }\n\n const finalContent: ParsedObject[] = [];\n\n if (weaveObjs.length > 0) {\n this._rootWeave = new Weave(weaveObjs, 0);\n finalContent.push(this._rootWeave);\n }\n\n if (subFlowObjs.length > 0) {\n finalContent.push(...subFlowObjs);\n }\n return finalContent;\n };\n\n public PreProcessTopLevelObjects(_: ParsedObject[]): void {\n // empty by default, used by Story to process included file references\n }\n\n public VariableResolveResult?: VariableResolveResult | null | undefined;\n\n public ResolveVariableWithName = (\n varName: string,\n fromNode: ParsedObject\n ): VariableResolveResult => {\n const result: VariableResolveResult = {} as any;\n\n // Search in the stitch / knot that owns the node first\n const ownerFlow = fromNode === null ? this : ClosestFlowBase(fromNode);\n\n if (ownerFlow) {\n // Argument\n if (ownerFlow.args !== null) {\n for (const arg of ownerFlow.args) {\n if (arg.identifier?.name === varName) {\n result.found = true;\n result.isArgument = true;\n result.ownerFlow = ownerFlow;\n return result;\n }\n }\n }\n\n // Temp\n if (\n ownerFlow !== this.story &&\n ownerFlow.variableDeclarations.has(varName)\n ) {\n result.found = true;\n result.ownerFlow = ownerFlow;\n result.isTemporary = true;\n\n return result;\n }\n }\n\n // Global\n if (this.story.variableDeclarations.has(varName)) {\n result.found = true;\n result.ownerFlow = this.story;\n result.isGlobal = true;\n\n return result;\n }\n\n result.found = false;\n\n return result;\n };\n\n public AddNewVariableDeclaration = (varDecl: VariableAssignment): void => {\n const varName = varDecl.variableName;\n if (this.variableDeclarations.has(varName)) {\n const varab = this.variableDeclarations.get(varName)!;\n let prevDeclError = \"\";\n const debugMetadata = varab.debugMetadata;\n if (debugMetadata) {\n prevDeclError = ` (${varab.debugMetadata})`;\n }\n\n this.Error(\n `found declaration variable '${varName}' that was already declared${prevDeclError}`,\n varDecl,\n false\n );\n\n return;\n }\n\n this.variableDeclarations.set(varDecl.variableName, varDecl);\n };\n\n public ResolveWeavePointNaming = (): void => {\n // Find all weave points and organise them by name ready for\n // diverting. Also detect naming collisions.\n if (this._rootWeave) {\n this._rootWeave.ResolveWeavePointNaming();\n }\n\n for (const [, value] of this._subFlowsByName) {\n if (value.hasOwnProperty(\"ResolveWeavePointNaming\")) {\n value.ResolveWeavePointNaming();\n }\n }\n };\n\n public readonly GenerateRuntimeObject = (): RuntimeObject => {\n let foundReturn: ReturnType | null = null;\n if (this.isFunction) {\n this.CheckForDisallowedFunctionFlowControl();\n } else if (\n this.flowLevel === FlowLevel.Knot ||\n this.flowLevel === FlowLevel.Stitch\n ) {\n // Non-functon: Make sure knots and stitches don't attempt to use Return statement\n foundReturn = this.Find(ReturnType)();\n\n if (foundReturn !== null) {\n this.Error(\n `Return statements can only be used in knots that are declared as functions: == function ${this.identifier} ==`,\n foundReturn\n );\n }\n }\n\n const container = new RuntimeContainer();\n container.name = this.identifier?.name as string;\n\n if (this.story.countAllVisits) {\n container.visitsShouldBeCounted = true;\n }\n\n this.GenerateArgumentVariableAssignments(container);\n\n // Run through content defined for this knot/stitch:\n // - First of all, any initial content before a sub-stitch\n // or any weave content is added to the main content container\n // - The first inner knot/stitch is automatically entered, while\n // the others are only accessible by an explicit divert\n // - The exception to this rule is if the knot/stitch takes\n // parameters, in which case it can't be auto-entered.\n // - Any Choices and Gathers (i.e. IWeavePoint) found are\n // processsed by GenerateFlowContent.\n let contentIdx: number = 0;\n while (this.content !== null && contentIdx < this.content.length) {\n const obj: ParsedObject = this.content[contentIdx];\n\n // Inner knots and stitches\n if (obj instanceof FlowBase) {\n const childFlow: FlowBase = obj;\n const childFlowRuntime = childFlow.runtimeObject;\n\n // First inner stitch - automatically step into it\n // 20/09/2016 - let's not auto step into knots\n if (\n contentIdx === 0 &&\n !childFlow.hasParameters &&\n this.flowLevel === FlowLevel.Knot\n ) {\n this._startingSubFlowDivert = new RuntimeDivert();\n container.AddContent(this._startingSubFlowDivert);\n this._startingSubFlowRuntime = childFlowRuntime;\n }\n\n // Check for duplicate knots/stitches with same name\n const namedChild = childFlowRuntime as RuntimeObject & INamedContent;\n const existingChild: INamedContent | null =\n container.namedContent.get(namedChild.name!) || null;\n\n if (existingChild) {\n const errorMsg = `${this.GetType()} already contains flow named '${\n namedChild.name\n }' (at ${(existingChild as any as RuntimeObject).debugMetadata})`;\n this.Error(errorMsg, childFlow);\n }\n\n container.AddToNamedContentOnly(namedChild);\n } else if (obj) {\n // Other content (including entire Weaves that were grouped in the constructor)\n // At the time of writing, all FlowBases have a maximum of one piece of \"other content\"\n // and it's always the root Weave\n container.AddContent(obj.runtimeObject);\n }\n\n contentIdx += 1;\n }\n\n // CHECK FOR FINAL LOOSE ENDS!\n // Notes:\n // - Functions don't need to terminate - they just implicitly return\n // - If return statement was found, don't continue finding warnings for missing control flow,\n // since it's likely that a return statement has been used instead of a ->-> or something,\n // or the writer failed to mark the knot as a function.\n // - _rootWeave may be null if it's a knot that only has stitches\n if (\n this.flowLevel !== FlowLevel.Story &&\n !this.isFunction &&\n this._rootWeave !== null &&\n foundReturn === null\n ) {\n this._rootWeave.ValidateTermination(this.WarningInTermination);\n }\n\n return container;\n };\n\n public readonly GenerateArgumentVariableAssignments = (\n container: RuntimeContainer\n ): void => {\n if (this.args === null || this.args.length === 0) {\n return;\n }\n\n // Assign parameters in reverse since they'll be popped off the evaluation stack\n // No need to generate EvalStart and EvalEnd since there's nothing being pushed\n // back onto the evaluation stack.\n for (let ii = this.args.length - 1; ii >= 0; --ii) {\n const paramName = this.args[ii].identifier?.name || null;\n const assign = new RuntimeVariableAssignment(paramName, true);\n container.AddContent(assign);\n }\n };\n\n public readonly ContentWithNameAtLevel = (\n name: string,\n level: FlowLevel | null = null,\n deepSearch: boolean = false\n ): ParsedObject | null => {\n // Referencing self?\n if (level === this.flowLevel || level === null) {\n if (name === this.identifier?.name) {\n return this;\n }\n }\n\n if (level === FlowLevel.WeavePoint || level === null) {\n let weavePointResult: ParsedObject | null = null;\n\n if (this._rootWeave) {\n weavePointResult = this._rootWeave.WeavePointNamed(\n name\n ) as ParsedObject;\n if (weavePointResult) {\n return weavePointResult;\n }\n }\n\n // Stop now if we only wanted a result if it's a weave point?\n if (level === FlowLevel.WeavePoint) {\n return deepSearch ? this.DeepSearchForAnyLevelContent(name) : null;\n }\n }\n\n // If this flow would be incapable of containing the requested level, early out\n // (e.g. asking for a Knot from a Stitch)\n if (level !== null && level < this.flowLevel) {\n return null;\n }\n\n let subFlow: FlowBase | null = this._subFlowsByName.get(name) || null;\n\n if (subFlow && (level === null || level === subFlow.flowLevel)) {\n return subFlow;\n }\n\n return deepSearch ? this.DeepSearchForAnyLevelContent(name) : null;\n };\n\n public readonly DeepSearchForAnyLevelContent = (name: string) => {\n const weaveResultSelf = this.ContentWithNameAtLevel(\n name,\n FlowLevel.WeavePoint,\n false\n );\n\n if (weaveResultSelf) {\n return weaveResultSelf;\n }\n\n for (const [, value] of this._subFlowsByName) {\n const deepResult = value.ContentWithNameAtLevel(name, null, true);\n\n if (deepResult) {\n return deepResult;\n }\n }\n\n return null;\n };\n\n public ResolveReferences(context: any): void {\n if (this._startingSubFlowDivert) {\n if (!this._startingSubFlowRuntime) {\n throw new Error();\n }\n\n this._startingSubFlowDivert.targetPath =\n this._startingSubFlowRuntime.path;\n }\n\n super.ResolveReferences(context);\n\n // Check validity of parameter names\n if (this.args !== null) {\n for (const arg of this.args) {\n context.CheckForNamingCollisions(\n this,\n arg.identifier,\n SymbolType.Arg,\n \"argument\"\n );\n }\n\n // Separately, check for duplicate arugment names, since they aren't Parsed.Objects,\n // so have to be checked independently.\n for (let ii = 0; ii < this.args.length; ii += 1) {\n for (let jj = ii + 1; jj < this.args.length; jj += 1) {\n if (\n this.args[ii].identifier?.name == this.args[jj].identifier?.name\n ) {\n this.Error(\n `Multiple arguments with the same name: '${this.args[ii].identifier}'`\n );\n }\n }\n }\n }\n\n // Check naming collisions for knots and stitches\n if (this.flowLevel !== FlowLevel.Story) {\n // Weave points aren't FlowBases, so this will only be knot or stitch\n const symbolType =\n this.flowLevel === FlowLevel.Knot\n ? SymbolType.Knot\n : SymbolType.SubFlowAndWeave;\n\n context.CheckForNamingCollisions(this, this.identifier, symbolType);\n }\n }\n\n public readonly CheckForDisallowedFunctionFlowControl = (): void => {\n // if (!(this instanceof Knot)) { // cannont use Knot here because of circular dependancy\n if (this.flowLevel !== FlowLevel.Knot) {\n this.Error(\n \"Functions cannot be stitches - i.e. they should be defined as '== function myFunc ==' rather than internal to another knot.\"\n );\n }\n\n // Not allowed sub-flows\n for (const [key, value] of this._subFlowsByName) {\n this.Error(\n `Functions may not contain stitches, but saw '${key}' within the function '${this.identifier}'`,\n value\n );\n }\n\n if (!this._rootWeave) {\n throw new Error();\n }\n\n const allDiverts = this._rootWeave.FindAll<Divert>(Divert)();\n for (const divert of allDiverts) {\n if (!divert.isFunctionCall && !(divert.parent instanceof DivertTarget)) {\n this.Error(\n `Functions may not contain diverts, but saw '${divert}'`,\n divert\n );\n }\n }\n\n const allChoices = this._rootWeave.FindAll<Choice>(Choice)();\n for (const choice of allChoices) {\n this.Error(\n `Functions may not contain choices, but saw '${choice}'`,\n choice\n );\n }\n };\n\n public readonly WarningInTermination = (terminatingObject: ParsedObject) => {\n let message: string =\n \"Apparent loose end exists where the flow runs out. Do you need a '-> DONE' statement, choice or divert?\";\n if (terminatingObject.parent === this._rootWeave && this._firstChildFlow) {\n message = `${message} Note that if you intend to enter '${this._firstChildFlow.identifier}' next, you need to divert to it explicitly.`;\n }\n\n const terminatingDivert = asOrNull(terminatingObject, Divert);\n if (terminatingDivert && terminatingDivert.isTunnel) {\n message += ` When final tunnel to '${terminatingDivert.target} ->' returns it won't have anywhere to go.`;\n }\n\n this.Warning(message, terminatingObject);\n };\n\n public readonly toString = (): string =>\n `${this.typeName} '${this.identifier}'`;\n}\n","import { Container as RuntimeContainer } from \"../../../engine/Container\";\nimport { ParsedObject } from \"./Object\";\nimport { InkObject as RuntimeObject } from \"../../../engine/Object\";\nimport { Text } from \"./Text\";\nimport { asOrNull } from \"../../../engine/TypeAssertion\";\n\nexport class ContentList extends ParsedObject {\n public dontFlatten: boolean = false;\n\n get runtimeContainer(): RuntimeContainer {\n return this.runtimeObject as RuntimeContainer;\n }\n\n constructor(objects?: ParsedObject[], ...moreObjects: ParsedObject[]) {\n super();\n\n if (objects) {\n this.AddContent(objects);\n }\n\n if (moreObjects) {\n this.AddContent(moreObjects);\n }\n }\n\n get typeName(): string {\n return \"ContentList\";\n }\n\n public readonly TrimTrailingWhitespace = (): void => {\n for (let ii = this.content.length - 1; ii >= 0; --ii) {\n const text = asOrNull(this.content[ii], Text);\n if (text === null) {\n break;\n }\n\n text.text = text.text.replace(new RegExp(/[ \\t]/g), \"\");\n if (text.text.length === 0) {\n this.content.splice(ii, 1);\n } else {\n break;\n }\n }\n };\n\n public readonly GenerateRuntimeObject = (): RuntimeObject => {\n const container = new RuntimeContainer();\n if (this.content !== null) {\n for (const obj of this.content) {\n const contentObjRuntime = obj.runtimeObject;\n\n // Some objects (e.g. author warnings) don't generate runtime objects\n if (contentObjRuntime) {\n container.AddContent(contentObjRuntime);\n }\n }\n }\n\n if (this.dontFlatten) {\n this.story.DontFlattenContainer(container);\n }\n\n return container;\n };\n\n public toString = (): string => `ContentList(${this.content.join(\", \")})`;\n}\n","import { InkObject } from \"./Object\";\nimport { Path } from \"./Path\";\n\nexport class VariableReference extends InkObject {\n public name: string | null;\n public pathForCount: Path | null = null;\n\n get containerForCount() {\n if (this.pathForCount === null) return null;\n return this.ResolvePath(this.pathForCount).container;\n }\n get pathStringForCount() {\n if (this.pathForCount === null) return null;\n\n return this.CompactPathString(this.pathForCount);\n }\n set pathStringForCount(value: string | null) {\n if (value === null) this.pathForCount = null;\n else this.pathForCount = new Path(value);\n }\n\n constructor(name: string | null = null) {\n super();\n this.name = name;\n }\n\n public toString() {\n if (this.name != null) {\n return \"var(\" + this.name + \")\";\n } else {\n let pathStr = this.pathStringForCount;\n return \"read_count(\" + pathStr + \")\";\n }\n }\n}\n","import { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { ContentList } from \"../ContentList\";\nimport { Expression } from \"../Expression/Expression\";\nimport { FlowBase } from \"../Flow/FlowBase\";\nimport { ParsedObject } from \"../Object\";\nimport { Path } from \"../Path\";\nimport { Story } from \"../Story\";\nimport { VariableReference as RuntimeVariableReference } from \"../../../../engine/VariableReference\";\nimport { Weave } from \"../Weave\";\nimport { Identifier } from \"../Identifier\";\nimport { asOrNull, filterUndef } from \"../../../../engine/TypeAssertion\";\n\nexport class VariableReference extends Expression {\n private _runtimeVarRef: RuntimeVariableReference | null = null;\n\n // - Normal variables have a single item in their \"path\"\n // - Knot/stitch names for read counts are actual dot-separated paths\n // (though this isn't actually used at time of writing)\n // - List names are dot separated: listName.itemName (or just itemName)\n get name() {\n return this.path.join(\".\");\n }\n\n get path(): string[] {\n return this.pathIdentifiers.map((id) => id.name!).filter(filterUndef);\n }\n\n get identifier(): Identifier | null {\n if (!this.pathIdentifiers || this.pathIdentifiers.length == 0) {\n return null;\n }\n const name = this.path.join(\".\");\n const id = new Identifier(name);\n\n return id;\n }\n\n // Only known after GenerateIntoContainer has run\n public isConstantReference: boolean = false;\n public isListItemReference: boolean = false;\n\n get runtimeVarRef() {\n return this._runtimeVarRef;\n }\n\n constructor(public readonly pathIdentifiers: Identifier[]) {\n super();\n }\n\n get typeName(): string {\n return \"ref\";\n }\n\n public readonly GenerateIntoContainer = (\n container: RuntimeContainer\n ): void => {\n let constantValue: Expression | null | undefined = this.story.constants.get(\n this.name\n );\n\n // If it's a constant reference, just generate the literal expression value\n // It's okay to access the constants at code generation time, since the\n // first thing the ExportRuntime function does it search for all the constants\n // in the story hierarchy, so they're all available.\n if (constantValue) {\n constantValue.GenerateConstantIntoContainer(container);\n this.isConstantReference = true;\n\n return;\n }\n\n this._runtimeVarRef = new RuntimeVariableReference(this.name);\n\n // List item reference?\n // Path might be to a list (listName.listItemName or just listItemName)\n if (this.path.length === 1 || this.path.length === 2) {\n let listItemName: string = \"\";\n let listName: string = \"\";\n\n if (this.path.length === 1) {\n listItemName = this.path[0];\n } else {\n listName = this.path[0];\n listItemName = this.path[1];\n }\n\n const listItem = this.story.ResolveListItem(listName, listItemName, this);\n\n if (listItem) {\n this.isListItemReference = true;\n }\n }\n\n container.AddContent(this._runtimeVarRef);\n };\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n\n // Work is already done if it's a constant or list item reference\n if (this.isConstantReference || this.isListItemReference) {\n return;\n }\n\n // Is it a read count?\n const parsedPath = new Path(this.pathIdentifiers);\n const targetForCount: ParsedObject | null =\n parsedPath.ResolveFromContext(this);\n if (targetForCount) {\n if (!targetForCount.containerForCounting) {\n throw new Error();\n }\n\n targetForCount.containerForCounting.visitsShouldBeCounted = true;\n\n // If this is an argument to a function that wants a variable to be\n // passed by reference, then the Parsed.Divert will have generated a\n // Runtime.VariablePointerValue instead of allowing this object\n // to generate its RuntimeVariableReference. This only happens under\n // error condition since we shouldn't be passing a read count by\n // reference, but we don't want it to crash!\n if (this._runtimeVarRef === null) {\n return;\n }\n\n this._runtimeVarRef.pathForCount = targetForCount.runtimePath;\n this._runtimeVarRef.name = null;\n\n // Check for very specific writer error: getting read count and\n // printing it as content rather than as a piece of logic\n // e.g. Writing {myFunc} instead of {myFunc()}\n let targetFlow = asOrNull(targetForCount, FlowBase);\n if (targetFlow && targetFlow.isFunction) {\n // Is parent context content rather than logic?\n if (\n this.parent instanceof Weave ||\n this.parent instanceof ContentList ||\n this.parent instanceof FlowBase\n ) {\n this.Warning(\n `'${targetFlow.identifier}' being used as read count rather than being called as function. Perhaps you intended to write ${targetFlow.identifier}()`\n );\n }\n }\n\n return;\n }\n\n // Couldn't find this multi-part path at all, whether as a divert\n // target or as a list item reference.\n if (this.path.length > 1) {\n let errorMsg = `Could not find target for read count: ${parsedPath}`;\n if (this.path.length <= 2) {\n errorMsg += `, or couldn't find list item with the name ${this.path.join(\n \",\"\n )}`;\n }\n\n this.Error(errorMsg);\n\n return;\n }\n\n if (!context.ResolveVariableWithName(this.name, this).found) {\n this.Error(`Unresolved variable: ${this.name}`, this);\n }\n }\n\n public readonly toString = (): string => `{${this.path.join(\".\")}}`;\n}\n","import { Container as RuntimeContainer } from \"../../../engine/Container\";\nimport { ControlCommand as RuntimeControlCommand } from \"../../../engine/ControlCommand\";\nimport { Divert } from \"./Divert/Divert\";\nimport { Divert as RuntimeDivert } from \"../../../engine/Divert\";\nimport { DivertTarget } from \"./Divert/DivertTarget\";\nimport { Expression } from \"./Expression/Expression\";\nimport { InkList as RuntimeInkList } from \"../../../engine/InkList\";\nimport { ListValue } from \"../../../engine/Value\";\nimport { NativeFunctionCall } from \"../../../engine/NativeFunctionCall\";\nimport { NumberExpression } from \"./Expression/NumberExpression\";\nimport { Path } from \"./Path\";\nimport { Story } from \"./Story\";\nimport { StringValue } from \"../../../engine/Value\";\nimport { VariableReference } from \"./Variable/VariableReference\";\nimport { Identifier } from \"./Identifier\";\nimport { asOrNull } from \"../../../engine/TypeAssertion\";\n\nexport class FunctionCall extends Expression {\n public static readonly IsBuiltIn = (name: string): boolean => {\n if (NativeFunctionCall.CallExistsWithName(name)) {\n return true;\n }\n\n return (\n name === \"CHOICE_COUNT\" ||\n name === \"TURNS_SINCE\" ||\n name === \"TURNS\" ||\n name === \"RANDOM\" ||\n name === \"SEED_RANDOM\" ||\n name === \"LIST_VALUE\" ||\n name === \"LIST_RANDOM\" ||\n name === \"READ_COUNT\"\n );\n };\n\n private _proxyDivert: Divert;\n get proxyDivert(): Divert {\n return this._proxyDivert;\n }\n private _divertTargetToCount: DivertTarget | null = null;\n private _variableReferenceToCount: VariableReference | null = null;\n\n get name(): string {\n return (this._proxyDivert.target as Path).firstComponent || \"\";\n }\n\n get args(): Expression[] {\n return this._proxyDivert.args;\n }\n\n get runtimeDivert(): RuntimeDivert {\n return this._proxyDivert.runtimeDivert;\n }\n\n get isChoiceCount(): boolean {\n return this.name === \"CHOICE_COUNT\";\n }\n\n get isTurns(): boolean {\n return this.name === \"TURNS\";\n }\n\n get isTurnsSince(): boolean {\n return this.name === \"TURNS_SINCE\";\n }\n\n get isRandom(): boolean {\n return this.name === \"RANDOM\";\n }\n\n get isSeedRandom(): boolean {\n return this.name === \"SEED_RANDOM\";\n }\n\n get isListRange(): boolean {\n return this.name === \"LIST_RANGE\";\n }\n\n get isListRandom(): boolean {\n return this.name === \"LIST_RANDOM\";\n }\n\n get isReadCount(): boolean {\n return this.name === \"READ_COUNT\";\n }\n\n public shouldPopReturnedValue: boolean = false;\n\n constructor(functionName: Identifier, args: Expression[]) {\n super();\n\n this._proxyDivert = new Divert(new Path(functionName), args);\n this._proxyDivert.isFunctionCall = true;\n this.AddContent(this._proxyDivert);\n }\n\n get typeName(): string {\n return \"FunctionCall\";\n }\n\n public readonly GenerateIntoContainer = (\n container: RuntimeContainer\n ): void => {\n const foundList = this.story.ResolveList(this.name);\n\n let usingProxyDivert: boolean = false;\n\n if (this.isChoiceCount) {\n if (this.args.length > 0) {\n this.Error(\"The CHOICE_COUNT() function shouldn't take any arguments\");\n }\n\n container.AddContent(RuntimeControlCommand.ChoiceCount());\n } else if (this.isTurns) {\n if (this.args.length > 0) {\n this.Error(\"The TURNS() function shouldn't take any arguments\");\n }\n\n container.AddContent(RuntimeControlCommand.Turns());\n } else if (this.isTurnsSince || this.isReadCount) {\n const divertTarget = asOrNull(this.args[0], DivertTarget);\n const variableDivertTarget = asOrNull(this.args[0], VariableReference);\n\n if (\n this.args.length !== 1 ||\n (divertTarget === null && variableDivertTarget === null)\n ) {\n this.Error(\n `The ${this.name}() function should take one argument: a divert target to the target knot, stitch, gather or choice you want to check. e.g. TURNS_SINCE(-> myKnot)`\n );\n return;\n }\n\n if (divertTarget) {\n this._divertTargetToCount = divertTarget;\n this.AddContent(this._divertTargetToCount);\n\n this._divertTargetToCount.GenerateIntoContainer(container);\n } else if (variableDivertTarget) {\n this._variableReferenceToCount = variableDivertTarget;\n this.AddContent(this._variableReferenceToCount);\n\n this._variableReferenceToCount.GenerateIntoContainer(container);\n }\n\n if (this.isTurnsSince) {\n container.AddContent(RuntimeControlCommand.TurnsSince());\n } else {\n container.AddContent(RuntimeControlCommand.ReadCount());\n }\n } else if (this.isRandom) {\n if (this.args.length !== 2) {\n this.Error(\n \"RANDOM should take 2 parameters: a minimum and a maximum integer\"\n );\n }\n\n // We can type check single values, but not complex expressions\n for (let ii = 0; ii < this.args.length; ii += 1) {\n const num = asOrNull(this.args[ii], NumberExpression);\n if (num && !num.isInt()) {\n const paramName: string = ii === 0 ? \"minimum\" : \"maximum\";\n this.Error(`RANDOM's ${paramName} parameter should be an integer`);\n }\n\n this.args[ii].GenerateIntoContainer(container);\n }\n\n container.AddContent(RuntimeControlCommand.Random());\n } else if (this.isSeedRandom) {\n if (this.args.length !== 1) {\n this.Error(\"SEED_RANDOM should take 1 parameter - an integer seed\");\n }\n\n const num = asOrNull(this.args[0], NumberExpression);\n if (num && !num.isInt()) {\n this.Error(\"SEED_RANDOM's parameter should be an integer seed\");\n }\n\n this.args[0].GenerateIntoContainer(container);\n\n container.AddContent(RuntimeControlCommand.SeedRandom());\n } else if (this.isListRange) {\n if (this.args.length !== 3) {\n this.Error(\n \"LIST_RANGE should take 3 parameters - a list, a min and a max\"\n );\n }\n\n for (let ii = 0; ii < this.args.length; ii += 1) {\n this.args[ii].GenerateIntoContainer(container);\n }\n\n container.AddContent(RuntimeControlCommand.ListRange());\n } else if (this.isListRandom) {\n if (this.args.length !== 1) {\n this.Error(\"LIST_RANDOM should take 1 parameter - a list\");\n }\n\n this.args[0].GenerateIntoContainer(container);\n\n container.AddContent(RuntimeControlCommand.ListRandom());\n } else if (NativeFunctionCall.CallExistsWithName(this.name)) {\n const nativeCall = NativeFunctionCall.CallWithName(this.name);\n if (nativeCall.numberOfParameters !== this.args.length) {\n let msg = `${name} should take ${nativeCall.numberOfParameters} parameter`;\n if (nativeCall.numberOfParameters > 1) {\n msg += \"s\";\n }\n\n this.Error(msg);\n }\n\n for (let ii = 0; ii < this.args.length; ii += 1) {\n this.args[ii].GenerateIntoContainer(container);\n }\n\n container.AddContent(NativeFunctionCall.CallWithName(this.name));\n } else if (foundList !== null) {\n if (this.args.length > 1) {\n this.Error(\n \"Can currently only construct a list from one integer (or an empty list from a given list definition)\"\n );\n }\n\n // List item from given int\n if (this.args.length === 1) {\n container.AddContent(new StringValue(this.name));\n this.args[0].GenerateIntoContainer(container);\n container.AddContent(RuntimeControlCommand.ListFromInt());\n } else {\n // Empty list with given origin.\n const list = new RuntimeInkList();\n list.SetInitialOriginName(this.name);\n container.AddContent(new ListValue(list));\n }\n } else {\n // Normal function call\n container.AddContent(this._proxyDivert.runtimeObject);\n usingProxyDivert = true;\n }\n\n // Don't attempt to resolve as a divert if we're not doing a normal function call\n if (!usingProxyDivert) {\n this.content.splice(this.content.indexOf(this._proxyDivert), 1);\n }\n\n // Function calls that are used alone on a tilda-based line:\n // ~ func()\n // Should tidy up any returned value from the evaluation stack,\n // since it's unused.\n if (this.shouldPopReturnedValue) {\n container.AddContent(RuntimeControlCommand.PopEvaluatedValue());\n }\n };\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n\n // If we aren't using the proxy divert after all (e.g. if\n // it's a native function call), but we still have arguments,\n // we need to make sure they get resolved since the proxy divert\n // is no longer in the content array.\n if (!this.content.includes(this._proxyDivert) && this.args !== null) {\n for (const arg of this.args) {\n arg.ResolveReferences(context);\n }\n }\n\n if (this._divertTargetToCount) {\n const divert = this._divertTargetToCount.divert;\n const attemptingTurnCountOfVariableTarget =\n divert.runtimeDivert.variableDivertName != null;\n\n if (attemptingTurnCountOfVariableTarget) {\n this.Error(\n `When getting the TURNS_SINCE() of a variable target, remove the '->' - i.e. it should just be TURNS_SINCE(${divert.runtimeDivert.variableDivertName})`\n );\n\n return;\n }\n\n const targetObject = divert.targetContent;\n if (targetObject === null) {\n if (!attemptingTurnCountOfVariableTarget) {\n this.Error(\n `Failed to find target for TURNS_SINCE: '${divert.target}'`\n );\n }\n } else {\n if (!targetObject.containerForCounting) {\n throw new Error();\n }\n\n targetObject.containerForCounting.turnIndexShouldBeCounted = true;\n }\n } else if (this._variableReferenceToCount) {\n const runtimeVarRef = this._variableReferenceToCount.runtimeVarRef;\n if (!runtimeVarRef) {\n throw new Error();\n }\n\n if (runtimeVarRef.pathForCount !== null) {\n this.Error(\n `Should be '${name}'(-> '${this._variableReferenceToCount.name}). Usage without the '->' only makes sense for variable targets.`\n );\n }\n }\n }\n\n public readonly toString = (): string => {\n const strArgs = this.args.join(\", \");\n return `${this.name}(${strArgs})`;\n };\n}\n","import { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { Expression } from \"./Expression\";\nimport { NativeFunctionCall } from \"../../../../engine/NativeFunctionCall\";\n\nexport class MultipleConditionExpression extends Expression {\n get subExpressions(): Expression[] {\n return this.content as Expression[];\n }\n\n constructor(conditionExpressions: Expression[]) {\n super();\n\n this.AddContent(conditionExpressions);\n }\n\n get typeName(): string {\n return \"MultipleConditionExpression\";\n }\n\n public readonly GenerateIntoContainer = (\n container: RuntimeContainer\n ): void => {\n // A && B && C && D\n // => (((A B &&) C &&) D &&) etc\n let isFirst: boolean = true;\n for (const conditionExpr of this.subExpressions) {\n conditionExpr.GenerateIntoContainer(container);\n\n if (!isFirst) {\n container.AddContent(NativeFunctionCall.CallWithName(\"&&\"));\n }\n\n isFirst = false;\n }\n };\n}\n","export enum SequenceType {\n Stopping = 1, // default\n Cycle = 2,\n Shuffle = 4,\n Once = 8,\n}\n","import { BinaryExpression } from \"../Expression/BinaryExpression\";\nimport { Choice } from \"../Choice\";\nimport { Conditional } from \"../Conditional/Conditional\";\nimport { ConditionalSingleBranch } from \"../Conditional/ConditionalSingleBranch\";\nimport { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { ParsedObject } from \"../Object\";\nimport { Divert } from \"./Divert\";\nimport { Divert as RuntimeDivert } from \"../../../../engine/Divert\";\nimport { DivertTargetValue } from \"../../../../engine/Value\";\nimport { Expression } from \"../Expression/Expression\";\nimport { FlowBase } from \"../Flow/FlowBase\";\nimport { FunctionCall } from \"../FunctionCall\";\nimport { MultipleConditionExpression } from \"../Expression/MultipleConditionExpression\";\nimport { Story } from \"../Story\";\nimport { VariableReference } from \"../Variable/VariableReference\";\nimport { asOrNull } from \"../../../../engine/TypeAssertion\";\n\nexport class DivertTarget extends Expression {\n private _runtimeDivert: RuntimeDivert | null = null;\n get runtimeDivert(): RuntimeDivert {\n if (!this._runtimeDivert) {\n throw new Error();\n }\n\n return this._runtimeDivert;\n }\n\n private _runtimeDivertTargetValue: DivertTargetValue | null = null;\n get runtimeDivertTargetValue(): DivertTargetValue {\n if (!this._runtimeDivertTargetValue) {\n throw new Error();\n }\n\n return this._runtimeDivertTargetValue;\n }\n\n public divert: Divert;\n\n constructor(divert: Divert) {\n super();\n\n this.divert = this.AddContent(divert) as Divert;\n }\n\n get typeName(): string {\n return \"DivertTarget\";\n }\n\n public readonly GenerateIntoContainer = (\n container: RuntimeContainer\n ): void => {\n this.divert.GenerateRuntimeObject();\n\n this._runtimeDivert = this.divert.runtimeDivert as RuntimeDivert;\n this._runtimeDivertTargetValue = new DivertTargetValue();\n\n container.AddContent(this.runtimeDivertTargetValue);\n };\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n\n if (this.divert.isDone || this.divert.isEnd) {\n this.Error(\n `Can't use -> DONE or -> END as variable divert targets`,\n this\n );\n\n return;\n }\n\n let usageContext: ParsedObject | null = this;\n while (usageContext && usageContext instanceof Expression) {\n let badUsage: boolean = false;\n let foundUsage: boolean = false;\n\n const usageParent: any = (usageContext as Expression).parent;\n if (usageParent instanceof BinaryExpression) {\n // Only allowed to compare for equality\n\n const binaryExprParent = usageParent;\n if (\n binaryExprParent.opName !== \"==\" &&\n binaryExprParent.opName !== \"!=\"\n ) {\n badUsage = true;\n } else {\n if (\n !(\n binaryExprParent.leftExpression instanceof DivertTarget ||\n binaryExprParent.leftExpression instanceof VariableReference\n )\n ) {\n badUsage = true;\n } else if (\n !(\n binaryExprParent.rightExpression instanceof DivertTarget ||\n binaryExprParent.rightExpression instanceof VariableReference\n )\n ) {\n badUsage = true;\n }\n }\n\n foundUsage = true;\n } else if (usageParent instanceof FunctionCall) {\n const funcCall = usageParent;\n if (!funcCall.isTurnsSince && !funcCall.isReadCount) {\n badUsage = true;\n }\n\n foundUsage = true;\n } else if (usageParent instanceof Expression) {\n badUsage = true;\n foundUsage = true;\n } else if (usageParent instanceof MultipleConditionExpression) {\n badUsage = true;\n foundUsage = true;\n } else if (\n usageParent instanceof Choice &&\n (usageParent as Choice).condition === usageContext\n ) {\n badUsage = true;\n foundUsage = true;\n } else if (\n usageParent instanceof Conditional ||\n usageParent instanceof ConditionalSingleBranch\n ) {\n badUsage = true;\n foundUsage = true;\n }\n\n if (badUsage) {\n this.Error(\n `Can't use a divert target like that. Did you intend to call '${this.divert.target}' as a function: likeThis(), or check the read count: likeThis, with no arrows?`,\n this\n );\n }\n\n if (foundUsage) {\n break;\n }\n\n usageContext = usageParent;\n }\n\n // Example ink for this case:\n //\n // VAR x = -> blah\n //\n // ...which means that \"blah\" is expected to be a literal stitch target rather\n // than a variable name. We can't really intelligently recover from this (e.g. if blah happens to\n // contain a divert target itself) since really we should be generating a variable reference\n // rather than a concrete DivertTarget, so we list it as an error.\n if (this.runtimeDivert.hasVariableTarget) {\n if (!this.divert.target) {\n throw new Error();\n }\n\n this.Error(\n `Since '${this.divert.target.dotSeparatedComponents}' is a variable, it shouldn't be preceded by '->' here.`\n );\n }\n\n // Main resolve\n this.runtimeDivert.targetPath &&\n (this.runtimeDivertTargetValue.targetPath =\n this.runtimeDivert.targetPath);\n\n // Tell hard coded (yet variable) divert targets that they also need to be counted\n // TODO: Only detect DivertTargets that are values rather than being used directly for\n // read or turn counts. Should be able to detect this by looking for other uses of containerForCounting\n let targetContent = this.divert.targetContent;\n if (targetContent !== null) {\n let target = targetContent.containerForCounting;\n if (target !== null) {\n // Purpose is known: used directly in TURNS_SINCE(-> divTarg)\n const parentFunc = asOrNull(this.parent, FunctionCall);\n if (parentFunc && parentFunc.isTurnsSince) {\n target.turnIndexShouldBeCounted = true;\n } else {\n // Unknown purpose, count everything\n target.visitsShouldBeCounted = true;\n target.turnIndexShouldBeCounted = true;\n }\n }\n\n // Unfortunately not possible:\n // https://github.com/inkle/ink/issues/538\n //\n // VAR func = -> double\n //\n // === function double(ref x)\n // ~ x = x * 2\n //\n // Because when generating the parameters for a function\n // to be called, it needs to know ahead of time when\n // compiling whether to pass a variable reference or value.\n //\n let targetFlow = asOrNull(targetContent, FlowBase);\n if (targetFlow != null && targetFlow.args !== null) {\n for (const arg of targetFlow.args) {\n if (arg.isByReference) {\n this.Error(\n `Can't store a divert target to a knot or function that has by-reference arguments ('${targetFlow.identifier}' has 'ref ${arg.identifier}').`\n );\n }\n }\n }\n }\n }\n\n // Equals override necessary in order to check for CONST multiple definition equality\n public readonly Equals = (obj: ParsedObject): boolean => {\n const otherDivTarget = asOrNull(obj, DivertTarget);\n if (\n !otherDivTarget ||\n !this.divert.target ||\n !otherDivTarget.divert.target\n ) {\n return false;\n }\n\n const targetStr = this.divert.target.dotSeparatedComponents;\n const otherTargetStr = otherDivTarget.divert.target.dotSeparatedComponents;\n\n return targetStr === otherTargetStr;\n };\n}\n","import { Argument } from \"../Argument\";\nimport { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { ControlCommand as RuntimeControlCommand } from \"../../../../engine/ControlCommand\";\nimport { Divert as RuntimeDivert } from \"../../../../engine/Divert\";\nimport { DivertTarget } from \"./DivertTarget\";\nimport { Expression } from \"../Expression/Expression\";\nimport { FlowBase } from \"../Flow/FlowBase\";\nimport { FunctionCall } from \"../FunctionCall\";\nimport { ParsedObject } from \"../Object\";\nimport { Path } from \"../Path\";\nimport { Path as RuntimePath } from \"../../../../engine/Path\";\nimport { PushPopType } from \"../../../../engine/PushPop\";\nimport { Story } from \"../Story\";\nimport { VariablePointerValue } from \"../../../../engine/Value\";\nimport { VariableReference } from \"../Variable/VariableReference\";\nimport { ClosestFlowBase } from \"../Flow/ClosestFlowBase\";\nimport { asOrNull } from \"../../../../engine/TypeAssertion\";\n\nexport class Divert extends ParsedObject {\n public readonly args: Expression[] = [];\n\n public readonly target: Path | null = null;\n public targetContent: ParsedObject | null = null;\n private _runtimeDivert: RuntimeDivert | null = null;\n get runtimeDivert(): RuntimeDivert {\n if (!this._runtimeDivert) {\n throw new Error();\n }\n\n return this._runtimeDivert;\n }\n\n set runtimeDivert(value: RuntimeDivert) {\n this._runtimeDivert = value;\n }\n\n public isFunctionCall: boolean = false;\n public isEmpty: boolean = false;\n public isTunnel: boolean = false;\n public isThread: boolean = false;\n\n get isEnd(): boolean {\n return Boolean(this.target && this.target.dotSeparatedComponents === \"END\");\n }\n\n get isDone(): boolean {\n return Boolean(\n this.target && this.target.dotSeparatedComponents === \"DONE\"\n );\n }\n\n constructor(target?: Path | null | undefined, args?: Expression[]) {\n super();\n\n if (target) {\n this.target = target;\n }\n\n if (args) {\n this.args = args;\n this.AddContent(args);\n }\n }\n\n get typeName(): string {\n return \"Divert\";\n }\n\n public readonly GenerateRuntimeObject = () => {\n // End = end flow immediately\n // Done = return from thread or instruct the flow that it's safe to exit\n if (this.isEnd) {\n return RuntimeControlCommand.End();\n } else if (this.isDone) {\n return RuntimeControlCommand.Done();\n }\n\n this.runtimeDivert = new RuntimeDivert();\n\n // Normally we resolve the target content during the\n // Resolve phase, since we expect all runtime objects to\n // be available in order to find the final runtime path for\n // the destination. However, we need to resolve the target\n // (albeit without the runtime target) early so that\n // we can get information about the arguments - whether\n // they're by reference - since it affects the code we\n // generate here.\n this.ResolveTargetContent();\n\n this.CheckArgumentValidity();\n\n // Passing arguments to the knot\n const requiresArgCodeGen = this.args !== null && this.args.length > 0;\n if (\n requiresArgCodeGen ||\n this.isFunctionCall ||\n this.isTunnel ||\n this.isThread\n ) {\n const container = new RuntimeContainer();\n\n // Generate code for argument evaluation\n // This argument generation is coded defensively - it should\n // attempt to generate the code for all the parameters, even if\n // they don't match the expected arguments. This is so that the\n // parameter objects themselves are generated correctly and don't\n // get into a state of attempting to resolve references etc\n // without being generated.\n if (requiresArgCodeGen) {\n // Function calls already in an evaluation context\n if (!this.isFunctionCall) {\n container.AddContent(RuntimeControlCommand.EvalStart());\n }\n\n let targetArguments: Argument[] | null = null;\n if (this.targetContent) {\n targetArguments = (this.targetContent as FlowBase).args;\n }\n\n for (let ii = 0; ii < this.args.length; ++ii) {\n const argToPass: Expression = this.args[ii];\n let argExpected: Argument | null = null;\n if (targetArguments && ii < targetArguments.length) {\n argExpected = targetArguments[ii];\n }\n\n // Pass by reference: argument needs to be a variable reference\n if (argExpected && argExpected.isByReference) {\n const varRef = asOrNull(argToPass, VariableReference);\n if (!varRef) {\n this.Error(\n `Expected variable name to pass by reference to 'ref ${argExpected.identifier}' but saw ${argToPass}`\n );\n\n break;\n }\n\n // Check that we're not attempting to pass a read count by reference\n const targetPath = new Path(varRef.pathIdentifiers);\n const targetForCount: ParsedObject | null =\n targetPath.ResolveFromContext(this);\n if (targetForCount) {\n this.Error(\n `can't pass a read count by reference. '${\n targetPath.dotSeparatedComponents\n }' is a knot/stitch/label, but '${\n this.target!.dotSeparatedComponents\n }' requires the name of a VAR to be passed.`\n );\n\n break;\n }\n\n const varPointer = new VariablePointerValue(varRef.name);\n container.AddContent(varPointer);\n } else {\n // Normal value being passed: evaluate it as normal\n argToPass.GenerateIntoContainer(container);\n }\n }\n\n // Function calls were already in an evaluation context\n if (!this.isFunctionCall) {\n container.AddContent(RuntimeControlCommand.EvalEnd());\n }\n }\n\n // Starting a thread? A bit like a push to the call stack below... but not.\n // It sort of puts the call stack on a thread stack (argh!) - forks the full flow.\n if (this.isThread) {\n container.AddContent(RuntimeControlCommand.StartThread());\n } else if (this.isFunctionCall || this.isTunnel) {\n // If this divert is a function call, tunnel, we push to the call stack\n // so we can return again\n this.runtimeDivert.pushesToStack = true;\n this.runtimeDivert.stackPushType = this.isFunctionCall\n ? PushPopType.Function\n : PushPopType.Tunnel;\n }\n\n // Jump into the \"function\" (knot/stitch)\n container.AddContent(this.runtimeDivert);\n\n return container;\n }\n\n // Simple divert\n return this.runtimeDivert;\n };\n\n // When the divert is to a target that's actually a variable name\n // rather than an explicit knot/stitch name, try interpretting it\n // as such by getting the variable name.\n public readonly PathAsVariableName = () =>\n this.target ? this.target.firstComponent : null;\n\n public readonly ResolveTargetContent = (): void => {\n if (this.isEmpty || this.isEnd) {\n return;\n }\n\n if (this.targetContent === null) {\n // Is target of this divert a variable name that will be de-referenced\n // at runtime? If so, there won't be any further reference resolution\n // we can do at this point.\n let variableTargetName = this.PathAsVariableName();\n if (variableTargetName !== null) {\n const flowBaseScope = asOrNull(ClosestFlowBase(this), FlowBase);\n if (flowBaseScope) {\n const resolveResult = flowBaseScope.ResolveVariableWithName(\n variableTargetName,\n this\n );\n\n if (resolveResult.found) {\n // Make sure that the flow was typed correctly, given that we know that this\n // is meant to be a divert target\n if (\n resolveResult.isArgument &&\n resolveResult.ownerFlow &&\n resolveResult.ownerFlow.args\n ) {\n let argument = resolveResult.ownerFlow.args.find(\n (a) => a.identifier?.name == variableTargetName\n );\n\n if (argument && !argument.isDivertTarget) {\n this.Error(\n `Since '${argument.identifier}' is used as a variable divert target (on ${this.debugMetadata}), it should be marked as: -> ${argument.identifier}`,\n resolveResult.ownerFlow\n );\n }\n }\n\n this.runtimeDivert.variableDivertName = variableTargetName;\n return;\n }\n }\n }\n\n if (!this.target) {\n throw new Error();\n }\n\n this.targetContent = this.target.ResolveFromContext(this);\n }\n };\n\n public ResolveReferences(context: Story): void {\n if (this.isEmpty || this.isEnd || this.isDone) {\n return;\n } else if (!this.runtimeDivert) {\n throw new Error();\n }\n\n if (this.targetContent) {\n this.runtimeDivert.targetPath = this.targetContent.runtimePath;\n }\n\n // Resolve children (the arguments)\n super.ResolveReferences(context);\n\n // May be null if it's a built in function (e.g. TURNS_SINCE)\n // or if it's a variable target.\n let targetFlow = asOrNull(this.targetContent, FlowBase);\n if (targetFlow) {\n if (!targetFlow.isFunction && this.isFunctionCall) {\n super.Error(\n `${targetFlow.identifier} hasn't been marked as a function, but it's being called as one. Do you need to delcare the knot as '== function ${targetFlow.identifier} =='?`\n );\n } else if (\n targetFlow.isFunction &&\n !this.isFunctionCall &&\n !(this.parent instanceof DivertTarget)\n ) {\n super.Error(\n targetFlow.identifier +\n \" can't be diverted to. It can only be called as a function since it's been marked as such: '\" +\n targetFlow.identifier +\n \"(...)'\"\n );\n }\n }\n\n // Check validity of target content\n const targetWasFound = this.targetContent !== null;\n let isBuiltIn: boolean = false;\n let isExternal: boolean = false;\n\n if (!this.target) {\n throw new Error();\n } else if (this.target.numberOfComponents === 1) {\n if (!this.target.firstComponent) {\n throw new Error();\n }\n\n // BuiltIn means TURNS_SINCE, CHOICE_COUNT, RANDOM or SEED_RANDOM\n isBuiltIn = FunctionCall.IsBuiltIn(this.target.firstComponent);\n\n // Client-bound function?\n isExternal = context.IsExternal(this.target.firstComponent);\n\n if (isBuiltIn || isExternal) {\n if (!this.isFunctionCall) {\n super.Error(\n `${this.target.firstComponent} must be called as a function: ~ ${this.target.firstComponent}()`\n );\n }\n\n if (isExternal) {\n this.runtimeDivert.isExternal = true;\n if (this.args !== null) {\n this.runtimeDivert.externalArgs = this.args.length;\n }\n\n this.runtimeDivert.pushesToStack = false;\n this.runtimeDivert.targetPath = new RuntimePath(\n this.target.firstComponent\n );\n\n this.CheckExternalArgumentValidity(context);\n }\n\n return;\n }\n }\n\n // Variable target?\n if (this.runtimeDivert.variableDivertName != null) {\n return;\n }\n\n if (!targetWasFound && !isBuiltIn && !isExternal) {\n this.Error(`target not found: '${this.target}'`);\n }\n }\n\n // Returns false if there's an error\n public readonly CheckArgumentValidity = (): void => {\n if (this.isEmpty) {\n return;\n }\n\n // Argument passing: Check for errors in number of arguments\n let numArgs = 0;\n if (this.args !== null && this.args.length > 0) {\n numArgs = this.args.length;\n }\n\n // Missing content?\n // Can't check arguments properly. It'll be due to some\n // other error though, so although there's a problem and\n // we report false, we don't need to report a specific error.\n // It may also be because it's a valid call to an external\n // function, that we check at the resolve stage.\n if (this.targetContent === null) {\n return;\n }\n\n const targetFlow = asOrNull(this.targetContent, FlowBase);\n\n // No error, crikey!\n if (numArgs === 0 && (targetFlow === null || !targetFlow.hasParameters)) {\n return;\n } else if (targetFlow === null && numArgs > 0) {\n this.Error(\n \"target needs to be a knot or stitch in order to pass arguments\"\n );\n return;\n } else if (\n targetFlow !== null &&\n (targetFlow.args === null || (!targetFlow.args && numArgs > 0))\n ) {\n this.Error(`target (${targetFlow.name}) doesn't take parameters`);\n return;\n } else if (this.parent instanceof DivertTarget) {\n if (numArgs > 0) {\n this.Error(`can't store arguments in a divert target variable`);\n }\n\n return;\n }\n\n const paramCount = targetFlow!.args!.length;\n if (paramCount !== numArgs) {\n let butClause: string;\n if (numArgs === 0) {\n butClause = \"but there weren't any passed to it\";\n } else if (numArgs < paramCount) {\n butClause = `but only got ${numArgs}`;\n } else {\n butClause = `but got ${numArgs}`;\n }\n\n this.Error(\n `to '${\n targetFlow!.identifier\n }' requires ${paramCount} arguments, ${butClause}`\n );\n\n return;\n }\n\n // Light type-checking for divert target arguments\n for (let ii = 0; ii < paramCount; ++ii) {\n const flowArg: Argument = targetFlow!.args![ii];\n const divArgExpr: Expression = this.args[ii];\n\n // Expecting a divert target as an argument, let's do some basic type checking\n if (flowArg.isDivertTarget) {\n // Not passing a divert target or any kind of variable reference?\n let varRef = asOrNull(divArgExpr, VariableReference);\n if (!(divArgExpr instanceof DivertTarget) && varRef === null) {\n this.Error(\n `Target '${\n targetFlow!.identifier\n }' expects a divert target for the parameter named -> ${\n flowArg.identifier\n } but saw ${divArgExpr}`,\n divArgExpr\n );\n } else if (varRef) {\n // Passing 'a' instead of '-> a'?\n // i.e. read count instead of divert target\n // Unfortunately have to manually resolve here since we're still in code gen\n const knotCountPath = new Path(varRef.pathIdentifiers);\n const targetForCount: ParsedObject | null =\n knotCountPath.ResolveFromContext(varRef);\n if (targetForCount) {\n this.Error(\n `Passing read count of '${knotCountPath.dotSeparatedComponents}' instead of a divert target. You probably meant '${knotCountPath}'`\n );\n }\n }\n }\n }\n\n if (targetFlow === null) {\n this.Error(\n \"Can't call as a function or with arguments unless it's a knot or stitch\"\n );\n return;\n }\n\n return;\n };\n\n public readonly CheckExternalArgumentValidity = (context: Story): void => {\n const externalName: string | null = this.target\n ? this.target.firstComponent\n : null;\n const external = context.externals.get(externalName as any);\n if (!external) {\n throw new Error(\"external not found\");\n }\n\n const externalArgCount: number = external.argumentNames.length;\n let ownArgCount = 0;\n if (this.args) {\n ownArgCount = this.args.length;\n }\n\n if (ownArgCount !== externalArgCount) {\n this.Error(\n `incorrect number of arguments sent to external function '${externalName}'. Expected ${externalArgCount} but got ${ownArgCount}`\n );\n }\n };\n\n public Error(\n message: string,\n source: ParsedObject | null = null,\n isWarning: boolean = false\n ): void {\n // Could be getting an error from a nested Divert\n if (source !== this && source) {\n super.Error(message, source);\n return;\n }\n\n if (this.isFunctionCall) {\n super.Error(`Function call ${message}`, source, isWarning);\n } else {\n super.Error(`Divert ${message}`, source, isWarning);\n }\n }\n\n public toString = (): string => {\n let returnString = \"\";\n if (this.target !== null) {\n returnString += this.target.toString();\n } else {\n return \"-> <empty divert>\";\n }\n\n if (this.isTunnel) {\n returnString += \" ->\";\n }\n if (this.isFunctionCall) {\n returnString += \" ()\";\n }\n\n return returnString;\n };\n}\n","import { Divert as RuntimeDivert } from \"../../../../engine/Divert\";\nimport { InkObject as RuntimeObject } from \"../../../../engine/Object\";\n\nexport class GatherPointToResolve {\n constructor(\n public divert: RuntimeDivert,\n public targetRuntimeObj: RuntimeObject\n ) {}\n}\n","import { Divert as RuntimeDivert } from \"../../../../engine/Divert\";\nimport { InkObject as RuntimeObject } from \"../../../../engine/Object\";\n\nexport class SequenceDivertToResolve {\n constructor(\n public divert: RuntimeDivert,\n public targetContent: RuntimeObject\n ) {}\n}\n","import { ContentList } from \"../ContentList\";\nimport { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { ControlCommand as RuntimeControlCommand } from \"../../../../engine/ControlCommand\";\nimport { Divert as RuntimeDivert } from \"../../../../engine/Divert\";\nimport { IntValue } from \"../../../../engine/Value\";\nimport { NativeFunctionCall } from \"../../../../engine/NativeFunctionCall\";\nimport { ParsedObject } from \"../Object\";\nimport { InkObject as RuntimeObject } from \"../../../../engine/Object\";\nimport { SequenceDivertToResolve } from \"./SequenceDivertToResolve\";\nimport { SequenceType } from \"./SequenceType\";\nimport { Story } from \"../Story\";\nimport { Weave } from \"../Weave\";\n\nexport class Sequence extends ParsedObject {\n private _sequenceDivertsToResolve: SequenceDivertToResolve[] = [];\n\n public sequenceElements: ParsedObject[];\n\n constructor(\n elementContentLists: ContentList[],\n public readonly sequenceType: SequenceType\n ) {\n super();\n\n this.sequenceType = sequenceType;\n this.sequenceElements = [];\n\n for (const elementContentList of elementContentLists) {\n const contentObjs = elementContentList.content;\n let seqElObject: ParsedObject | null = null;\n\n // Don't attempt to create a weave for the sequence element\n // if the content list is empty. Weaves don't like it!\n if (contentObjs === null || contentObjs.length === 0) {\n seqElObject = elementContentList;\n } else {\n seqElObject = new Weave(contentObjs);\n }\n\n this.sequenceElements.push(seqElObject);\n this.AddContent(seqElObject);\n }\n }\n\n get typeName(): string {\n return \"Sequence\";\n }\n\n // Generate runtime code that looks like:\n //\n // chosenIndex = MIN(sequence counter, num elements) e.g. for \"Stopping\"\n // if chosenIndex == 0, divert to s0\n // if chosenIndex == 1, divert to s1 [etc]\n //\n // - s0:\n // <content for sequence element>\n // divert to no-op\n // - s1:\n // <content for sequence element>\n // divert to no-op\n // - s2:\n // empty branch if using \"once\"\n // divert to no-op\n //\n // no-op\n //\n public readonly GenerateRuntimeObject = (): RuntimeObject => {\n const container = new RuntimeContainer();\n container.visitsShouldBeCounted = true;\n container.countingAtStartOnly = true;\n\n this._sequenceDivertsToResolve = [];\n\n // Get sequence read count\n container.AddContent(RuntimeControlCommand.EvalStart());\n container.AddContent(RuntimeControlCommand.VisitIndex());\n\n const once: boolean = (this.sequenceType & SequenceType.Once) > 0;\n const cycle: boolean = (this.sequenceType & SequenceType.Cycle) > 0;\n const stopping: boolean = (this.sequenceType & SequenceType.Stopping) > 0;\n const shuffle: boolean = (this.sequenceType & SequenceType.Shuffle) > 0;\n\n let seqBranchCount = this.sequenceElements.length;\n if (once) {\n seqBranchCount += 1;\n }\n\n // Chosen sequence index:\n // - Stopping: take the MIN(read count, num elements - 1)\n // - Once: take the MIN(read count, num elements)\n // (the last one being empty)\n if (stopping || once) {\n //var limit = stopping ? seqBranchCount-1 : seqBranchCount;\n container.AddContent(new IntValue(seqBranchCount - 1));\n container.AddContent(NativeFunctionCall.CallWithName(\"MIN\"));\n } else if (cycle) {\n // - Cycle: take (read count % num elements)\n container.AddContent(new IntValue(this.sequenceElements.length));\n container.AddContent(NativeFunctionCall.CallWithName(\"%\"));\n }\n\n // Shuffle\n if (shuffle) {\n // Create point to return to when sequence is complete\n const postShuffleNoOp = RuntimeControlCommand.NoOp();\n\n // When visitIndex == lastIdx, we skip the shuffle\n if (once || stopping) {\n // if( visitIndex == lastIdx ) -> skipShuffle\n const lastIdx = stopping\n ? this.sequenceElements.length - 1\n : this.sequenceElements.length;\n\n container.AddContent(RuntimeControlCommand.Duplicate());\n container.AddContent(new IntValue(lastIdx));\n container.AddContent(NativeFunctionCall.CallWithName(\"==\"));\n\n const skipShuffleDivert = new RuntimeDivert();\n skipShuffleDivert.isConditional = true;\n container.AddContent(skipShuffleDivert);\n\n this.AddDivertToResolve(skipShuffleDivert, postShuffleNoOp);\n }\n\n // This one's a bit more complex! Choose the index at runtime.\n let elementCountToShuffle = this.sequenceElements.length;\n if (stopping) {\n elementCountToShuffle -= 1;\n }\n\n container.AddContent(new IntValue(elementCountToShuffle));\n container.AddContent(RuntimeControlCommand.SequenceShuffleIndex());\n if (once || stopping) {\n container.AddContent(postShuffleNoOp);\n }\n }\n\n container.AddContent(RuntimeControlCommand.EvalEnd());\n\n // Create point to return to when sequence is complete\n const postSequenceNoOp = RuntimeControlCommand.NoOp();\n\n // Each of the main sequence branches, and one extra empty branch if\n // we have a \"once\" sequence.\n for (let elIndex = 0; elIndex < seqBranchCount; elIndex += 1) {\n // This sequence element:\n // if( chosenIndex == this index ) divert to this sequence element\n // duplicate chosen sequence index, since it'll be consumed by \"==\"\n container.AddContent(RuntimeControlCommand.EvalStart());\n container.AddContent(RuntimeControlCommand.Duplicate());\n container.AddContent(new IntValue(elIndex));\n container.AddContent(NativeFunctionCall.CallWithName(\"==\"));\n container.AddContent(RuntimeControlCommand.EvalEnd());\n\n // Divert branch for this sequence element\n const sequenceDivert = new RuntimeDivert();\n sequenceDivert.isConditional = true;\n container.AddContent(sequenceDivert);\n\n let contentContainerForSequenceBranch: RuntimeContainer;\n\n // Generate content for this sequence element\n if (elIndex < this.sequenceElements.length) {\n const el = this.sequenceElements[elIndex];\n contentContainerForSequenceBranch =\n el.runtimeObject as RuntimeContainer;\n } else {\n // Final empty branch for \"once\" sequences\n contentContainerForSequenceBranch = new RuntimeContainer();\n }\n\n contentContainerForSequenceBranch.name = `s${elIndex}`;\n contentContainerForSequenceBranch.InsertContent(\n RuntimeControlCommand.PopEvaluatedValue(),\n 0\n );\n\n // When sequence element is complete, divert back to end of sequence\n const seqBranchCompleteDivert = new RuntimeDivert();\n contentContainerForSequenceBranch.AddContent(seqBranchCompleteDivert);\n container.AddToNamedContentOnly(contentContainerForSequenceBranch);\n\n // Save the diverts for reference resolution later (in ResolveReferences)\n this.AddDivertToResolve(\n sequenceDivert,\n contentContainerForSequenceBranch\n );\n this.AddDivertToResolve(seqBranchCompleteDivert, postSequenceNoOp);\n }\n\n container.AddContent(postSequenceNoOp);\n\n return container;\n };\n\n public readonly AddDivertToResolve = (\n divert: RuntimeDivert,\n targetContent: RuntimeObject\n ) => {\n this._sequenceDivertsToResolve.push(\n new SequenceDivertToResolve(divert, targetContent)\n );\n };\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n\n for (const toResolve of this._sequenceDivertsToResolve) {\n toResolve.divert.targetPath = toResolve.targetContent.path;\n }\n }\n}\n","export enum CustomFlags {\n ParsingString = 0x1,\n TagActive = 0x2,\n}\n","import { Container as RuntimeContainer } from \"../../../engine/Container\";\nimport { ControlCommand as RuntimeControlCommand } from \"../../../engine/ControlCommand\";\nimport { Divert } from \"./Divert/Divert\";\nimport { Divert as RuntimeDivert } from \"../../../engine/Divert\";\nimport { DivertTargetValue } from \"../../../engine/Value\";\nimport { ParsedObject } from \"./Object\";\nimport { InkObject as RuntimeObject } from \"../../../engine/Object\";\nimport { Story } from \"./Story\";\nimport { Void } from \"../../../engine/Void\";\nimport { asOrNull } from \"../../../engine/TypeAssertion\";\nimport { VariableReference } from \"../../../engine/VariableReference\";\n\nexport class TunnelOnwards extends ParsedObject {\n private _overrideDivertTarget: DivertTargetValue | null = null;\n\n private _divertAfter: Divert | null = null;\n get divertAfter() {\n return this._divertAfter;\n }\n\n set divertAfter(value) {\n this._divertAfter = value;\n if (this._divertAfter) {\n this.AddContent(this._divertAfter);\n }\n }\n\n get typeName(): string {\n return \"TunnelOnwards\";\n }\n\n public readonly GenerateRuntimeObject = (): RuntimeObject => {\n const container = new RuntimeContainer();\n\n // Set override path for tunnel onwards (or nothing)\n container.AddContent(RuntimeControlCommand.EvalStart());\n\n if (this.divertAfter) {\n // Generate runtime object's generated code and steal the arguments runtime code\n const returnRuntimeObj = this.divertAfter.GenerateRuntimeObject();\n const returnRuntimeContainer = returnRuntimeObj as RuntimeContainer;\n if (returnRuntimeContainer) {\n // Steal all code for generating arguments from the divert\n const args = this.divertAfter.args;\n if (args !== null && args.length > 0) {\n // Steal everything betwen eval start and eval end\n let evalStart = -1;\n let evalEnd = -1;\n for (\n let ii = 0;\n ii < returnRuntimeContainer.content.length;\n ii += 1\n ) {\n const cmd = returnRuntimeContainer.content[\n ii\n ] as RuntimeControlCommand;\n if (cmd) {\n if (\n evalStart == -1 &&\n cmd.commandType === RuntimeControlCommand.CommandType.EvalStart\n ) {\n evalStart = ii;\n } else if (\n cmd.commandType === RuntimeControlCommand.CommandType.EvalEnd\n ) {\n evalEnd = ii;\n }\n }\n }\n\n for (let ii = evalStart + 1; ii < evalEnd; ii += 1) {\n const obj = returnRuntimeContainer.content[ii];\n obj.parent = null; // prevent error of being moved between owners\n container.AddContent(returnRuntimeContainer.content[ii]);\n }\n }\n }\n // Supply the divert target for the tunnel onwards target, either variable or more commonly, the explicit name\n // var returnDivertObj = returnRuntimeObj as Runtime.Divert;\n let returnDivertObj = asOrNull(returnRuntimeObj, RuntimeDivert);\n if (returnDivertObj != null && returnDivertObj.hasVariableTarget) {\n let runtimeVarRef = new VariableReference(\n returnDivertObj.variableDivertName\n );\n container.AddContent(runtimeVarRef);\n } else {\n this._overrideDivertTarget = new DivertTargetValue();\n container.AddContent(this._overrideDivertTarget);\n }\n } else {\n // No divert after tunnel onwards\n container.AddContent(new Void());\n }\n\n container.AddContent(RuntimeControlCommand.EvalEnd());\n container.AddContent(RuntimeControlCommand.PopTunnel());\n\n return container;\n };\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n\n if (this.divertAfter && this.divertAfter.targetContent) {\n this._overrideDivertTarget!.targetPath =\n this.divertAfter.targetContent.runtimePath;\n }\n }\n\n public toString = (): string => {\n return ` -> ${this._divertAfter}`;\n };\n}\n","import { InkListItem, SerializedInkListItem } from \"./InkList\";\nimport { TryGetResult } from \"./TryGetResult\";\n\nexport class ListDefinition {\n public _name: string;\n public _items: Map<SerializedInkListItem, number> | null;\n public _itemNameToValues: Map<string, number>;\n\n constructor(name: string, items: Map<string, number> | null) {\n this._name = name || \"\";\n this._items = null;\n this._itemNameToValues = items || new Map();\n }\n get name() {\n return this._name;\n }\n get items() {\n if (this._items == null) {\n this._items = new Map();\n for (let [key, value] of this._itemNameToValues) {\n let item = new InkListItem(this.name, key);\n this._items.set(item.serialized(), value);\n }\n }\n\n return this._items;\n }\n\n public ValueForItem(item: InkListItem) {\n if (!item.itemName) return 0;\n\n let intVal = this._itemNameToValues.get(item.itemName);\n if (typeof intVal !== \"undefined\") return intVal;\n else return 0;\n }\n public ContainsItem(item: InkListItem) {\n if (!item.itemName) return false;\n if (item.originName != this.name) return false;\n\n return this._itemNameToValues.has(item.itemName);\n }\n public ContainsItemWithName(itemName: string) {\n return this._itemNameToValues.has(itemName);\n }\n public TryGetItemWithValue(\n val: number,\n /* out */ item: InkListItem\n ): TryGetResult<InkListItem> {\n for (let [key, value] of this._itemNameToValues) {\n if (value == val) {\n item = new InkListItem(this.name, key);\n return { result: item, exists: true };\n }\n }\n\n item = InkListItem.Null;\n return { result: item, exists: false };\n }\n public TryGetValueForItem(\n item: InkListItem,\n /* out */ intVal: number\n ): TryGetResult<number> {\n if (!item.itemName) return { result: 0, exists: false };\n let value = this._itemNameToValues.get(item.itemName);\n\n if (!value) return { result: 0, exists: false };\n return { result: value, exists: true };\n }\n}\n","import { InkList as RuntimeInkList } from \"../../../../engine/InkList\";\nimport { InkListItem as RuntimeInkListItem } from \"../../../../engine/InkList\";\nimport { ListDefinition as RuntimeListDefinition } from \"../../../../engine/ListDefinition\";\nimport { ListElementDefinition } from \"./ListElementDefinition\";\nimport { ListValue } from \"../../../../engine/Value\";\nimport { ParsedObject } from \"../Object\";\nimport { Story } from \"../Story\";\nimport { SymbolType } from \"../SymbolType\";\nimport { VariableAssignment } from \"../Variable/VariableAssignment\";\nimport { Identifier } from \"../Identifier\";\n\nexport class ListDefinition extends ParsedObject {\n public identifier: Identifier | null = null;\n public variableAssignment: VariableAssignment | null = null;\n\n get typeName() {\n return \"ListDefinition\";\n }\n\n private _elementsByName: Map<string, ListElementDefinition> | null = null;\n\n get runtimeListDefinition(): RuntimeListDefinition {\n const allItems: Map<string, number> = new Map();\n for (const e of this.itemDefinitions) {\n if (!allItems.has(e.name!)) {\n allItems.set(e.name!, e.seriesValue);\n } else {\n this.Error(\n `List '${this.identifier}' contains duplicate items called '${e.name}'`\n );\n }\n }\n\n return new RuntimeListDefinition(this.identifier?.name || \"\", allItems);\n }\n\n public readonly ItemNamed = (\n itemName: string\n ): ListElementDefinition | null => {\n if (this._elementsByName === null) {\n this._elementsByName = new Map();\n\n for (const el of this.itemDefinitions) {\n this._elementsByName.set(el.name!, el);\n }\n }\n\n const foundElement = this._elementsByName.get(itemName) || null;\n\n return foundElement;\n };\n\n constructor(public itemDefinitions: ListElementDefinition[]) {\n super();\n\n let currentValue = 1;\n for (const e of this.itemDefinitions) {\n if (e.explicitValue !== null) {\n currentValue = e.explicitValue;\n }\n\n e.seriesValue = currentValue;\n\n currentValue += 1;\n }\n\n this.AddContent(itemDefinitions as any);\n }\n\n public readonly GenerateRuntimeObject = (): ListValue => {\n const initialValues = new RuntimeInkList();\n for (const itemDef of this.itemDefinitions) {\n if (itemDef.inInitialList) {\n const item = new RuntimeInkListItem(\n this.identifier?.name || null,\n itemDef.name || null\n );\n initialValues.Add(item, itemDef.seriesValue);\n }\n }\n\n // Set origin name, so\n initialValues.SetInitialOriginName(this.identifier?.name || \"\");\n\n return new ListValue(initialValues);\n };\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n context.CheckForNamingCollisions(this, this.identifier!, SymbolType.List);\n }\n}\n","import { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { Expression } from \"../Expression/Expression\";\nimport { FlowBase } from \"../Flow/FlowBase\";\nimport { ClosestFlowBase } from \"../Flow/ClosestFlowBase\";\nimport { ListDefinition } from \"../List/ListDefinition\";\nimport { ParsedObject } from \"../Object\";\nimport { InkObject as RuntimeObject } from \"../../../../engine/Object\";\nimport { Story } from \"../Story\";\nimport { SymbolType } from \"../SymbolType\";\nimport { VariableAssignment as RuntimeVariableAssignment } from \"../../../../engine/VariableAssignment\";\nimport { VariableReference } from \"./VariableReference\";\nimport { Identifier } from \"../Identifier\";\nimport { asOrNull } from \"../../../../engine/TypeAssertion\";\n\nexport class VariableAssignment extends ParsedObject {\n private _runtimeAssignment: RuntimeVariableAssignment | null = null;\n\n get variableName(): string {\n return this.variableIdentifier.name!;\n }\n public readonly variableIdentifier: Identifier;\n public readonly expression: Expression | null = null;\n public readonly listDefinition: ListDefinition | null = null;\n public readonly isGlobalDeclaration: boolean;\n public readonly isNewTemporaryDeclaration: boolean;\n\n get typeName() {\n if (this.isNewTemporaryDeclaration) {\n return \"temp\";\n } else if (this.isGlobalDeclaration) {\n if (this.listDefinition !== null) {\n return \"LIST\";\n }\n return \"VAR\";\n }\n\n return \"variable assignment\";\n }\n\n get isDeclaration(): boolean {\n return this.isGlobalDeclaration || this.isNewTemporaryDeclaration;\n }\n\n constructor({\n assignedExpression,\n isGlobalDeclaration,\n isTemporaryNewDeclaration,\n listDef,\n variableIdentifier,\n }: {\n readonly assignedExpression?: Expression;\n readonly isGlobalDeclaration?: boolean;\n readonly isTemporaryNewDeclaration?: boolean;\n readonly listDef?: ListDefinition;\n readonly variableIdentifier: Identifier;\n }) {\n super();\n\n this.variableIdentifier = variableIdentifier;\n this.isGlobalDeclaration = Boolean(isGlobalDeclaration);\n this.isNewTemporaryDeclaration = Boolean(isTemporaryNewDeclaration);\n\n // Defensive programming in case parsing of assignedExpression failed\n if (listDef instanceof ListDefinition) {\n this.listDefinition = this.AddContent(listDef) as ListDefinition;\n this.listDefinition.variableAssignment = this;\n\n // List definitions are always global\n this.isGlobalDeclaration = true;\n } else if (assignedExpression) {\n this.expression = this.AddContent(assignedExpression) as Expression;\n }\n }\n\n public readonly GenerateRuntimeObject = (): RuntimeObject | null => {\n let newDeclScope: FlowBase | null | undefined = null;\n if (this.isGlobalDeclaration) {\n newDeclScope = this.story;\n } else if (this.isNewTemporaryDeclaration) {\n newDeclScope = ClosestFlowBase(this);\n }\n\n if (newDeclScope) {\n newDeclScope.AddNewVariableDeclaration(this);\n }\n\n // Global declarations don't generate actual procedural\n // runtime objects, but instead add a global variable to the story itself.\n // The story then initialises them all in one go at the start of the game.\n if (this.isGlobalDeclaration) {\n return null;\n }\n\n const container = new RuntimeContainer();\n\n // The expression's runtimeObject is actually another nested container\n if (this.expression) {\n container.AddContent(this.expression.runtimeObject);\n } else if (this.listDefinition) {\n container.AddContent(this.listDefinition.runtimeObject);\n }\n\n this._runtimeAssignment = new RuntimeVariableAssignment(\n this.variableName,\n this.isNewTemporaryDeclaration\n );\n\n container.AddContent(this._runtimeAssignment);\n\n return container;\n };\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n\n // List definitions are checked for conflicts separately\n if (this.isDeclaration && this.listDefinition === null) {\n context.CheckForNamingCollisions(\n this,\n this.variableIdentifier,\n this.isGlobalDeclaration ? SymbolType.Var : SymbolType.Temp\n );\n }\n\n // Initial VAR x = [intialValue] declaration, not re-assignment\n if (this.isGlobalDeclaration) {\n const variableReference = asOrNull(this.expression, VariableReference);\n if (\n variableReference &&\n !variableReference.isConstantReference &&\n !variableReference.isListItemReference\n ) {\n this.Error(\n \"global variable assignments cannot refer to other variables, only literal values, constants and list items\"\n );\n }\n }\n\n if (!this.isNewTemporaryDeclaration) {\n const resolvedVarAssignment = context.ResolveVariableWithName(\n this.variableName,\n this\n );\n\n if (!resolvedVarAssignment.found) {\n if (this.variableName in this.story.constants) {\n this.Error(\n `Can't re-assign to a constant (do you need to use VAR when declaring '${this.variableName}'?)`,\n this\n );\n } else {\n this.Error(\n `Variable could not be found to assign to: '${this.variableName}'`,\n this\n );\n }\n }\n\n // A runtime assignment may not have been generated if it's the initial global declaration,\n // since these are hoisted out and handled specially in Story.ExportRuntime.\n if (this._runtimeAssignment) {\n this._runtimeAssignment.isGlobal = resolvedVarAssignment.isGlobal;\n }\n }\n }\n\n public readonly toString = (): string =>\n `${\n this.isGlobalDeclaration\n ? \"VAR\"\n : this.isNewTemporaryDeclaration\n ? \"~ temp\"\n : \"\"\n } ${this.variableName}`;\n}\n","import { AuthorWarning } from \"./AuthorWarning\";\nimport { Choice } from \"./Choice\";\nimport { Conditional } from \"./Conditional/Conditional\";\nimport { ConstantDeclaration } from \"./Declaration/ConstantDeclaration\";\nimport { Container as RuntimeContainer } from \"../../../engine/Container\";\nimport { Divert } from \"./Divert/Divert\";\nimport { Divert as RuntimeDivert } from \"../../../engine/Divert\";\nimport { DivertTarget } from \"./Divert/DivertTarget\";\nimport { FlowBase } from \"./Flow/FlowBase\";\nimport { Gather } from \"./Gather/Gather\";\nimport { GatherPointToResolve } from \"./Gather/GatherPointToResolve\";\nimport { IWeavePoint } from \"./IWeavePoint\";\nimport { ParsedObject } from \"./Object\";\nimport { InkObject as RuntimeObject } from \"../../../engine/Object\";\nimport { Sequence } from \"./Sequence/Sequence\";\nimport { Story } from \"./Story\";\nimport { Text } from \"./Text\";\nimport { TunnelOnwards } from \"./TunnelOnwards\";\nimport { VariableAssignment } from \"./Variable/VariableAssignment\";\nimport { asOrNull } from \"../../../engine/TypeAssertion\";\n\ntype BadTerminationHandler = (terminatingObj: ParsedObject) => void;\n\n// Used by the FlowBase when constructing the weave flow from\n// a flat list of content objects.\nexport class Weave extends ParsedObject {\n // Containers can be chained as multiple gather points\n // get created as the same indentation level.\n // rootContainer is always the first in the chain, while\n // currentContainer is the latest.\n get rootContainer(): RuntimeContainer {\n if (!this._rootContainer) {\n this._rootContainer = this.GenerateRuntimeObject();\n }\n\n return this._rootContainer;\n }\n\n // Keep track of previous weave point (Choice or Gather)\n // at the current indentation level:\n // - to add ordinary content to be nested under it\n // - to add nested content under it when it's indented\n // - to remove it from the list of loose ends when\n // - it has indented content since it's no longer a loose end\n // - it's a gather and it has a choice added to it\n public previousWeavePoint: IWeavePoint | null = null;\n public addContentToPreviousWeavePoint: boolean = false;\n\n // Used for determining whether the next Gather should auto-enter\n public hasSeenChoiceInSection: boolean = false;\n\n public currentContainer: RuntimeContainer | null = null;\n public baseIndentIndex: number;\n\n private _unnamedGatherCount: number = 0;\n private _choiceCount: number = 0;\n private _rootContainer: RuntimeContainer | null = null;\n private _namedWeavePoints: Map<string, IWeavePoint> = new Map();\n get namedWeavePoints() {\n return this._namedWeavePoints;\n }\n\n // Loose ends are:\n // - Choices or Gathers that need to be joined up\n // - Explicit Divert to gather points (i.e. \"->\" without a target)\n public looseEnds: IWeavePoint[] = [];\n\n public gatherPointsToResolve: GatherPointToResolve[] = [];\n\n get lastParsedSignificantObject(): ParsedObject | null {\n if (this.content.length === 0) {\n return null;\n }\n\n // Don't count extraneous newlines or VAR/CONST declarations,\n // since they're \"empty\" statements outside of the main flow.\n let lastObject: ParsedObject | null = null;\n for (let ii = this.content.length - 1; ii >= 0; --ii) {\n lastObject = this.content[ii];\n\n let lastText = asOrNull(lastObject, Text);\n if (lastText && lastText.text === \"\\n\") {\n continue;\n }\n\n if (this.IsGlobalDeclaration(lastObject)) {\n continue;\n }\n\n break;\n }\n\n const lastWeave = asOrNull(lastObject, Weave);\n if (lastWeave) {\n lastObject = lastWeave.lastParsedSignificantObject;\n }\n\n return lastObject;\n }\n\n constructor(cont: ParsedObject[], indentIndex: number = -1) {\n super();\n\n if (indentIndex == -1) {\n this.baseIndentIndex = this.DetermineBaseIndentationFromContent(cont);\n } else {\n this.baseIndentIndex = indentIndex;\n }\n\n this.AddContent(cont);\n\n this.ConstructWeaveHierarchyFromIndentation();\n }\n\n get typeName(): string {\n return \"Weave\";\n }\n\n public readonly ResolveWeavePointNaming = (): void => {\n const namedWeavePoints = [\n ...this.FindAll<IWeavePoint>(Gather)(\n (w) => !(w.name === null || w.name === undefined)\n ),\n ...this.FindAll<IWeavePoint>(Choice)(\n (w) => !(w.name === null || w.name === undefined)\n ),\n ];\n this._namedWeavePoints = new Map();\n\n for (const weavePoint of namedWeavePoints) {\n // Check for weave point naming collisions\n const existingWeavePoint: IWeavePoint | null | undefined =\n this.namedWeavePoints.get(weavePoint.identifier?.name || \"\");\n\n if (existingWeavePoint) {\n const typeName =\n existingWeavePoint instanceof Gather ? \"gather\" : \"choice\";\n const existingObj: ParsedObject = existingWeavePoint;\n\n this.Error(\n `A ${typeName} with the same label name '${\n weavePoint.name\n }' already exists in this context on line ${\n existingObj.debugMetadata\n ? existingObj.debugMetadata.startLineNumber\n : \"NO DEBUG METADATA AVAILABLE\"\n }`,\n weavePoint as ParsedObject\n );\n }\n if (weavePoint.identifier?.name) {\n this.namedWeavePoints.set(weavePoint.identifier?.name, weavePoint);\n }\n }\n };\n\n public readonly ConstructWeaveHierarchyFromIndentation = (): void => {\n // Find nested indentation and convert to a proper object hierarchy\n // (i.e. indented content is replaced with a Weave object that contains\n // that nested content)\n let contentIdx = 0;\n while (contentIdx < this.content.length) {\n const obj: ParsedObject = this.content[contentIdx];\n\n // Choice or Gather\n if (obj instanceof Choice || obj instanceof Gather) {\n const weavePoint: IWeavePoint = obj;\n const weaveIndentIdx = weavePoint.indentationDepth - 1;\n\n // Inner level indentation - recurse\n if (weaveIndentIdx > this.baseIndentIndex) {\n // Step through content until indent jumps out again\n let innerWeaveStartIdx = contentIdx;\n while (contentIdx < this.content.length) {\n const innerWeaveObj =\n asOrNull(this.content[contentIdx], Choice) ||\n asOrNull(this.content[contentIdx], Gather);\n if (innerWeaveObj !== null) {\n const innerIndentIdx = innerWeaveObj.indentationDepth - 1;\n if (innerIndentIdx <= this.baseIndentIndex) {\n break;\n }\n }\n\n contentIdx += 1;\n }\n\n const weaveContentCount = contentIdx - innerWeaveStartIdx;\n const weaveContent = this.content.slice(\n innerWeaveStartIdx,\n innerWeaveStartIdx + weaveContentCount\n );\n\n this.content.splice(innerWeaveStartIdx, weaveContentCount);\n\n const weave = new Weave(weaveContent, weaveIndentIdx);\n this.InsertContent(innerWeaveStartIdx, weave);\n\n // Continue iteration from this point\n contentIdx = innerWeaveStartIdx;\n }\n }\n\n contentIdx += 1;\n }\n };\n\n // When the indentation wasn't told to us at construction time using\n // a choice point with a known indentation level, we may be told to\n // determine the indentation level by incrementing from our closest ancestor.\n public readonly DetermineBaseIndentationFromContent = (\n contentList: ParsedObject[]\n ): number => {\n for (const obj of contentList) {\n if (obj instanceof Choice || obj instanceof Gather) {\n return obj.indentationDepth - 1;\n }\n }\n\n // No weave points, so it doesn't matter\n return 0;\n };\n\n public readonly GenerateRuntimeObject = (): RuntimeContainer => {\n this._rootContainer = new RuntimeContainer();\n this.currentContainer = this._rootContainer;\n this.looseEnds = [];\n this.gatherPointsToResolve = [];\n\n // Iterate through content for the block at this level of indentation\n // - Normal content is nested under Choices and Gathers\n // - Blocks that are further indented cause recursion\n // - Keep track of loose ends so that they can be diverted to Gathers\n for (const obj of this.content) {\n // Choice or Gather\n if (obj instanceof Choice || obj instanceof Gather) {\n this.AddRuntimeForWeavePoint(obj as IWeavePoint);\n } else {\n // Non-weave point\n if (obj instanceof Weave) {\n // Nested weave\n const weave = obj;\n this.AddRuntimeForNestedWeave(weave);\n this.gatherPointsToResolve.splice(\n 0,\n 0,\n ...weave.gatherPointsToResolve\n );\n } else {\n // Other object\n // May be complex object that contains statements - e.g. a multi-line conditional\n this.AddGeneralRuntimeContent(obj.runtimeObject);\n }\n }\n }\n\n // Pass any loose ends up the hierarhcy\n this.PassLooseEndsToAncestors();\n\n return this._rootContainer;\n };\n\n // Found gather point:\n // - gather any loose ends\n // - set the gather as the main container to dump new content in\n public readonly AddRuntimeForGather = (gather: Gather): void => {\n // Determine whether this Gather should be auto-entered:\n // - It is auto-entered if there were no choices in the last section\n // - A section is \"since the previous gather\" - so reset now\n const autoEnter = !this.hasSeenChoiceInSection;\n this.hasSeenChoiceInSection = false;\n\n const gatherContainer = gather.runtimeContainer;\n\n if (!gather.name) {\n // Use disallowed character so it's impossible to have a name collision\n gatherContainer.name = `g-${this._unnamedGatherCount}`;\n this._unnamedGatherCount += 1;\n }\n\n if (autoEnter) {\n if (!this.currentContainer) {\n throw new Error();\n }\n\n // Auto-enter: include in main content\n this.currentContainer.AddContent(gatherContainer);\n } else {\n // Don't auto-enter:\n // Add this gather to the main content, but only accessible\n // by name so that it isn't stepped into automatically, but only via\n // a divert from a loose end.\n this.rootContainer.AddToNamedContentOnly(gatherContainer);\n }\n\n // Consume loose ends: divert them to this gather\n for (const looseEndWeavePoint of this.looseEnds) {\n const looseEnd = looseEndWeavePoint as ParsedObject;\n\n // Skip gather loose ends that are at the same level\n // since they'll be handled by the auto-enter code below\n // that only jumps into the gather if (current runtime choices == 0)\n if (looseEnd instanceof Gather) {\n const prevGather = looseEnd;\n if (prevGather.indentationDepth == gather.indentationDepth) {\n continue;\n }\n }\n\n let divert: RuntimeDivert | null = null;\n if (looseEnd instanceof Divert) {\n divert = looseEnd.runtimeObject as RuntimeDivert;\n } else {\n divert = new RuntimeDivert();\n const looseWeavePoint = looseEnd as IWeavePoint;\n if (!looseWeavePoint.runtimeContainer) {\n throw new Error();\n }\n\n looseWeavePoint.runtimeContainer.AddContent(divert);\n }\n\n // Pass back knowledge of this loose end being diverted\n // to the FlowBase so that it can maintain a list of them,\n // and resolve the divert references later\n this.gatherPointsToResolve.push(\n new GatherPointToResolve(divert, gatherContainer)\n );\n }\n\n this.looseEnds = [];\n\n // Replace the current container itself\n this.currentContainer = gatherContainer;\n };\n\n public readonly AddRuntimeForWeavePoint = (weavePoint: IWeavePoint): void => {\n // Current level Gather\n if (weavePoint instanceof Gather) {\n this.AddRuntimeForGather(weavePoint);\n }\n\n // Current level choice\n else if (weavePoint instanceof Choice) {\n if (!this.currentContainer) {\n throw new Error();\n }\n\n // Gathers that contain choices are no longer loose ends\n // (same as when weave points get nested content)\n if (this.previousWeavePoint instanceof Gather) {\n this.looseEnds.splice(\n this.looseEnds.indexOf(this.previousWeavePoint),\n 1\n );\n }\n\n // Add choice point content\n const choice = weavePoint; //, Choice);\n\n this.currentContainer.AddContent(choice.runtimeObject);\n if (!choice.innerContentContainer) {\n throw new Error();\n } //guaranteed not to happen\n\n // Add choice's inner content to self\n choice.innerContentContainer.name = `c-${this._choiceCount}`;\n this.currentContainer.AddToNamedContentOnly(choice.innerContentContainer);\n this._choiceCount += 1;\n\n this.hasSeenChoiceInSection = true;\n }\n\n // Keep track of loose ends\n this.addContentToPreviousWeavePoint = false; // default\n if (this.WeavePointHasLooseEnd(weavePoint)) {\n this.looseEnds.push(weavePoint);\n\n const looseChoice = asOrNull(weavePoint, Choice);\n if (looseChoice) {\n this.addContentToPreviousWeavePoint = true;\n }\n }\n\n this.previousWeavePoint = weavePoint;\n };\n\n // Add nested block at a greater indentation level\n public readonly AddRuntimeForNestedWeave = (nestedResult: Weave): void => {\n // Add this inner block to current container\n // (i.e. within the main container, or within the last defined Choice/Gather)\n this.AddGeneralRuntimeContent(nestedResult.rootContainer);\n\n // Now there's a deeper indentation level, the previous weave point doesn't\n // count as a loose end (since it will have content to go to)\n if (this.previousWeavePoint !== null) {\n this.looseEnds.splice(this.looseEnds.indexOf(this.previousWeavePoint), 1);\n\n this.addContentToPreviousWeavePoint = false;\n }\n };\n\n // Normal content gets added into the latest Choice or Gather by default,\n // unless there hasn't been one yet.\n public readonly AddGeneralRuntimeContent = (content: RuntimeObject): void => {\n // Content is allowed to evaluate runtimeObject to null\n // (e.g. AuthorWarning, which doesn't make it into the runtime)\n if (content === null) {\n return;\n }\n\n if (this.addContentToPreviousWeavePoint) {\n if (\n !this.previousWeavePoint ||\n !this.previousWeavePoint.runtimeContainer\n ) {\n throw new Error();\n }\n\n this.previousWeavePoint.runtimeContainer.AddContent(content);\n } else {\n if (!this.currentContainer) {\n throw new Error();\n }\n\n this.currentContainer.AddContent(content);\n }\n };\n\n public readonly PassLooseEndsToAncestors = () => {\n if (this.looseEnds.length === 0) {\n return;\n }\n\n // Search for Weave ancestor to pass loose ends to for gathering.\n // There are two types depending on whether the current weave\n // is separated by a conditional or sequence.\n // - An \"inner\" weave is one that is directly connected to the current\n // weave - i.e. you don't have to pass through a conditional or\n // sequence to get to it. We're allowed to pass all loose ends to\n // one of these.\n // - An \"outer\" weave is one that is outside of a conditional/sequence\n // that the current weave is nested within. We're only allowed to\n // pass gathers (i.e. 'normal flow') loose ends up there, not normal\n // choices. The rule is that choices have to be diverted explicitly\n // by the author since it's ambiguous where flow should go otherwise.\n //\n // e.g.:\n //\n // - top <- e.g. outer weave\n // {true:\n // * choice <- e.g. inner weave\n // * * choice 2\n // more content <- e.g. current weave\n // * choice 2\n // }\n // - more of outer weave\n //\n let closestInnerWeaveAncestor: Weave | null = null;\n let closestOuterWeaveAncestor: Weave | null = null;\n\n // Find inner and outer ancestor weaves as defined above.\n let nested = false;\n for (\n let ancestor = this.parent;\n ancestor !== null;\n ancestor = ancestor.parent\n ) {\n // Found ancestor?\n const weaveAncestor = asOrNull(ancestor, Weave);\n if (weaveAncestor) {\n if (!nested && closestInnerWeaveAncestor === null) {\n closestInnerWeaveAncestor = weaveAncestor;\n }\n\n if (nested && closestOuterWeaveAncestor === null) {\n closestOuterWeaveAncestor = weaveAncestor;\n }\n }\n\n // Weaves nested within Sequences or Conditionals are\n // \"sealed\" - any loose ends require explicit diverts.\n if (ancestor instanceof Sequence || ancestor instanceof Conditional) {\n nested = true;\n }\n }\n\n // No weave to pass loose ends to at all?\n if (\n closestInnerWeaveAncestor === null &&\n closestOuterWeaveAncestor === null\n ) {\n return;\n }\n\n // Follow loose end passing logic as defined above\n for (let ii = this.looseEnds.length - 1; ii >= 0; ii -= 1) {\n const looseEnd = this.looseEnds[ii];\n let received = false;\n\n if (nested) {\n // This weave is nested within a conditional or sequence:\n // - choices can only be passed up to direct ancestor (\"inner\") weaves\n // - gathers can be passed up to either, but favour the closer (inner) weave\n // if there is one\n if (looseEnd instanceof Choice && closestInnerWeaveAncestor !== null) {\n closestInnerWeaveAncestor.ReceiveLooseEnd(looseEnd);\n received = true;\n } else if (!(looseEnd instanceof Choice)) {\n const receivingWeave =\n closestInnerWeaveAncestor || closestOuterWeaveAncestor;\n if (receivingWeave !== null) {\n receivingWeave.ReceiveLooseEnd(looseEnd);\n received = true;\n }\n }\n } else {\n // No nesting, all loose ends can be safely passed up\n if (closestInnerWeaveAncestor?.hasOwnProperty(\"ReceiveLooseEnd\")) {\n closestInnerWeaveAncestor!.ReceiveLooseEnd(looseEnd);\n }\n received = true;\n }\n\n if (received) {\n this.looseEnds.splice(ii, 1);\n }\n }\n };\n\n public readonly ReceiveLooseEnd = (childWeaveLooseEnd: IWeavePoint): void => {\n this.looseEnds.push(childWeaveLooseEnd);\n };\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n\n // Check that choices nested within conditionals and sequences are terminated\n if (this.looseEnds !== null && this.looseEnds.length > 0) {\n let isNestedWeave = false;\n for (\n let ancestor = this.parent;\n ancestor !== null;\n ancestor = ancestor.parent\n ) {\n if (ancestor instanceof Sequence || ancestor instanceof Conditional) {\n isNestedWeave = true;\n break;\n }\n }\n\n if (isNestedWeave) {\n this.ValidateTermination(this.BadNestedTerminationHandler);\n }\n }\n\n for (const gatherPoint of this.gatherPointsToResolve) {\n gatherPoint.divert.targetPath = gatherPoint.targetRuntimeObj.path;\n }\n\n this.CheckForWeavePointNamingCollisions();\n }\n\n public readonly WeavePointNamed = (name: string): IWeavePoint | null => {\n if (!this.namedWeavePoints) {\n return null;\n }\n\n let weavePointResult: IWeavePoint | null | undefined =\n this.namedWeavePoints.get(name);\n if (weavePointResult) {\n return weavePointResult;\n }\n\n return null;\n };\n\n // Global VARs and CONSTs are treated as \"outside of the flow\"\n // when iterating over content that follows loose ends\n public readonly IsGlobalDeclaration = (obj: ParsedObject) => {\n const varAss = asOrNull(obj, VariableAssignment);\n if (varAss && varAss.isGlobalDeclaration && varAss.isDeclaration) {\n return true;\n }\n\n const constDecl = asOrNull(obj, ConstantDeclaration);\n if (constDecl) {\n return true;\n }\n\n return false;\n };\n\n // While analysing final loose ends, we look to see whether there\n // are any diverts etc which choices etc divert from\n public readonly ContentThatFollowsWeavePoint = (\n weavePoint: IWeavePoint\n ): ParsedObject[] => {\n const returned = [];\n const obj = weavePoint as ParsedObject;\n\n // Inner content first (e.g. for a choice)\n if (obj.content !== null) {\n for (const contentObj of obj.content) {\n // Global VARs and CONSTs are treated as \"outside of the flow\"\n if (this.IsGlobalDeclaration(contentObj)) {\n continue;\n }\n\n returned.push(contentObj);\n }\n }\n\n const parentWeave = asOrNull(obj.parent, Weave);\n if (parentWeave === null) {\n throw new Error(\"Expected weave point parent to be weave?\");\n }\n\n const weavePointIdx = parentWeave.content.indexOf(obj);\n for (let ii = weavePointIdx + 1; ii < parentWeave.content.length; ii += 1) {\n const laterObj = parentWeave.content[ii];\n\n // Global VARs and CONSTs are treated as \"outside of the flow\"\n if (this.IsGlobalDeclaration(laterObj)) {\n continue;\n }\n\n // End of the current flow\n // if (laterObj instanceof IWeavePoint) // cannot test on interface in ts\n if (laterObj instanceof Choice || laterObj instanceof Gather) {\n break;\n }\n\n // Other weaves will be have their own loose ends\n if (laterObj instanceof Weave) {\n break;\n }\n\n returned.push(laterObj);\n }\n\n return returned;\n };\n\n public readonly ValidateTermination = (\n badTerminationHandler: BadTerminationHandler\n ): void => {\n // Don't worry if the last object in the flow is a \"TODO\",\n // even if there are other loose ends in other places\n if (this.lastParsedSignificantObject instanceof AuthorWarning) {\n return;\n }\n\n // By now, any sub-weaves will have passed loose ends up to the root weave (this).\n // So there are 2 possible situations:\n // - There are loose ends from somewhere in the flow.\n // These aren't necessarily \"real\" loose ends - they're weave points\n // that don't connect to any lower weave points, so we just\n // have to check that they terminate properly.\n // - This weave is just a list of content with no actual weave points,\n // so we just need to check that the list of content terminates.\n\n const hasLooseEnds: boolean =\n this.looseEnds !== null && this.looseEnds.length > 0;\n\n if (hasLooseEnds) {\n for (const looseEnd of this.looseEnds) {\n const looseEndFlow = this.ContentThatFollowsWeavePoint(looseEnd);\n this.ValidateFlowOfObjectsTerminates(\n looseEndFlow,\n looseEnd as ParsedObject,\n badTerminationHandler\n );\n }\n } else {\n // No loose ends... is there any inner weaving at all?\n // If not, make sure the single content stream is terminated correctly\n //\n // If there's any actual weaving, assume that content is\n // terminated correctly since we would've had a loose end otherwise\n for (const obj of this.content) {\n if (obj instanceof Choice || obj instanceof Divert) {\n return;\n }\n }\n\n // Straight linear flow? Check it terminates\n this.ValidateFlowOfObjectsTerminates(\n this.content,\n this,\n badTerminationHandler\n );\n }\n };\n\n readonly BadNestedTerminationHandler: BadTerminationHandler = (\n terminatingObj\n ) => {\n let conditional: Conditional | null = null;\n for (\n let ancestor = terminatingObj.parent;\n ancestor !== null;\n ancestor = ancestor.parent\n ) {\n if (ancestor instanceof Sequence || ancestor instanceof Conditional) {\n conditional = asOrNull(ancestor, Conditional);\n break;\n }\n }\n\n let errorMsg =\n \"Choices nested in conditionals or sequences need to explicitly divert afterwards.\";\n\n // Tutorialise proper choice syntax if this looks like a single choice within a condition, e.g.\n // { condition:\n // * choice\n // }\n if (conditional !== null) {\n let numChoices = conditional.FindAll<Choice>(Choice)().length;\n if (numChoices === 1) {\n errorMsg = `Choices with conditions should be written: '* {condition} choice'. Otherwise, ${errorMsg.toLowerCase()}`;\n }\n }\n\n this.Error(errorMsg, terminatingObj);\n };\n\n public readonly ValidateFlowOfObjectsTerminates = (\n objFlow: ParsedObject[],\n defaultObj: ParsedObject,\n badTerminationHandler: BadTerminationHandler\n ) => {\n let terminated = false;\n let terminatingObj: ParsedObject = defaultObj;\n for (const flowObj of objFlow) {\n const divert = flowObj.Find(Divert)(\n (d) =>\n !d.isThread &&\n !d.isTunnel &&\n !d.isFunctionCall &&\n !(d.parent instanceof DivertTarget)\n );\n\n if (divert !== null) {\n terminated = true;\n }\n\n if (flowObj.Find(TunnelOnwards)() != null) {\n terminated = true;\n break;\n }\n\n terminatingObj = flowObj;\n }\n\n if (!terminated) {\n // Author has left a note to self here - clearly we don't need\n // to leave them with another warning since they know what they're doing.\n if (terminatingObj instanceof AuthorWarning) {\n return;\n }\n\n badTerminationHandler(terminatingObj);\n }\n };\n\n public readonly WeavePointHasLooseEnd = (\n weavePoint: IWeavePoint\n ): boolean => {\n // No content, must be a loose end.\n if (weavePoint.content === null) {\n return true;\n }\n\n // If a weave point is diverted from, it doesn't have a loose end.\n // Detect a divert object within a weavePoint's main content\n // Work backwards since we're really interested in the end,\n // although it doesn't actually make a difference!\n // (content after a divert will simply be inaccessible)\n for (let ii = weavePoint.content.length - 1; ii >= 0; --ii) {\n let innerDivert = asOrNull(weavePoint.content[ii], Divert);\n if (innerDivert) {\n const willReturn =\n innerDivert.isThread ||\n innerDivert.isTunnel ||\n innerDivert.isFunctionCall;\n if (!willReturn) {\n return false;\n }\n }\n }\n\n return true;\n };\n\n // Enforce rule that weave points must not have the same\n // name as any stitches or knots upwards in the hierarchy\n public readonly CheckForWeavePointNamingCollisions = (): void => {\n if (!this.namedWeavePoints) {\n return;\n }\n\n const ancestorFlows = [];\n for (const obj of this.ancestry) {\n const flow = asOrNull(obj, FlowBase);\n if (flow) {\n ancestorFlows.push(flow);\n } else {\n break;\n }\n }\n\n for (const [weavePointName, weavePoint] of this.namedWeavePoints) {\n for (const flow of ancestorFlows) {\n // Shallow search\n const otherContentWithName =\n flow.ContentWithNameAtLevel(weavePointName);\n if (otherContentWithName && otherContentWithName !== weavePoint) {\n const errorMsg = `${weavePoint.GetType()} '${weavePointName}' has the same label name as a ${otherContentWithName.GetType()} (on ${\n otherContentWithName.debugMetadata\n })`;\n this.Error(errorMsg, weavePoint);\n }\n }\n }\n };\n}\n","import { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { ControlCommand as RuntimeControlCommand } from \"../../../../engine/ControlCommand\";\nimport { Divert as RuntimeDivert } from \"../../../../engine/Divert\";\nimport { Expression } from \"../Expression/Expression\";\nimport { ParsedObject } from \"../Object\";\nimport { InkObject as RuntimeObject } from \"../../../../engine/Object\";\nimport { NativeFunctionCall } from \"../../../../engine/NativeFunctionCall\";\nimport { StringValue } from \"../../../../engine/Value\";\nimport { Story } from \"../Story\";\nimport { Text } from \"../Text\";\nimport { Weave } from \"../Weave\";\nimport { asOrNull } from \"../../../../engine/TypeAssertion\";\n\nexport class ConditionalSingleBranch extends ParsedObject {\n public _contentContainer: RuntimeContainer | null = null;\n public _conditionalDivert: RuntimeDivert | null = null;\n public _ownExpression: Expression | null = null;\n public _innerWeave: Weave | null = null;\n // bool condition, e.g.:\n // { 5 == 4:\n // - the true branch\n // - the false branch\n // }\n public isTrueBranch: boolean = false;\n\n // When each branch has its own expression like a switch statement,\n // this is non-null. e.g.\n // { x:\n // - 4: the value of x is four (ownExpression is the value 4)\n // - 3: the value of x is three\n // }\n get ownExpression() {\n return this._ownExpression;\n }\n\n set ownExpression(value) {\n this._ownExpression = value;\n if (this._ownExpression) {\n this.AddContent(this._ownExpression);\n }\n }\n\n // In the above example, match equality of x with 4 for the first branch.\n // This is as opposed to simply evaluating boolean equality for each branch,\n // example when shouldMatchEquality is FALSE:\n // {\n // 3 > 2: This will happen\n // 2 > 3: This won't happen\n // }\n public matchingEquality: boolean = false;\n\n public isElse: boolean = false;\n public isInline: boolean = false;\n\n public returnDivert: RuntimeDivert | null = null;\n\n constructor(content?: ParsedObject[] | null | undefined) {\n super();\n\n // Branches are allowed to be empty\n if (content) {\n this._innerWeave = new Weave(content);\n this.AddContent(this._innerWeave);\n }\n }\n\n get typeName(): string {\n return \"ConditionalSingleBranch\";\n }\n\n // Runtime content can be summarised as follows:\n // - Evaluate an expression if necessary to branch on\n // - Branch to a named container if true\n // - Divert back to main flow\n // (owner Conditional is in control of this target point)\n public readonly GenerateRuntimeObject = (): RuntimeObject => {\n // Check for common mistake, of putting \"else:\" instead of \"- else:\"\n if (this._innerWeave) {\n for (const c of this._innerWeave.content) {\n const text = asOrNull(c, Text);\n if (text) {\n // Don't need to trim at the start since the parser handles that already\n if (text.text.startsWith(\"else:\")) {\n this.Warning(\n \"Saw the text 'else:' which is being treated as content. Did you mean '- else:'?\",\n text\n );\n }\n }\n }\n }\n\n const container = new RuntimeContainer();\n\n // Are we testing against a condition that's used for more than just this\n // branch? If so, the first thing we need to do is replicate the value that's\n // on the evaluation stack so that we don't fully consume it, in case other\n // branches need to use it.\n const duplicatesStackValue: boolean = this.matchingEquality && !this.isElse;\n\n if (duplicatesStackValue) {\n container.AddContent(RuntimeControlCommand.Duplicate());\n }\n\n this._conditionalDivert = new RuntimeDivert();\n\n // else clause is unconditional catch-all, otherwise the divert is conditional\n this._conditionalDivert.isConditional = !this.isElse;\n\n // Need extra evaluation?\n if (!this.isTrueBranch && !this.isElse) {\n const needsEval: boolean = this.ownExpression !== null;\n if (needsEval) {\n container.AddContent(RuntimeControlCommand.EvalStart());\n }\n\n if (this.ownExpression) {\n this.ownExpression.GenerateIntoContainer(container);\n }\n\n // Uses existing duplicated value\n if (this.matchingEquality) {\n container.AddContent(NativeFunctionCall.CallWithName(\"==\"));\n }\n\n if (needsEval) {\n container.AddContent(RuntimeControlCommand.EvalEnd());\n }\n }\n\n // Will pop from stack if conditional\n container.AddContent(this._conditionalDivert);\n\n this._contentContainer = this.GenerateRuntimeForContent();\n this._contentContainer.name = \"b\";\n\n // Multi-line conditionals get a newline at the start of each branch\n // (as opposed to the start of the multi-line conditional since the condition\n // may evaluate to false.)\n if (!this.isInline) {\n this._contentContainer.InsertContent(new StringValue(\"\\n\"), 0);\n }\n\n if (duplicatesStackValue || (this.isElse && this.matchingEquality)) {\n this._contentContainer.InsertContent(\n RuntimeControlCommand.PopEvaluatedValue(),\n 0\n );\n }\n\n container.AddToNamedContentOnly(this._contentContainer);\n\n this.returnDivert = new RuntimeDivert();\n this._contentContainer.AddContent(this.returnDivert);\n\n return container;\n };\n\n public readonly GenerateRuntimeForContent = (): RuntimeContainer => {\n // Empty branch - create empty container\n if (this._innerWeave === null) {\n return new RuntimeContainer();\n }\n\n return this._innerWeave.rootContainer;\n };\n\n public ResolveReferences(context: Story): void {\n if (!this._conditionalDivert || !this._contentContainer) {\n throw new Error();\n }\n\n this._conditionalDivert.targetPath = this._contentContainer.path;\n super.ResolveReferences(context);\n }\n}\n","export class DebugMetadata {\n public startLineNumber: number = 0;\n public endLineNumber: number = 0;\n public startCharacterNumber: number = 0;\n public endCharacterNumber: number = 0;\n public fileName: string | null = null;\n public sourceName: string | null = null;\n\n public Merge(dm: DebugMetadata) {\n let newDebugMetadata = new DebugMetadata();\n\n newDebugMetadata.fileName = this.fileName;\n newDebugMetadata.sourceName = this.sourceName;\n\n if (this.startLineNumber < dm.startLineNumber) {\n newDebugMetadata.startLineNumber = this.startLineNumber;\n newDebugMetadata.startCharacterNumber = this.startCharacterNumber;\n } else if (this.startLineNumber > dm.startLineNumber) {\n newDebugMetadata.startLineNumber = dm.startLineNumber;\n newDebugMetadata.startCharacterNumber = dm.startCharacterNumber;\n } else {\n newDebugMetadata.startLineNumber = this.startLineNumber;\n newDebugMetadata.startCharacterNumber = Math.min(\n this.startCharacterNumber,\n dm.startCharacterNumber\n );\n }\n\n if (this.endLineNumber > dm.endLineNumber) {\n newDebugMetadata.endLineNumber = this.endLineNumber;\n newDebugMetadata.endCharacterNumber = this.endCharacterNumber;\n } else if (this.endLineNumber < dm.endLineNumber) {\n newDebugMetadata.endLineNumber = dm.endLineNumber;\n newDebugMetadata.endCharacterNumber = dm.endCharacterNumber;\n } else {\n newDebugMetadata.endLineNumber = this.endLineNumber;\n newDebugMetadata.endCharacterNumber = Math.max(\n this.endCharacterNumber,\n dm.endCharacterNumber\n );\n }\n\n return newDebugMetadata;\n }\n\n public toString() {\n if (this.fileName !== null) {\n return `line ${this.startLineNumber} of ${this.fileName}\"`;\n } else {\n return \"line \" + this.startLineNumber;\n }\n }\n}\n","export enum StatementLevel {\n InnerBlock,\n Stitch,\n Knot,\n Top,\n}\n","import { INamedContent } from \"../../../../engine/INamedContent\";\nimport { ParsedObject } from \"../Object\";\nimport { InkObject as RuntimeObject } from \"../../../../engine/Object\";\nimport { Identifier } from \"../Identifier\";\n\nexport class ExternalDeclaration extends ParsedObject implements INamedContent {\n public get name(): string | null {\n return this.identifier?.name || null;\n }\n\n constructor(\n public readonly identifier: Identifier,\n public readonly argumentNames: string[]\n ) {\n super();\n }\n\n get typeName(): string {\n return \"EXTERNAL\";\n }\n\n public readonly GenerateRuntimeObject = (): RuntimeObject | null => {\n this.story.AddExternal(this);\n\n // No runtime code exists for an external, only metadata\n return null;\n };\n\n public toString(): string {\n return `EXTERNAL ${this.identifier?.name}`;\n }\n}\n","import { Argument } from \"./ParsedHierarchy/Argument\";\nimport { Identifier } from \"./ParsedHierarchy/Identifier\";\n\nexport class FlowDecl {\n constructor(\n public readonly name: Identifier,\n public readonly args: Argument[],\n public readonly isFunction: boolean\n ) {}\n}\n","import { Glue as RuntimeGlue } from \"../../../engine/Glue\";\nimport { Wrap } from \"./Wrap\";\n\nexport class Glue extends Wrap<RuntimeGlue> {\n constructor(glue: RuntimeGlue) {\n super(glue);\n }\n\n get typeName(): string {\n return \"Glue\";\n }\n}\n","import { ParsedObject } from \"./Object\";\nimport { InkObject as RuntimeObject } from \"../../../engine/Object\";\n\nexport class Wrap<T extends RuntimeObject> extends ParsedObject {\n constructor(private _objToWrap: T) {\n super();\n }\n\n public readonly GenerateRuntimeObject = (): RuntimeObject => this._objToWrap;\n}\n","import { InkObject } from \"./Object\";\n\nexport class Glue extends InkObject {\n public toString() {\n return \"Glue\";\n }\n}\n","import { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { ContentList } from \"../ContentList\";\nimport { Expression } from \"./Expression\";\nimport { FlowBase } from \"../Flow/FlowBase\";\nimport { NativeFunctionCall } from \"../../../../engine/NativeFunctionCall\";\nimport { IntValue } from \"../../../../engine/Value\";\nimport { Story } from \"../Story\";\nimport { VariableAssignment as RuntimeVariableAssignment } from \"../../../../engine/VariableAssignment\";\nimport { VariableReference as RuntimeVariableReference } from \"../../../../engine/VariableReference\";\nimport { Weave } from \"../Weave\";\nimport { Identifier } from \"../Identifier\";\n\nexport class IncDecExpression extends Expression {\n private _runtimeAssignment: RuntimeVariableAssignment | null = null;\n\n public isInc: boolean;\n public expression: Expression | null = null;\n\n constructor(\n public readonly varIdentifier: Identifier | null,\n isIncOrExpression: boolean | Expression,\n isInc?: boolean\n ) {\n super();\n\n if (isIncOrExpression instanceof Expression) {\n this.expression = isIncOrExpression;\n this.AddContent(this.expression);\n this.isInc = Boolean(isInc);\n } else {\n this.isInc = isIncOrExpression as boolean;\n }\n }\n\n get typeName(): string {\n return \"IncDecExpression\";\n }\n\n public readonly GenerateIntoContainer = (\n container: RuntimeContainer\n ): void => {\n // x = x + y\n // ^^^ ^ ^ ^\n // 4 1 3 2\n // Reverse polish notation: (x 1 +) (assign to x)\n\n // 1.\n container.AddContent(\n new RuntimeVariableReference(this.varIdentifier?.name || null)\n );\n\n // 2.\n // - Expression used in the form ~ x += y\n // - Simple version: ~ x++\n if (this.expression) {\n this.expression.GenerateIntoContainer(container);\n } else {\n container.AddContent(new IntValue(1));\n }\n\n // 3.\n container.AddContent(\n NativeFunctionCall.CallWithName(this.isInc ? \"+\" : \"-\")\n );\n\n // 4.\n this._runtimeAssignment = new RuntimeVariableAssignment(\n this.varIdentifier?.name || null,\n false\n );\n container.AddContent(this._runtimeAssignment);\n };\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n\n const varResolveResult = context.ResolveVariableWithName(\n this.varIdentifier?.name || \"\",\n this\n );\n\n if (!varResolveResult.found) {\n this.Error(\n `variable for ${this.incrementDecrementWord} could not be found: '${this.varIdentifier}' after searching: {this.descriptionOfScope}`\n );\n }\n\n if (!this._runtimeAssignment) {\n throw new Error();\n }\n\n this._runtimeAssignment.isGlobal = varResolveResult.isGlobal;\n\n if (\n !(this.parent instanceof Weave) &&\n !(this.parent instanceof FlowBase) &&\n !(this.parent instanceof ContentList)\n ) {\n this.Error(`Can't use ${this.incrementDecrementWord} as sub-expression`);\n }\n }\n\n get incrementDecrementWord(): \"increment\" | \"decrement\" {\n if (this.isInc) {\n return \"increment\";\n }\n\n return \"decrement\";\n }\n\n public readonly toString = (): string => {\n if (this.expression) {\n return `${this.varIdentifier?.name}${this.isInc ? \" += \" : \" -= \"}${\n this.expression\n }`;\n }\n\n return `${this.varIdentifier?.name}` + (this.isInc ? \"++\" : \"--\");\n };\n}\n","import { ParsedObject } from \"./Object\";\nimport { InkObject as RuntimeObject } from \"../../../engine/Object\";\nimport { Story } from \"./Story\";\n\nexport class IncludedFile extends ParsedObject {\n constructor(public readonly includedStory: Story | null) {\n super();\n }\n\n public readonly GenerateRuntimeObject = (): RuntimeObject | null => {\n // Left to the main story to process\n return null;\n };\n}\n","export class InfixOperator {\n constructor(\n public readonly type: string,\n public readonly precedence: number,\n public readonly requireWhitespace: boolean\n ) {}\n\n public readonly toString = (): string => this.type;\n}\n","import { Argument } from \"./Argument\";\nimport { FlowBase } from \"./Flow/FlowBase\";\nimport { FlowLevel } from \"./Flow/FlowLevel\";\nimport { Identifier } from \"./Identifier\";\nimport { ParsedObject } from \"./Object\";\nimport { Story } from \"./Story\";\n\nexport class Knot extends FlowBase {\n get flowLevel(): FlowLevel {\n return FlowLevel.Knot;\n }\n\n constructor(\n name: Identifier,\n topLevelObjects: ParsedObject[],\n args: Argument[],\n isFunction: boolean\n ) {\n super(name, topLevelObjects, args, isFunction);\n }\n\n get typeName(): string {\n return this.isFunction ? \"Function\" : \"Knot\";\n }\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n\n let parentStory = this.story;\n\n // Enforce rule that stitches must not have the same\n // name as any knots that exist in the story\n for (const stitchName in this.subFlowsByName) {\n const knotWithStitchName = parentStory.ContentWithNameAtLevel(\n stitchName,\n FlowLevel.Knot,\n false\n );\n\n if (knotWithStitchName) {\n const stitch = this.subFlowsByName.get(stitchName);\n const errorMsg = `Stitch '${\n stitch ? stitch.name : \"NO STITCH FOUND\"\n }' has the same name as a knot (on ${\n knotWithStitchName.debugMetadata\n })`;\n this.Error(errorMsg, stitch);\n }\n }\n }\n}\n","import { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { Expression } from \"../Expression/Expression\";\nimport { InkList as RuntimeInkList } from \"../../../../engine/InkList\";\nimport { InkListItem as RuntimeInkListItem } from \"../../../../engine/InkList\";\nimport { ListElementDefinition } from \"./ListElementDefinition\";\nimport { ListValue } from \"../../../../engine/Value\";\nimport { Identifier } from \"../Identifier\";\n\nexport class List extends Expression {\n constructor(public readonly itemIdentifierList: Identifier[]) {\n super();\n }\n\n get typeName(): string {\n return \"List\";\n }\n\n public readonly GenerateIntoContainer = (\n container: RuntimeContainer\n ): void => {\n const runtimeRawList = new RuntimeInkList();\n\n if (this.itemIdentifierList != null) {\n for (const itemIdentifier of this.itemIdentifierList) {\n const nameParts = itemIdentifier?.name?.split(\".\") || [];\n\n let listName: string | null = null;\n let listItemName: string = \"\";\n if (nameParts.length > 1) {\n listName = nameParts[0];\n listItemName = nameParts[1];\n } else {\n listItemName = nameParts[0];\n }\n\n const listItem = this.story.ResolveListItem(\n listName,\n listItemName,\n this\n ) as ListElementDefinition;\n\n if (listItem === null) {\n if (listName === null) {\n this.Error(\n `Could not find list definition that contains item '${itemIdentifier}'`\n );\n } else {\n this.Error(`Could not find list item ${itemIdentifier}`);\n }\n } else {\n if (listItem.parent == null) {\n this.Error(\n `Could not find list definition for item ${itemIdentifier}`\n );\n return;\n }\n if (!listName) {\n listName = listItem.parent.identifier?.name || null;\n }\n\n const item = new RuntimeInkListItem(listName, listItem.name || null);\n\n if (runtimeRawList.has(item.serialized())) {\n this.Warning(`Duplicate of item '${itemIdentifier}' in list.`);\n } else {\n runtimeRawList.Add(item, listItem.seriesValue);\n }\n }\n }\n }\n\n container.AddContent(new ListValue(runtimeRawList));\n };\n}\n","import { ListDefinition } from \"./ListDefinition\";\nimport { ParsedObject } from \"../Object\";\nimport { InkObject as RuntimeObject } from \"../../../../engine/Object\";\nimport { Story } from \"../Story\";\nimport { SymbolType } from \"../SymbolType\";\nimport { Identifier } from \"../Identifier\";\n\nexport class ListElementDefinition extends ParsedObject {\n public seriesValue: number = 0;\n\n public parent: ListDefinition | null = null;\n\n get fullName(): string {\n const parentList = this.parent;\n if (parentList === null) {\n throw new Error(\"Can't get full name without a parent list.\");\n }\n\n return `${parentList.identifier?.name}.${this.name}`;\n }\n\n get typeName(): string {\n return \"ListElement\";\n }\n\n get name(): string | null {\n return this.indentifier?.name || null;\n }\n\n constructor(\n public readonly indentifier: Identifier,\n public readonly inInitialList: boolean,\n public readonly explicitValue: number | null = null\n ) {\n super();\n this.parent = super.parent as ListDefinition;\n }\n\n public readonly GenerateRuntimeObject = (): RuntimeObject => {\n throw new Error(\"Not implemented.\");\n };\n\n public ResolveReferences(context: Story): void {\n super.ResolveReferences(context);\n context.CheckForNamingCollisions(\n this,\n this.indentifier,\n SymbolType.ListItem\n );\n }\n\n public readonly toString = (): string => this.fullName;\n}\n","import { Argument } from \"./Argument\";\nimport { FlowBase } from \"./Flow/FlowBase\";\nimport { FlowLevel } from \"./Flow/FlowLevel\";\nimport { Identifier } from \"./Identifier\";\nimport { ParsedObject } from \"./Object\";\n\nexport class Stitch extends FlowBase {\n get flowLevel(): FlowLevel {\n return FlowLevel.Stitch;\n }\n\n constructor(\n name: Identifier,\n topLevelObjects: ParsedObject[],\n args: Argument[],\n isFunction: boolean\n ) {\n super(name, topLevelObjects, args, isFunction);\n }\n\n get typeName(): string {\n return \"Stitch\";\n }\n\n public toString = (): string => {\n return `${\n this.parent !== null ? this.parent + \" > \" : \"\"\n }${super.toString()}`;\n };\n}\n","import { InkObject } from \"./Object\";\n\n// New version of tags is dynamic - it constructs the tags\n// at runtime based on BeginTag and EndTag control commands.\n// Plain text that's in the output stream is turned into tags\n// when you do story.currentTags.\n// The only place this is used is when flattening tags down\n// to string in advance, during dynamic string generation if\n// there's a tag embedded in it. See how ControlCommand.EndString\n// is implemented in Story.cs for more details + comment\nexport class Tag extends InkObject {\n public readonly text: string;\n\n constructor(tagText: string) {\n super();\n this.text = tagText.toString() || \"\";\n }\n\n public toString(): string {\n return \"# \" + this.text;\n }\n}\n","import { Path } from \"./Path\";\nimport { CallStack } from \"./CallStack\";\nimport { throwNullException } from \"./NullException\";\nimport { InkObject } from \"./Object\";\n\nexport class Choice extends InkObject {\n public text: string = \"\";\n public index: number = 0;\n public threadAtGeneration: CallStack.Thread | null = null;\n public sourcePath: string = \"\";\n public targetPath: Path | null = null;\n public isInvisibleDefault: boolean = false;\n public tags: string[] | null = null;\n public originalThreadIndex: number = 0;\n\n get pathStringOnChoice(): string {\n if (this.targetPath === null)\n return throwNullException(\"Choice.targetPath\");\n return this.targetPath.toString();\n }\n set pathStringOnChoice(value: string) {\n this.targetPath = new Path(value);\n }\n}\n","import { InkListItem } from \"./InkList\";\nimport { ListValue } from \"./Value\";\nimport { ListDefinition } from \"./ListDefinition\";\nimport { TryGetResult } from \"./TryGetResult\";\nimport { throwNullException } from \"./NullException\";\n\nexport class ListDefinitionsOrigin {\n protected _lists: Map<string, ListDefinition>;\n protected _allUnambiguousListValueCache: Map<string, ListValue>;\n\n constructor(lists: ListDefinition[]) {\n this._lists = new Map();\n this._allUnambiguousListValueCache = new Map();\n\n for (let list of lists) {\n this._lists.set(list.name, list);\n\n for (let [key, val] of list.items) {\n let item = InkListItem.fromSerializedKey(key);\n let listValue = new ListValue(item, val);\n\n if (!item.itemName) {\n throw new Error(\"item.itemName is null or undefined.\");\n }\n\n this._allUnambiguousListValueCache.set(item.itemName, listValue);\n this._allUnambiguousListValueCache.set(item.fullName, listValue);\n }\n }\n }\n get lists(): ListDefinition[] {\n let listOfLists: ListDefinition[] = [];\n\n for (let [, value] of this._lists) {\n listOfLists.push(value);\n }\n\n return listOfLists;\n }\n public TryListGetDefinition(\n name: string | null,\n /* out */ def: ListDefinition | null\n ): TryGetResult<ListDefinition | null> {\n if (name === null) {\n return { result: def, exists: false };\n }\n // initially, this function returns a boolean and the second parameter is an out.\n let definition = this._lists.get(name);\n if (!definition) return { result: def, exists: false };\n\n return { result: definition, exists: true };\n }\n public FindSingleItemListWithName(name: string | null) {\n if (name === null) {\n return throwNullException(\"name\");\n }\n let val = this._allUnambiguousListValueCache.get(name);\n\n if (typeof val !== \"undefined\") {\n return val;\n }\n\n return null;\n }\n}\n","import { Container } from \"./Container\";\nimport {\n Value,\n IntValue,\n FloatValue,\n StringValue,\n DivertTargetValue,\n VariablePointerValue,\n ListValue,\n BoolValue,\n} from \"./Value\";\nimport { Glue } from \"./Glue\";\nimport { ControlCommand } from \"./ControlCommand\";\nimport { PushPopType } from \"./PushPop\";\nimport { Divert } from \"./Divert\";\nimport { ChoicePoint } from \"./ChoicePoint\";\nimport { VariableReference } from \"./VariableReference\";\nimport { VariableAssignment } from \"./VariableAssignment\";\nimport { NativeFunctionCall } from \"./NativeFunctionCall\";\nimport { Void } from \"./Void\";\nimport { Tag } from \"./Tag\";\nimport { Path } from \"./Path\";\nimport { Choice } from \"./Choice\";\nimport { ListDefinition } from \"./ListDefinition\";\nimport { ListDefinitionsOrigin } from \"./ListDefinitionsOrigin\";\nimport { InkListItem, InkList } from \"./InkList\";\nimport { InkObject } from \"./Object\";\nimport { asOrNull } from \"./TypeAssertion\";\nimport { throwNullException } from \"./NullException\";\nimport { SimpleJson } from \"./SimpleJson\";\n\nexport class JsonSerialisation {\n public static JArrayToRuntimeObjList(\n jArray: any[],\n skipLast: boolean = false\n ) {\n let count = jArray.length;\n if (skipLast) count--;\n\n let list: InkObject[] = [];\n\n for (let i = 0; i < count; i++) {\n let jTok = jArray[i];\n let runtimeObj = this.JTokenToRuntimeObject(jTok);\n if (runtimeObj === null) {\n return throwNullException(\"runtimeObj\");\n }\n list.push(runtimeObj);\n }\n\n return list;\n }\n\n public static WriteDictionaryRuntimeObjs(\n writer: SimpleJson.Writer,\n dictionary: Map<string, InkObject>\n ) {\n writer.WriteObjectStart();\n for (let [key, value] of dictionary) {\n writer.WritePropertyStart(key);\n this.WriteRuntimeObject(writer, value);\n writer.WritePropertyEnd();\n }\n writer.WriteObjectEnd();\n }\n\n public static WriteListRuntimeObjs(\n writer: SimpleJson.Writer,\n list: InkObject[]\n ) {\n writer.WriteArrayStart();\n for (let value of list) {\n this.WriteRuntimeObject(writer, value);\n }\n writer.WriteArrayEnd();\n }\n\n public static WriteIntDictionary(\n writer: SimpleJson.Writer,\n dict: Map<string, number>\n ) {\n writer.WriteObjectStart();\n for (let [key, value] of dict) {\n writer.WriteIntProperty(key, value);\n }\n writer.WriteObjectEnd();\n }\n\n public static WriteRuntimeObject(\n writer: SimpleJson.Writer,\n obj: InkObject\n ): void {\n let container = asOrNull(obj, Container);\n if (container) {\n this.WriteRuntimeContainer(writer, container);\n return;\n }\n\n let divert = asOrNull(obj, Divert);\n if (divert) {\n let divTypeKey = \"->\";\n if (divert.isExternal) {\n divTypeKey = \"x()\";\n } else if (divert.pushesToStack) {\n if (divert.stackPushType == PushPopType.Function) {\n divTypeKey = \"f()\";\n } else if (divert.stackPushType == PushPopType.Tunnel) {\n divTypeKey = \"->t->\";\n }\n }\n\n let targetStr;\n if (divert.hasVariableTarget) {\n targetStr = divert.variableDivertName;\n } else {\n targetStr = divert.targetPathString;\n }\n\n writer.WriteObjectStart();\n writer.WriteProperty(divTypeKey, targetStr);\n\n if (divert.hasVariableTarget) {\n writer.WriteProperty(\"var\", true);\n }\n\n if (divert.isConditional) {\n writer.WriteProperty(\"c\", true);\n }\n\n if (divert.externalArgs > 0) {\n writer.WriteIntProperty(\"exArgs\", divert.externalArgs);\n }\n\n writer.WriteObjectEnd();\n return;\n }\n\n let choicePoint = asOrNull(obj, ChoicePoint);\n if (choicePoint) {\n writer.WriteObjectStart();\n writer.WriteProperty(\"*\", choicePoint.pathStringOnChoice);\n writer.WriteIntProperty(\"flg\", choicePoint.flags);\n writer.WriteObjectEnd();\n return;\n }\n\n let boolVal = asOrNull(obj, BoolValue);\n if (boolVal) {\n writer.WriteBool(boolVal.value);\n return;\n }\n\n let intVal = asOrNull(obj, IntValue);\n if (intVal) {\n writer.WriteInt(intVal.value);\n return;\n }\n\n let floatVal = asOrNull(obj, FloatValue);\n if (floatVal) {\n writer.WriteFloat(floatVal.value);\n return;\n }\n\n let strVal = asOrNull(obj, StringValue);\n if (strVal) {\n if (strVal.isNewline) {\n writer.Write(\"\\n\", false);\n } else {\n writer.WriteStringStart();\n writer.WriteStringInner(\"^\");\n writer.WriteStringInner(strVal.value);\n writer.WriteStringEnd();\n }\n return;\n }\n\n let listVal = asOrNull(obj, ListValue);\n if (listVal) {\n this.WriteInkList(writer, listVal);\n return;\n }\n\n let divTargetVal = asOrNull(obj, DivertTargetValue);\n if (divTargetVal) {\n writer.WriteObjectStart();\n if (divTargetVal.value === null) {\n return throwNullException(\"divTargetVal.value\");\n }\n writer.WriteProperty(\"^->\", divTargetVal.value.componentsString);\n writer.WriteObjectEnd();\n\n return;\n }\n\n let varPtrVal = asOrNull(obj, VariablePointerValue);\n if (varPtrVal) {\n writer.WriteObjectStart();\n writer.WriteProperty(\"^var\", varPtrVal.value);\n writer.WriteIntProperty(\"ci\", varPtrVal.contextIndex);\n writer.WriteObjectEnd();\n return;\n }\n\n let glue = asOrNull(obj, Glue);\n if (glue) {\n writer.Write(\"<>\");\n return;\n }\n\n let controlCmd = asOrNull(obj, ControlCommand);\n if (controlCmd) {\n writer.Write(\n JsonSerialisation._controlCommandNames[controlCmd.commandType]\n );\n return;\n }\n\n let nativeFunc = asOrNull(obj, NativeFunctionCall);\n if (nativeFunc) {\n let name = nativeFunc.name;\n\n if (name == \"^\") name = \"L^\";\n\n writer.Write(name);\n return;\n }\n\n let varRef = asOrNull(obj, VariableReference);\n if (varRef) {\n writer.WriteObjectStart();\n let readCountPath = varRef.pathStringForCount;\n if (readCountPath != null) {\n writer.WriteProperty(\"CNT?\", readCountPath);\n } else {\n writer.WriteProperty(\"VAR?\", varRef.name);\n }\n\n writer.WriteObjectEnd();\n return;\n }\n\n let varAss = asOrNull(obj, VariableAssignment);\n if (varAss) {\n writer.WriteObjectStart();\n\n let key = varAss.isGlobal ? \"VAR=\" : \"temp=\";\n writer.WriteProperty(key, varAss.variableName);\n\n // Reassignment?\n if (!varAss.isNewDeclaration) writer.WriteProperty(\"re\", true);\n\n writer.WriteObjectEnd();\n\n return;\n }\n\n let voidObj = asOrNull(obj, Void);\n if (voidObj) {\n writer.Write(\"void\");\n return;\n }\n\n let tag = asOrNull(obj, Tag);\n if (tag) {\n writer.WriteObjectStart();\n writer.WriteProperty(\"#\", tag.text);\n writer.WriteObjectEnd();\n return;\n }\n\n let choice = asOrNull(obj, Choice);\n if (choice) {\n this.WriteChoice(writer, choice);\n return;\n }\n\n throw new Error(\"Failed to convert runtime object to Json token: \" + obj);\n }\n\n public static JObjectToDictionaryRuntimeObjs(jObject: Record<string, any>) {\n let dict: Map<string, InkObject> = new Map();\n\n for (let key in jObject) {\n if (jObject.hasOwnProperty(key)) {\n let inkObject = this.JTokenToRuntimeObject(jObject[key]);\n if (inkObject === null) {\n return throwNullException(\"inkObject\");\n }\n dict.set(key, inkObject);\n }\n }\n\n return dict;\n }\n\n public static JObjectToIntDictionary(jObject: Record<string, any>) {\n let dict: Map<string, number> = new Map();\n for (let key in jObject) {\n if (jObject.hasOwnProperty(key)) {\n dict.set(key, parseInt(jObject[key]));\n }\n }\n return dict;\n }\n\n public static JTokenToRuntimeObject(token: any): InkObject | null {\n if (\n (typeof token === \"number\" && !isNaN(token)) ||\n typeof token === \"boolean\"\n ) {\n return Value.Create(token);\n }\n\n if (typeof token === \"string\") {\n let str = token.toString();\n\n // String value\n let firstChar = str[0];\n if (firstChar == \"^\") return new StringValue(str.substring(1));\n else if (firstChar == \"\\n\" && str.length == 1)\n return new StringValue(\"\\n\");\n\n // Glue\n if (str == \"<>\") return new Glue();\n\n // Control commands (would looking up in a hash set be faster?)\n for (let i = 0; i < JsonSerialisation._controlCommandNames.length; ++i) {\n let cmdName = JsonSerialisation._controlCommandNames[i];\n if (str == cmdName) {\n return new ControlCommand(i);\n }\n }\n\n // Native functions\n if (str == \"L^\") str = \"^\";\n if (NativeFunctionCall.CallExistsWithName(str))\n return NativeFunctionCall.CallWithName(str);\n\n // Pop\n if (str == \"->->\") return ControlCommand.PopTunnel();\n else if (str == \"~ret\") return ControlCommand.PopFunction();\n\n // Void\n if (str == \"void\") return new Void();\n }\n\n if (typeof token === \"object\" && !Array.isArray(token)) {\n let obj = token as Record<string, any>;\n let propValue;\n\n // Divert target value to path\n if (obj[\"^->\"]) {\n propValue = obj[\"^->\"];\n return new DivertTargetValue(new Path(propValue.toString()));\n }\n\n // VariablePointerValue\n if (obj[\"^var\"]) {\n propValue = obj[\"^var\"];\n let varPtr = new VariablePointerValue(propValue.toString());\n if (\"ci\" in obj) {\n propValue = obj[\"ci\"];\n varPtr.contextIndex = parseInt(propValue);\n }\n return varPtr;\n }\n\n // Divert\n let isDivert = false;\n let pushesToStack = false;\n let divPushType = PushPopType.Function;\n let external = false;\n if ((propValue = obj[\"->\"])) {\n isDivert = true;\n } else if ((propValue = obj[\"f()\"])) {\n isDivert = true;\n pushesToStack = true;\n divPushType = PushPopType.Function;\n } else if ((propValue = obj[\"->t->\"])) {\n isDivert = true;\n pushesToStack = true;\n divPushType = PushPopType.Tunnel;\n } else if ((propValue = obj[\"x()\"])) {\n isDivert = true;\n external = true;\n pushesToStack = false;\n divPushType = PushPopType.Function;\n }\n\n if (isDivert) {\n let divert = new Divert();\n divert.pushesToStack = pushesToStack;\n divert.stackPushType = divPushType;\n divert.isExternal = external;\n\n let target = propValue.toString();\n\n if ((propValue = obj[\"var\"])) divert.variableDivertName = target;\n else divert.targetPathString = target;\n\n divert.isConditional = !!obj[\"c\"];\n\n if (external) {\n if ((propValue = obj[\"exArgs\"]))\n divert.externalArgs = parseInt(propValue);\n }\n\n return divert;\n }\n\n // Choice\n if ((propValue = obj[\"*\"])) {\n let choice = new ChoicePoint();\n choice.pathStringOnChoice = propValue.toString();\n\n if ((propValue = obj[\"flg\"])) choice.flags = parseInt(propValue);\n\n return choice;\n }\n\n // Variable reference\n if ((propValue = obj[\"VAR?\"])) {\n return new VariableReference(propValue.toString());\n } else if ((propValue = obj[\"CNT?\"])) {\n let readCountVarRef = new VariableReference();\n readCountVarRef.pathStringForCount = propValue.toString();\n return readCountVarRef;\n }\n\n // Variable assignment\n let isVarAss = false;\n let isGlobalVar = false;\n if ((propValue = obj[\"VAR=\"])) {\n isVarAss = true;\n isGlobalVar = true;\n } else if ((propValue = obj[\"temp=\"])) {\n isVarAss = true;\n isGlobalVar = false;\n }\n if (isVarAss) {\n let varName = propValue.toString();\n let isNewDecl = !obj[\"re\"];\n let varAss = new VariableAssignment(varName, isNewDecl);\n varAss.isGlobal = isGlobalVar;\n return varAss;\n }\n if (obj[\"#\"] !== undefined) {\n propValue = obj[\"#\"];\n return new Tag(propValue.toString());\n }\n\n // List value\n if ((propValue = obj[\"list\"])) {\n // var listContent = (Dictionary<string, object>)propValue;\n let listContent = propValue as Record<string, any>;\n let rawList = new InkList();\n if ((propValue = obj[\"origins\"])) {\n // var namesAsObjs = (List<object>)propValue;\n let namesAsObjs = propValue as string[];\n // rawList.SetInitialOriginNames(namesAsObjs.Cast<string>().ToList());\n rawList.SetInitialOriginNames(namesAsObjs);\n }\n\n for (let key in listContent) {\n if (listContent.hasOwnProperty(key)) {\n let nameToVal = listContent[key];\n let item = new InkListItem(key);\n let val = parseInt(nameToVal);\n rawList.Add(item, val);\n }\n }\n\n return new ListValue(rawList);\n }\n\n if (obj[\"originalChoicePath\"] != null) return this.JObjectToChoice(obj);\n }\n\n // Array is always a Runtime.Container\n if (Array.isArray(token)) {\n return this.JArrayToContainer(token);\n }\n\n if (token === null || token === undefined) return null;\n\n throw new Error(\n \"Failed to convert token to runtime object: \" +\n this.toJson(token, [\"parent\"])\n );\n }\n\n public static toJson<T>(\n me: T,\n removes?: (keyof T)[],\n space?: number\n ): string {\n return JSON.stringify(\n me,\n (k, v) => (removes?.some((r) => r === k) ? undefined : v),\n space\n );\n }\n\n public static WriteRuntimeContainer(\n writer: SimpleJson.Writer,\n container: Container | null,\n withoutName: boolean = false\n ) {\n writer.WriteArrayStart();\n if (container === null) {\n return throwNullException(\"container\");\n }\n for (let c of container.content) this.WriteRuntimeObject(writer, c);\n\n let namedOnlyContent = container.namedOnlyContent;\n let countFlags = container.countFlags;\n let hasNameProperty = container.name != null && !withoutName;\n\n let hasTerminator =\n namedOnlyContent != null || countFlags > 0 || hasNameProperty;\n if (hasTerminator) {\n writer.WriteObjectStart();\n }\n\n if (namedOnlyContent != null) {\n for (let [key, value] of namedOnlyContent) {\n let name = key;\n let namedContainer = asOrNull(value, Container);\n writer.WritePropertyStart(name);\n this.WriteRuntimeContainer(writer, namedContainer, true);\n writer.WritePropertyEnd();\n }\n }\n\n if (countFlags > 0) writer.WriteIntProperty(\"#f\", countFlags);\n\n if (hasNameProperty) writer.WriteProperty(\"#n\", container.name);\n\n if (hasTerminator) writer.WriteObjectEnd();\n else writer.WriteNull();\n\n writer.WriteArrayEnd();\n }\n\n public static JArrayToContainer(jArray: any[]) {\n let container = new Container();\n container.content = this.JArrayToRuntimeObjList(jArray, true);\n\n let terminatingObj = jArray[jArray.length - 1] as Record<string, any>;\n if (terminatingObj != null) {\n let namedOnlyContent = new Map();\n\n for (let key in terminatingObj) {\n if (key == \"#f\") {\n container.countFlags = parseInt(terminatingObj[key]);\n } else if (key == \"#n\") {\n container.name = terminatingObj[key].toString();\n } else {\n let namedContentItem = this.JTokenToRuntimeObject(\n terminatingObj[key]\n );\n // var namedSubContainer = namedContentItem as Container;\n let namedSubContainer = asOrNull(namedContentItem, Container);\n if (namedSubContainer) namedSubContainer.name = key;\n namedOnlyContent.set(key, namedContentItem);\n }\n }\n\n container.namedOnlyContent = namedOnlyContent;\n }\n\n return container;\n }\n\n public static JObjectToChoice(jObj: Record<string, any>) {\n let choice = new Choice();\n choice.text = jObj[\"text\"].toString();\n choice.index = parseInt(jObj[\"index\"]);\n choice.sourcePath = jObj[\"originalChoicePath\"].toString();\n choice.originalThreadIndex = parseInt(jObj[\"originalThreadIndex\"]);\n choice.pathStringOnChoice = jObj[\"targetPath\"].toString();\n return choice;\n }\n\n public static WriteChoice(writer: SimpleJson.Writer, choice: Choice) {\n writer.WriteObjectStart();\n writer.WriteProperty(\"text\", choice.text);\n writer.WriteIntProperty(\"index\", choice.index);\n writer.WriteProperty(\"originalChoicePath\", choice.sourcePath);\n writer.WriteIntProperty(\"originalThreadIndex\", choice.originalThreadIndex);\n writer.WriteProperty(\"targetPath\", choice.pathStringOnChoice);\n writer.WriteObjectEnd();\n }\n\n public static WriteInkList(writer: SimpleJson.Writer, listVal: ListValue) {\n let rawList = listVal.value;\n if (rawList === null) {\n return throwNullException(\"rawList\");\n }\n\n writer.WriteObjectStart();\n writer.WritePropertyStart(\"list\");\n writer.WriteObjectStart();\n\n for (let [key, val] of rawList) {\n let item = InkListItem.fromSerializedKey(key);\n let itemVal = val;\n\n if (item.itemName === null) {\n return throwNullException(\"item.itemName\");\n }\n\n writer.WritePropertyNameStart();\n writer.WritePropertyNameInner(item.originName ? item.originName : \"?\");\n writer.WritePropertyNameInner(\".\");\n writer.WritePropertyNameInner(item.itemName);\n writer.WritePropertyNameEnd();\n\n writer.Write(itemVal);\n\n writer.WritePropertyEnd();\n }\n\n writer.WriteObjectEnd();\n\n writer.WritePropertyEnd();\n\n if (\n rawList.Count == 0 &&\n rawList.originNames != null &&\n rawList.originNames.length > 0\n ) {\n writer.WritePropertyStart(\"origins\");\n writer.WriteArrayStart();\n for (let name of rawList.originNames) writer.Write(name);\n writer.WriteArrayEnd();\n writer.WritePropertyEnd();\n }\n\n writer.WriteObjectEnd();\n }\n\n public static ListDefinitionsToJToken(origin: ListDefinitionsOrigin) {\n let result: Record<string, any> = {};\n\n for (let def of origin.lists) {\n let listDefJson: Record<string, any> = {};\n\n for (let [key, val] of def.items) {\n let item = InkListItem.fromSerializedKey(key);\n if (item.itemName === null) {\n return throwNullException(\"item.itemName\");\n }\n listDefJson[item.itemName] = val;\n }\n\n result[def.name] = listDefJson;\n }\n\n return result;\n }\n\n public static JTokenToListDefinitions(obj: Record<string, any>) {\n // var defsObj = (Dictionary<string, object>)obj;\n let defsObj = obj;\n\n let allDefs: ListDefinition[] = [];\n\n for (let key in defsObj) {\n if (defsObj.hasOwnProperty(key)) {\n let name = key.toString();\n // var listDefJson = (Dictionary<string, object>)kv.Value;\n let listDefJson = defsObj[key] as Record<string, any>;\n\n // Cast (string, object) to (string, int) for items\n let items: Map<string, number> = new Map();\n\n for (let nameValueKey in listDefJson) {\n if (defsObj.hasOwnProperty(key)) {\n let nameValue = listDefJson[nameValueKey];\n items.set(nameValueKey, parseInt(nameValue));\n }\n }\n\n let def = new ListDefinition(name, items);\n allDefs.push(def);\n }\n }\n\n return new ListDefinitionsOrigin(allDefs);\n }\n\n private static _controlCommandNames = (() => {\n let _controlCommandNames: string[] = [];\n\n _controlCommandNames[ControlCommand.CommandType.EvalStart] = \"ev\";\n _controlCommandNames[ControlCommand.CommandType.EvalOutput] = \"out\";\n _controlCommandNames[ControlCommand.CommandType.EvalEnd] = \"/ev\";\n _controlCommandNames[ControlCommand.CommandType.Duplicate] = \"du\";\n _controlCommandNames[ControlCommand.CommandType.PopEvaluatedValue] = \"pop\";\n _controlCommandNames[ControlCommand.CommandType.PopFunction] = \"~ret\";\n _controlCommandNames[ControlCommand.CommandType.PopTunnel] = \"->->\";\n _controlCommandNames[ControlCommand.CommandType.BeginString] = \"str\";\n _controlCommandNames[ControlCommand.CommandType.EndString] = \"/str\";\n _controlCommandNames[ControlCommand.CommandType.NoOp] = \"nop\";\n _controlCommandNames[ControlCommand.CommandType.ChoiceCount] = \"choiceCnt\";\n _controlCommandNames[ControlCommand.CommandType.Turns] = \"turn\";\n _controlCommandNames[ControlCommand.CommandType.TurnsSince] = \"turns\";\n _controlCommandNames[ControlCommand.CommandType.ReadCount] = \"readc\";\n _controlCommandNames[ControlCommand.CommandType.Random] = \"rnd\";\n _controlCommandNames[ControlCommand.CommandType.SeedRandom] = \"srnd\";\n _controlCommandNames[ControlCommand.CommandType.VisitIndex] = \"visit\";\n _controlCommandNames[ControlCommand.CommandType.SequenceShuffleIndex] =\n \"seq\";\n _controlCommandNames[ControlCommand.CommandType.StartThread] = \"thread\";\n _controlCommandNames[ControlCommand.CommandType.Done] = \"done\";\n _controlCommandNames[ControlCommand.CommandType.End] = \"end\";\n _controlCommandNames[ControlCommand.CommandType.ListFromInt] = \"listInt\";\n _controlCommandNames[ControlCommand.CommandType.ListRange] = \"range\";\n _controlCommandNames[ControlCommand.CommandType.ListRandom] = \"lrnd\";\n _controlCommandNames[ControlCommand.CommandType.BeginTag] = \"#\";\n _controlCommandNames[ControlCommand.CommandType.EndTag] = \"/#\";\n\n for (let i = 0; i < ControlCommand.CommandType.TOTAL_VALUES; ++i) {\n if (_controlCommandNames[i] == null)\n throw new Error(\"Control command not accounted for in serialisation\");\n }\n\n return _controlCommandNames;\n })();\n}\n","import { PushPopType } from \"./PushPop\";\nimport { Path } from \"./Path\";\nimport { Story } from \"./Story\";\nimport { JsonSerialisation } from \"./JsonSerialisation\";\nimport { ListValue } from \"./Value\";\nimport { StringBuilder } from \"./StringBuilder\";\nimport { Pointer } from \"./Pointer\";\nimport { InkObject } from \"./Object\";\nimport { Debug } from \"./Debug\";\nimport { tryGetValueFromMap } from \"./TryGetResult\";\nimport { throwNullException } from \"./NullException\";\nimport { SimpleJson } from \"./SimpleJson\";\n\nexport class CallStack {\n get elements() {\n return this.callStack;\n }\n\n get depth() {\n return this.elements.length;\n }\n\n get currentElement() {\n let thread = this._threads[this._threads.length - 1];\n let cs = thread.callstack;\n return cs[cs.length - 1];\n }\n\n get currentElementIndex() {\n return this.callStack.length - 1;\n }\n\n get currentThread(): CallStack.Thread {\n return this._threads[this._threads.length - 1];\n }\n set currentThread(value: CallStack.Thread) {\n Debug.Assert(\n this._threads.length == 1,\n \"Shouldn't be directly setting the current thread when we have a stack of them\"\n );\n\n this._threads.length = 0;\n this._threads.push(value);\n }\n\n get canPop() {\n return this.callStack.length > 1;\n }\n\n constructor(storyContext: Story);\n constructor(toCopy: CallStack);\n constructor() {\n if (arguments[0] instanceof Story) {\n let storyContext = arguments[0] as Story;\n\n this._startOfRoot = Pointer.StartOf(storyContext.rootContentContainer);\n this.Reset();\n } else {\n let toCopy = arguments[0] as CallStack;\n\n this._threads = [];\n for (let otherThread of toCopy._threads) {\n this._threads.push(otherThread.Copy());\n }\n this._threadCounter = toCopy._threadCounter;\n this._startOfRoot = toCopy._startOfRoot.copy();\n }\n }\n\n public Reset() {\n this._threads = [];\n this._threads.push(new CallStack.Thread());\n\n this._threads[0].callstack.push(\n new CallStack.Element(PushPopType.Tunnel, this._startOfRoot)\n );\n }\n\n public SetJsonToken(jObject: Record<string, any>, storyContext: Story) {\n this._threads.length = 0;\n\n // TODO: (List<object>) jObject [\"threads\"];\n let jThreads: any[] = jObject[\"threads\"];\n\n for (let jThreadTok of jThreads) {\n // TODO: var jThreadObj = (Dictionary<string, object>)jThreadTok;\n let jThreadObj = jThreadTok;\n let thread = new CallStack.Thread(jThreadObj, storyContext);\n this._threads.push(thread);\n }\n\n // TODO: (int)jObject [\"threadCounter\"];\n this._threadCounter = parseInt(jObject[\"threadCounter\"]);\n this._startOfRoot = Pointer.StartOf(storyContext.rootContentContainer);\n }\n public WriteJson(w: SimpleJson.Writer) {\n w.WriteObject((writer) => {\n writer.WritePropertyStart(\"threads\");\n writer.WriteArrayStart();\n\n for (let thread of this._threads) {\n thread.WriteJson(writer);\n }\n\n writer.WriteArrayEnd();\n writer.WritePropertyEnd();\n\n writer.WritePropertyStart(\"threadCounter\");\n writer.WriteInt(this._threadCounter);\n writer.WritePropertyEnd();\n });\n }\n\n public PushThread() {\n let newThread = this.currentThread.Copy();\n this._threadCounter++;\n newThread.threadIndex = this._threadCounter;\n this._threads.push(newThread);\n }\n\n public ForkThread() {\n let forkedThread = this.currentThread.Copy();\n this._threadCounter++;\n forkedThread.threadIndex = this._threadCounter;\n return forkedThread;\n }\n\n public PopThread() {\n if (this.canPopThread) {\n this._threads.splice(this._threads.indexOf(this.currentThread), 1); // should be equivalent to a pop()\n } else {\n throw new Error(\"Can't pop thread\");\n }\n }\n\n get canPopThread() {\n return this._threads.length > 1 && !this.elementIsEvaluateFromGame;\n }\n\n get elementIsEvaluateFromGame() {\n return this.currentElement.type == PushPopType.FunctionEvaluationFromGame;\n }\n\n public Push(\n type: PushPopType,\n externalEvaluationStackHeight: number = 0,\n outputStreamLengthWithPushed: number = 0\n ) {\n let element = new CallStack.Element(\n type,\n this.currentElement.currentPointer,\n false\n );\n\n element.evaluationStackHeightWhenPushed = externalEvaluationStackHeight;\n element.functionStartInOutputStream = outputStreamLengthWithPushed;\n\n this.callStack.push(element);\n }\n\n public CanPop(type: PushPopType | null = null) {\n if (!this.canPop) return false;\n\n if (type == null) return true;\n\n return this.currentElement.type == type;\n }\n\n public Pop(type: PushPopType | null = null) {\n if (this.CanPop(type)) {\n this.callStack.pop();\n return;\n } else {\n throw new Error(\"Mismatched push/pop in Callstack\");\n }\n }\n\n public GetTemporaryVariableWithName(\n name: string | null,\n contextIndex: number = -1\n ) {\n if (contextIndex == -1) contextIndex = this.currentElementIndex + 1;\n\n let contextElement = this.callStack[contextIndex - 1];\n\n let varValue = tryGetValueFromMap(\n contextElement.temporaryVariables,\n name,\n null\n );\n if (varValue.exists) {\n return varValue.result;\n } else {\n return null;\n }\n }\n\n public SetTemporaryVariable(\n name: string,\n value: any,\n declareNew: boolean,\n contextIndex: number = -1\n ) {\n if (contextIndex == -1) contextIndex = this.currentElementIndex + 1;\n\n let contextElement = this.callStack[contextIndex - 1];\n\n if (!declareNew && !contextElement.temporaryVariables.get(name)) {\n throw new Error(\"Could not find temporary variable to set: \" + name);\n }\n\n let oldValue = tryGetValueFromMap(\n contextElement.temporaryVariables,\n name,\n null\n );\n if (oldValue.exists)\n ListValue.RetainListOriginsForAssignment(oldValue.result, value);\n\n contextElement.temporaryVariables.set(name, value);\n }\n\n public ContextForVariableNamed(name: string) {\n if (this.currentElement.temporaryVariables.get(name)) {\n return this.currentElementIndex + 1;\n } else {\n return 0;\n }\n }\n\n public ThreadWithIndex(index: number) {\n let filtered = this._threads.filter((t) => {\n if (t.threadIndex == index) return t;\n });\n\n return filtered.length > 0 ? filtered[0] : null;\n }\n\n get callStack() {\n return this.currentThread.callstack;\n }\n\n get callStackTrace() {\n let sb = new StringBuilder();\n\n for (let t = 0; t < this._threads.length; t++) {\n let thread = this._threads[t];\n let isCurrent = t == this._threads.length - 1;\n sb.AppendFormat(\n \"=== THREAD {0}/{1} {2}===\\n\",\n t + 1,\n this._threads.length,\n isCurrent ? \"(current) \" : \"\"\n );\n\n for (let i = 0; i < thread.callstack.length; i++) {\n if (thread.callstack[i].type == PushPopType.Function)\n sb.Append(\" [FUNCTION] \");\n else sb.Append(\" [TUNNEL] \");\n\n let pointer = thread.callstack[i].currentPointer;\n if (!pointer.isNull) {\n sb.Append(\"<SOMEWHERE IN \");\n if (pointer.container === null) {\n return throwNullException(\"pointer.container\");\n }\n sb.Append(pointer.container.path.toString());\n sb.AppendLine(\">\");\n }\n }\n }\n\n return sb.toString();\n }\n\n public _threads!: CallStack.Thread[]; // Banged because it's initialized in Reset().\n public _threadCounter: number = 0;\n public _startOfRoot: Pointer = Pointer.Null;\n}\n\nexport namespace CallStack {\n export class Element {\n public currentPointer: Pointer;\n public inExpressionEvaluation: boolean;\n public temporaryVariables: Map<string, InkObject>;\n public type: PushPopType;\n\n public evaluationStackHeightWhenPushed: number = 0;\n public functionStartInOutputStream: number = 0;\n\n constructor(\n type: PushPopType,\n pointer: Pointer,\n inExpressionEvaluation: boolean = false\n ) {\n this.currentPointer = pointer.copy();\n this.inExpressionEvaluation = inExpressionEvaluation;\n this.temporaryVariables = new Map();\n this.type = type;\n }\n\n public Copy() {\n let copy = new Element(\n this.type,\n this.currentPointer,\n this.inExpressionEvaluation\n );\n copy.temporaryVariables = new Map(this.temporaryVariables);\n copy.evaluationStackHeightWhenPushed =\n this.evaluationStackHeightWhenPushed;\n copy.functionStartInOutputStream = this.functionStartInOutputStream;\n return copy;\n }\n }\n\n export class Thread {\n public callstack: Element[];\n public threadIndex: number = 0;\n public previousPointer: Pointer = Pointer.Null;\n\n constructor();\n constructor(jThreadObj: any, storyContext: Story);\n constructor() {\n this.callstack = [];\n\n if (arguments[0] && arguments[1]) {\n let jThreadObj = arguments[0];\n let storyContext = arguments[1];\n\n // TODO: (int) jThreadObj['threadIndex'] can raise;\n this.threadIndex = parseInt(jThreadObj[\"threadIndex\"]);\n\n let jThreadCallstack = jThreadObj[\"callstack\"];\n\n for (let jElTok of jThreadCallstack) {\n let jElementObj = jElTok;\n\n // TODO: (int) jElementObj['type'] can raise;\n let pushPopType: PushPopType = parseInt(jElementObj[\"type\"]);\n\n let pointer = Pointer.Null;\n\n let currentContainerPathStr: string;\n // TODO: jElementObj.TryGetValue (\"cPath\", out currentContainerPathStrToken);\n let currentContainerPathStrToken = jElementObj[\"cPath\"];\n if (typeof currentContainerPathStrToken !== \"undefined\") {\n currentContainerPathStr = currentContainerPathStrToken.toString();\n\n let threadPointerResult = storyContext.ContentAtPath(\n new Path(currentContainerPathStr)\n );\n pointer.container = threadPointerResult.container;\n pointer.index = parseInt(jElementObj[\"idx\"]);\n\n if (threadPointerResult.obj == null)\n throw new Error(\n \"When loading state, internal story location couldn't be found: \" +\n currentContainerPathStr +\n \". Has the story changed since this save data was created?\"\n );\n else if (threadPointerResult.approximate) {\n if (pointer.container === null) {\n return throwNullException(\"pointer.container\");\n }\n storyContext.Warning(\n \"When loading state, exact internal story location couldn't be found: '\" +\n currentContainerPathStr +\n \"', so it was approximated to '\" +\n pointer.container.path.toString() +\n \"' to recover. Has the story changed since this save data was created?\"\n );\n }\n }\n\n let inExpressionEvaluation = !!jElementObj[\"exp\"];\n\n let el = new Element(pushPopType, pointer, inExpressionEvaluation);\n\n let temps = jElementObj[\"temp\"];\n if (typeof temps !== \"undefined\") {\n el.temporaryVariables =\n JsonSerialisation.JObjectToDictionaryRuntimeObjs(temps);\n } else {\n el.temporaryVariables.clear();\n }\n\n this.callstack.push(el);\n }\n\n let prevContentObjPath = jThreadObj[\"previousContentObject\"];\n if (typeof prevContentObjPath !== \"undefined\") {\n let prevPath = new Path(prevContentObjPath.toString());\n this.previousPointer = storyContext.PointerAtPath(prevPath);\n }\n }\n }\n\n public Copy() {\n let copy = new Thread();\n copy.threadIndex = this.threadIndex;\n for (let e of this.callstack) {\n copy.callstack.push(e.Copy());\n }\n copy.previousPointer = this.previousPointer.copy();\n return copy;\n }\n\n public WriteJson(writer: SimpleJson.Writer) {\n writer.WriteObjectStart();\n\n writer.WritePropertyStart(\"callstack\");\n writer.WriteArrayStart();\n for (let el of this.callstack) {\n writer.WriteObjectStart();\n if (!el.currentPointer.isNull) {\n if (el.currentPointer.container === null) {\n return throwNullException(\"el.currentPointer.container\");\n }\n writer.WriteProperty(\n \"cPath\",\n el.currentPointer.container.path.componentsString\n );\n writer.WriteIntProperty(\"idx\", el.currentPointer.index);\n }\n\n writer.WriteProperty(\"exp\", el.inExpressionEvaluation);\n writer.WriteIntProperty(\"type\", el.type);\n\n if (el.temporaryVariables.size > 0) {\n writer.WritePropertyStart(\"temp\");\n JsonSerialisation.WriteDictionaryRuntimeObjs(\n writer,\n el.temporaryVariables\n );\n writer.WritePropertyEnd();\n }\n\n writer.WriteObjectEnd();\n }\n writer.WriteArrayEnd();\n writer.WritePropertyEnd();\n\n writer.WriteIntProperty(\"threadIndex\", this.threadIndex);\n\n if (!this.previousPointer.isNull) {\n let resolvedPointer = this.previousPointer.Resolve();\n if (resolvedPointer === null) {\n return throwNullException(\"this.previousPointer.Resolve()\");\n }\n writer.WriteProperty(\n \"previousContentObject\",\n resolvedPointer.path.toString()\n );\n }\n\n writer.WriteObjectEnd();\n }\n }\n}\n","import {\n AbstractValue,\n Value,\n VariablePointerValue,\n ListValue,\n IntValue,\n FloatValue,\n BoolValue,\n} from \"./Value\";\nimport { VariableAssignment } from \"./VariableAssignment\";\nimport { InkObject } from \"./Object\";\nimport { ListDefinitionsOrigin } from \"./ListDefinitionsOrigin\";\nimport { StoryException } from \"./StoryException\";\nimport { JsonSerialisation } from \"./JsonSerialisation\";\nimport { asOrThrows, asOrNull, isEquatable } from \"./TypeAssertion\";\nimport { tryGetValueFromMap } from \"./TryGetResult\";\nimport { throwNullException } from \"./NullException\";\nimport { CallStack } from \"./CallStack\";\nimport { StatePatch } from \"./StatePatch\";\nimport { SimpleJson } from \"./SimpleJson\";\nimport { InkList } from \"./Story\";\nimport { Path } from \"./Path\";\n\n// Fake class wrapper around VariableState to have correct typing\n// when using the Proxy syntax in typescript\nfunction VariablesStateAccessor<T>(): new () => Pick<T, keyof T> {\n return class {} as any;\n}\n\ntype VariableStateValue = boolean | string | number | InkList | Path | null;\n\nexport class VariablesState extends VariablesStateAccessor<\n Record<string, any>\n>() {\n // The way variableChangedEvent is a bit different than the reference implementation.\n // Originally it uses the C# += operator to add delegates, but in js we need to maintain\n // an actual collection of delegates (ie. callbacks) to register a new one, there is a\n // special ObserveVariableChange method below.\n public variableChangedEventCallbacks: Array<\n (variableName: string, newValue: InkObject) => void\n > = [];\n public variableChangedEvent(variableName: string, newValue: InkObject): void {\n for (let callback of this.variableChangedEventCallbacks) {\n callback(variableName, newValue);\n }\n }\n\n public patch: StatePatch | null = null;\n\n get batchObservingVariableChanges() {\n return this._batchObservingVariableChanges;\n }\n set batchObservingVariableChanges(value: boolean) {\n this._batchObservingVariableChanges = value;\n if (value) {\n this._changedVariablesForBatchObs = new Set();\n } else {\n if (this._changedVariablesForBatchObs != null) {\n for (let variableName of this._changedVariablesForBatchObs) {\n let currentValue = this._globalVariables.get(variableName);\n if (!currentValue) {\n throwNullException(\"currentValue\");\n } else {\n this.variableChangedEvent(variableName, currentValue);\n }\n }\n\n this._changedVariablesForBatchObs = null;\n }\n }\n }\n\n get callStack() {\n return this._callStack;\n }\n set callStack(callStack) {\n this._callStack = callStack;\n }\n\n private _batchObservingVariableChanges: boolean = false;\n\n // the original code uses a magic getter and setter for global variables,\n // allowing things like variableState['varname]. This is not quite possible\n // in js without a Proxy, so it is replaced with this $ function.\n public $(variableName: string): VariableStateValue;\n public $(variableName: string, value: VariableStateValue): void;\n public $(variableName: string, value?: any) {\n if (typeof value === \"undefined\") {\n let varContents = null;\n\n if (this.patch !== null) {\n varContents = this.patch.TryGetGlobal(variableName, null);\n if (varContents.exists)\n return (varContents.result as AbstractValue).valueObject;\n }\n\n varContents = this._globalVariables.get(variableName);\n\n if (typeof varContents === \"undefined\") {\n varContents = this._defaultGlobalVariables.get(variableName);\n }\n\n if (typeof varContents !== \"undefined\")\n return (varContents as AbstractValue).valueObject;\n else return null;\n } else {\n if (typeof this._defaultGlobalVariables.get(variableName) === \"undefined\")\n throw new StoryException(\n \"Cannot assign to a variable (\" +\n variableName +\n \") that hasn't been declared in the story\"\n );\n\n let val = Value.Create(value);\n if (val == null) {\n if (value == null) {\n throw new Error(\"Cannot pass null to VariableState\");\n } else {\n throw new Error(\n \"Invalid value passed to VariableState: \" + value.toString()\n );\n }\n }\n\n this.SetGlobal(variableName, val);\n }\n }\n\n constructor(\n callStack: CallStack,\n listDefsOrigin: ListDefinitionsOrigin | null\n ) {\n super();\n this._globalVariables = new Map();\n this._callStack = callStack;\n this._listDefsOrigin = listDefsOrigin;\n\n // if es6 proxies are available, use them.\n try {\n // the proxy is used to allow direct manipulation of global variables.\n // It first tries to access the objects own property, and if none is\n // found it delegates the call to the $ method, defined below\n let p = new Proxy(this, {\n get(target: any, name) {\n return name in target ? target[name] : target.$(name);\n },\n set(target: any, name, value) {\n if (name in target) target[name] = value;\n else target.$(name, value);\n return true; // returning a falsy value make the trap fail\n },\n });\n\n return p;\n } catch (e) {\n // the proxy object is not available in this context. we should warn the\n // dev but writing to the console feels a bit intrusive.\n // console.log(\"ES6 Proxy not available - direct manipulation of global variables can't work, use $() instead.\");\n }\n }\n\n public ApplyPatch() {\n if (this.patch === null) {\n return throwNullException(\"this.patch\");\n }\n\n for (let [namedVarKey, namedVarValue] of this.patch.globals) {\n this._globalVariables.set(namedVarKey, namedVarValue);\n }\n\n if (this._changedVariablesForBatchObs !== null) {\n for (let name of this.patch.changedVariables) {\n this._changedVariablesForBatchObs.add(name);\n }\n }\n\n this.patch = null;\n }\n\n public SetJsonToken(jToken: Record<string, any>) {\n this._globalVariables.clear();\n\n for (let [varValKey, varValValue] of this._defaultGlobalVariables) {\n let loadedToken = jToken[varValKey];\n if (typeof loadedToken !== \"undefined\") {\n let tokenInkObject =\n JsonSerialisation.JTokenToRuntimeObject(loadedToken);\n if (tokenInkObject === null) {\n return throwNullException(\"tokenInkObject\");\n }\n this._globalVariables.set(varValKey, tokenInkObject);\n } else {\n this._globalVariables.set(varValKey, varValValue);\n }\n }\n }\n\n public static dontSaveDefaultValues: boolean = true;\n\n public WriteJson(writer: SimpleJson.Writer) {\n writer.WriteObjectStart();\n for (let [keyValKey, keyValValue] of this._globalVariables) {\n let name = keyValKey;\n let val = keyValValue;\n\n if (VariablesState.dontSaveDefaultValues) {\n if (this._defaultGlobalVariables.has(name)) {\n let defaultVal = this._defaultGlobalVariables.get(name)!;\n if (this.RuntimeObjectsEqual(val, defaultVal)) continue;\n }\n }\n\n writer.WritePropertyStart(name);\n JsonSerialisation.WriteRuntimeObject(writer, val);\n writer.WritePropertyEnd();\n }\n writer.WriteObjectEnd();\n }\n\n public RuntimeObjectsEqual(\n obj1: InkObject | null,\n obj2: InkObject | null\n ): boolean {\n if (obj1 === null) {\n return throwNullException(\"obj1\");\n }\n if (obj2 === null) {\n return throwNullException(\"obj2\");\n }\n\n if (obj1.constructor !== obj2.constructor) return false;\n\n let boolVal = asOrNull(obj1, BoolValue);\n if (boolVal !== null) {\n return boolVal.value === asOrThrows(obj2, BoolValue).value;\n }\n\n let intVal = asOrNull(obj1, IntValue);\n if (intVal !== null) {\n return intVal.value === asOrThrows(obj2, IntValue).value;\n }\n\n let floatVal = asOrNull(obj1, FloatValue);\n if (floatVal !== null) {\n return floatVal.value === asOrThrows(obj2, FloatValue).value;\n }\n\n let val1 = asOrNull(obj1, Value);\n let val2 = asOrNull(obj2, Value);\n if (val1 !== null && val2 !== null) {\n if (isEquatable(val1.valueObject) && isEquatable(val2.valueObject)) {\n return val1.valueObject.Equals(val2.valueObject);\n } else {\n return val1.valueObject === val2.valueObject;\n }\n }\n\n throw new Error(\n \"FastRoughDefinitelyEquals: Unsupported runtime object type: \" +\n obj1.constructor.name\n );\n }\n\n public GetVariableWithName(\n name: string | null,\n contextIndex: number = -1\n ): InkObject | null {\n let varValue = this.GetRawVariableWithName(name, contextIndex);\n\n // var varPointer = varValue as VariablePointerValue;\n let varPointer = asOrNull(varValue, VariablePointerValue);\n if (varPointer !== null) {\n varValue = this.ValueAtVariablePointer(varPointer);\n }\n\n return varValue;\n }\n\n public TryGetDefaultVariableValue(name: string | null): InkObject | null {\n let val = tryGetValueFromMap(this._defaultGlobalVariables, name, null);\n return val.exists ? val.result : null;\n }\n\n public GlobalVariableExistsWithName(name: string) {\n return (\n this._globalVariables.has(name) ||\n (this._defaultGlobalVariables !== null &&\n this._defaultGlobalVariables.has(name))\n );\n }\n\n public GetRawVariableWithName(name: string | null, contextIndex: number) {\n let varValue: InkObject | null = null;\n\n if (contextIndex == 0 || contextIndex == -1) {\n let variableValue = null;\n if (this.patch !== null) {\n variableValue = this.patch.TryGetGlobal(name, null);\n if (variableValue.exists) return variableValue.result!;\n }\n\n // this is a conditional assignment\n variableValue = tryGetValueFromMap(this._globalVariables, name, null);\n if (variableValue.exists) return variableValue.result;\n\n if (this._defaultGlobalVariables !== null) {\n variableValue = tryGetValueFromMap(\n this._defaultGlobalVariables,\n name,\n null\n );\n if (variableValue.exists) return variableValue.result;\n }\n\n if (this._listDefsOrigin === null)\n return throwNullException(\"VariablesState._listDefsOrigin\");\n let listItemValue = this._listDefsOrigin.FindSingleItemListWithName(name);\n if (listItemValue) return listItemValue;\n }\n\n varValue = this._callStack.GetTemporaryVariableWithName(name, contextIndex);\n\n return varValue;\n }\n\n public ValueAtVariablePointer(pointer: VariablePointerValue) {\n return this.GetVariableWithName(pointer.variableName, pointer.contextIndex);\n }\n\n public Assign(varAss: VariableAssignment, value: InkObject) {\n let name = varAss.variableName;\n if (name === null) {\n return throwNullException(\"name\");\n }\n let contextIndex = -1;\n\n let setGlobal = false;\n if (varAss.isNewDeclaration) {\n setGlobal = varAss.isGlobal;\n } else {\n setGlobal = this.GlobalVariableExistsWithName(name);\n }\n\n if (varAss.isNewDeclaration) {\n // var varPointer = value as VariablePointerValue;\n let varPointer = asOrNull(value, VariablePointerValue);\n if (varPointer !== null) {\n let fullyResolvedVariablePointer =\n this.ResolveVariablePointer(varPointer);\n value = fullyResolvedVariablePointer;\n }\n } else {\n let existingPointer = null;\n do {\n // existingPointer = GetRawVariableWithName (name, contextIndex) as VariablePointerValue;\n existingPointer = asOrNull(\n this.GetRawVariableWithName(name, contextIndex),\n VariablePointerValue\n );\n if (existingPointer != null) {\n name = existingPointer.variableName;\n contextIndex = existingPointer.contextIndex;\n setGlobal = contextIndex == 0;\n }\n } while (existingPointer != null);\n }\n\n if (setGlobal) {\n this.SetGlobal(name, value);\n } else {\n this._callStack.SetTemporaryVariable(\n name,\n value,\n varAss.isNewDeclaration,\n contextIndex\n );\n }\n }\n\n public SnapshotDefaultGlobals() {\n this._defaultGlobalVariables = new Map(this._globalVariables);\n }\n\n public RetainListOriginsForAssignment(\n oldValue: InkObject,\n newValue: InkObject\n ) {\n let oldList = asOrThrows(oldValue, ListValue);\n let newList = asOrThrows(newValue, ListValue);\n\n if (oldList.value && newList.value && newList.value.Count == 0) {\n newList.value.SetInitialOriginNames(oldList.value.originNames);\n }\n }\n\n public SetGlobal(variableName: string | null, value: InkObject) {\n let oldValue = null;\n\n if (this.patch === null) {\n oldValue = tryGetValueFromMap(this._globalVariables, variableName, null);\n }\n\n if (this.patch !== null) {\n oldValue = this.patch.TryGetGlobal(variableName, null);\n if (!oldValue.exists) {\n oldValue = tryGetValueFromMap(\n this._globalVariables,\n variableName,\n null\n );\n }\n }\n\n ListValue.RetainListOriginsForAssignment(oldValue!.result!, value);\n\n if (variableName === null) {\n return throwNullException(\"variableName\");\n }\n\n if (this.patch !== null) {\n this.patch.SetGlobal(variableName, value);\n } else {\n this._globalVariables.set(variableName, value);\n }\n\n // TODO: Not sure !== is equivalent to !value.Equals(oldValue)\n if (\n this.variableChangedEvent !== null &&\n oldValue !== null &&\n value !== oldValue.result\n ) {\n if (this.batchObservingVariableChanges) {\n if (this._changedVariablesForBatchObs === null) {\n return throwNullException(\"this._changedVariablesForBatchObs\");\n }\n\n if (this.patch !== null) {\n this.patch.AddChangedVariable(variableName);\n } else if (this._changedVariablesForBatchObs !== null) {\n this._changedVariablesForBatchObs.add(variableName);\n }\n } else {\n this.variableChangedEvent(variableName, value);\n }\n }\n }\n\n public ResolveVariablePointer(varPointer: VariablePointerValue) {\n let contextIndex = varPointer.contextIndex;\n\n if (contextIndex == -1)\n contextIndex = this.GetContextIndexOfVariableNamed(\n varPointer.variableName\n );\n\n let valueOfVariablePointedTo = this.GetRawVariableWithName(\n varPointer.variableName,\n contextIndex\n );\n\n // var doubleRedirectionPointer = valueOfVariablePointedTo as VariablePointerValue;\n let doubleRedirectionPointer = asOrNull(\n valueOfVariablePointedTo,\n VariablePointerValue\n );\n if (doubleRedirectionPointer != null) {\n return doubleRedirectionPointer;\n } else {\n return new VariablePointerValue(varPointer.variableName, contextIndex);\n }\n }\n\n public GetContextIndexOfVariableNamed(varName: string) {\n if (this.GlobalVariableExistsWithName(varName)) return 0;\n\n return this._callStack.currentElementIndex;\n }\n\n /**\n * This function is specific to the js version of ink. It allows to register a\n * callback that will be called when a variable changes. The original code uses\n * `state.variableChangedEvent += callback` instead.\n *\n * @param {function} callback\n */\n public ObserveVariableChange(\n callback: (variableName: string, newValue: InkObject) => void\n ) {\n this.variableChangedEventCallbacks.push(callback);\n }\n\n private _globalVariables: Map<string, InkObject>;\n private _defaultGlobalVariables: Map<string, InkObject> = new Map();\n\n private _callStack: CallStack;\n private _changedVariablesForBatchObs: Set<string> | null = new Set();\n private _listDefsOrigin: ListDefinitionsOrigin | null;\n}\n","// Taken from https://gist.github.com/blixt/f17b47c62508be59987b\n// Ink uses a seedable PRNG of which there is none in native javascript.\nexport class PRNG {\n private seed: number;\n\n constructor(seed: number) {\n this.seed = seed % 2147483647;\n if (this.seed <= 0) this.seed += 2147483646;\n }\n public next(): number {\n return (this.seed = (this.seed * 48271) % 2147483647);\n }\n public nextFloat(): number {\n return (this.next() - 1) / 2147483646;\n }\n}\n","import { InkObject } from \"./Object\";\nimport { Container } from \"./Container\";\n\nexport class StatePatch {\n get globals() {\n return this._globals;\n }\n get changedVariables() {\n return this._changedVariables;\n }\n get visitCounts() {\n return this._visitCounts;\n }\n get turnIndices() {\n return this._turnIndices;\n }\n\n constructor();\n constructor(toCopy: StatePatch | null);\n constructor() {\n if (arguments.length === 1 && arguments[0] !== null) {\n let toCopy = arguments[0] as StatePatch;\n this._globals = new Map(toCopy._globals);\n this._changedVariables = new Set(toCopy._changedVariables);\n this._visitCounts = new Map(toCopy._visitCounts);\n this._turnIndices = new Map(toCopy._turnIndices);\n } else {\n this._globals = new Map();\n this._changedVariables = new Set();\n this._visitCounts = new Map();\n this._turnIndices = new Map();\n }\n }\n\n public TryGetGlobal(name: string | null, /* out */ value: InkObject | null) {\n if (name !== null && this._globals.has(name)) {\n return { result: this._globals.get(name), exists: true };\n }\n\n return { result: value, exists: false };\n }\n\n public SetGlobal(name: string, value: InkObject) {\n this._globals.set(name, value);\n }\n\n public AddChangedVariable(name: string) {\n return this._changedVariables.add(name);\n }\n\n public TryGetVisitCount(container: Container, /* out */ count: number) {\n if (this._visitCounts.has(container)) {\n return { result: this._visitCounts.get(container), exists: true };\n }\n\n return { result: count, exists: false };\n }\n\n public SetVisitCount(container: Container, count: number) {\n this._visitCounts.set(container, count);\n }\n\n public SetTurnIndex(container: Container, index: number) {\n this._turnIndices.set(container, index);\n }\n\n public TryGetTurnIndex(container: Container, /* out */ index: number) {\n if (this._turnIndices.has(container)) {\n return { result: this._turnIndices.get(container), exists: true };\n }\n\n return { result: index, exists: false };\n }\n\n private _globals: Map<string, InkObject>;\n private _changedVariables: Set<string> = new Set();\n private _visitCounts: Map<Container, number> = new Map();\n private _turnIndices: Map<Container, number> = new Map();\n}\n","export class SimpleJson {\n public static TextToDictionary(text: string) {\n return new SimpleJson.Reader(text).ToDictionary();\n }\n\n public static TextToArray(text: string) {\n return new SimpleJson.Reader(text).ToArray();\n }\n}\n\nexport namespace SimpleJson {\n export class Reader {\n constructor(text: string) {\n this._rootObject = JSON.parse(text);\n }\n\n public ToDictionary() {\n return this._rootObject as Record<string, any>;\n }\n\n public ToArray() {\n return this._rootObject as any[];\n }\n\n private _rootObject: any[] | Record<string, any>;\n }\n\n // In C#, this class writes json tokens directly to a StringWriter or\n // another stream. Here, a temporary hierarchy is created in the form\n // of a javascript object, which is serialised in the `toString` method.\n // See individual methods and properties for more information.\n export class Writer {\n public WriteObject(inner: (w: Writer) => void) {\n this.WriteObjectStart();\n inner(this);\n this.WriteObjectEnd();\n }\n\n // Add a new object.\n public WriteObjectStart() {\n this.StartNewObject(true);\n\n let newObject: Record<string, any> = {};\n\n if (this.state === SimpleJson.Writer.State.Property) {\n // This object is created as the value of a property,\n // inside an other object.\n this.Assert(this.currentCollection !== null);\n this.Assert(this.currentPropertyName !== null);\n\n let propertyName = this._propertyNameStack.pop();\n this.currentCollection![propertyName!] = newObject;\n this._collectionStack.push(newObject);\n } else if (this.state === SimpleJson.Writer.State.Array) {\n // This object is created as the child of an array.\n this.Assert(this.currentCollection !== null);\n\n this.currentCollection!.push(newObject);\n this._collectionStack.push(newObject);\n } else {\n // This object is the root object.\n this.Assert(this.state === SimpleJson.Writer.State.None);\n this._jsonObject = newObject;\n this._collectionStack.push(newObject);\n }\n\n this._stateStack.push(\n new SimpleJson.Writer.StateElement(SimpleJson.Writer.State.Object)\n );\n }\n\n public WriteObjectEnd() {\n this.Assert(this.state === SimpleJson.Writer.State.Object);\n this._collectionStack.pop();\n this._stateStack.pop();\n }\n\n // Write a property name / value pair to the current object.\n public WriteProperty(\n name: any,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n innerOrContent: ((w: Writer) => void) | string | boolean | null\n ) {\n this.WritePropertyStart(name);\n if (arguments[1] instanceof Function) {\n let inner = arguments[1];\n inner(this);\n } else {\n let content: string | boolean | null = arguments[1];\n this.Write(content);\n }\n this.WritePropertyEnd();\n }\n\n // Int and Float are separate calls, since there both are\n // numbers in JavaScript, but need to be handled differently.\n\n public WriteIntProperty(name: any, content: number) {\n this.WritePropertyStart(name);\n this.WriteInt(content);\n this.WritePropertyEnd();\n }\n\n public WriteFloatProperty(name: any, content: number) {\n this.WritePropertyStart(name);\n this.WriteFloat(content);\n this.WritePropertyEnd();\n }\n\n // Prepare a new property name, which will be use to add the\n // new object when calling _addToCurrentObject() from a Write\n // method.\n public WritePropertyStart(name: any) {\n this.Assert(this.state === SimpleJson.Writer.State.Object);\n this._propertyNameStack.push(name);\n\n this.IncrementChildCount();\n\n this._stateStack.push(\n new SimpleJson.Writer.StateElement(SimpleJson.Writer.State.Property)\n );\n }\n\n public WritePropertyEnd() {\n this.Assert(this.state === SimpleJson.Writer.State.Property);\n this.Assert(this.childCount === 1);\n this._stateStack.pop();\n }\n\n // Prepare a new property name, except this time, the property name\n // will be created by concatenating all the strings passed to\n // WritePropertyNameInner.\n public WritePropertyNameStart() {\n this.Assert(this.state === SimpleJson.Writer.State.Object);\n this.IncrementChildCount();\n\n this._currentPropertyName = \"\";\n\n this._stateStack.push(\n new SimpleJson.Writer.StateElement(SimpleJson.Writer.State.Property)\n );\n this._stateStack.push(\n new SimpleJson.Writer.StateElement(SimpleJson.Writer.State.PropertyName)\n );\n }\n\n public WritePropertyNameEnd() {\n this.Assert(this.state === SimpleJson.Writer.State.PropertyName);\n this.Assert(this._currentPropertyName !== null);\n this._propertyNameStack.push(this._currentPropertyName!);\n this._currentPropertyName = null;\n this._stateStack.pop();\n }\n\n public WritePropertyNameInner(str: string) {\n this.Assert(this.state === SimpleJson.Writer.State.PropertyName);\n this.Assert(this._currentPropertyName !== null);\n this._currentPropertyName += str;\n }\n\n // Add a new array.\n public WriteArrayStart() {\n this.StartNewObject(true);\n\n let newObject: any[] = [];\n\n if (this.state === SimpleJson.Writer.State.Property) {\n // This array is created as the value of a property,\n // inside an object.\n this.Assert(this.currentCollection !== null);\n this.Assert(this.currentPropertyName !== null);\n\n let propertyName = this._propertyNameStack.pop();\n this.currentCollection![propertyName!] = newObject;\n this._collectionStack.push(newObject);\n } else if (this.state === SimpleJson.Writer.State.Array) {\n // This array is created as the child of another array.\n this.Assert(this.currentCollection !== null);\n\n this.currentCollection!.push(newObject);\n this._collectionStack.push(newObject);\n } else {\n // This array is the root object.\n this.Assert(this.state === SimpleJson.Writer.State.None);\n this._jsonObject = newObject;\n this._collectionStack.push(newObject);\n }\n\n this._stateStack.push(\n new SimpleJson.Writer.StateElement(SimpleJson.Writer.State.Array)\n );\n }\n\n public WriteArrayEnd() {\n this.Assert(this.state === SimpleJson.Writer.State.Array);\n this._collectionStack.pop();\n this._stateStack.pop();\n }\n\n // Add the value to the appropriate collection (array / object), given the current\n // context.\n public Write(\n value: number | string | boolean | null,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n escape: boolean = true\n ) {\n if (value === null) {\n console.error(\"Warning: trying to write a null value\");\n return;\n }\n\n this.StartNewObject(false);\n this._addToCurrentObject(value);\n }\n\n public WriteBool(value: boolean | null) {\n if (value === null) {\n return;\n }\n\n this.StartNewObject(false);\n this._addToCurrentObject(value);\n }\n\n public WriteInt(value: number | null) {\n if (value === null) {\n return;\n }\n\n this.StartNewObject(false);\n\n // Math.floor is used as a precaution:\n // 1. to ensure that the value is written as an integer\n // (without a fractional part -> 1 instead of 1.0), even\n // though it should be the default behaviour of\n // JSON.serialize;\n // 2. to ensure that if a floating number is passed\n // accidentally, it's converted to an integer.\n //\n // This guarantees savegame compatibility with the reference\n // implementation.\n this._addToCurrentObject(Math.floor(value));\n }\n\n // Since JSON doesn't support NaN and Infinity, these values\n // are converted here.\n public WriteFloat(value: number | null) {\n if (value === null) {\n return;\n }\n\n this.StartNewObject(false);\n if (value == Number.POSITIVE_INFINITY) {\n this._addToCurrentObject(3.4e38);\n } else if (value == Number.NEGATIVE_INFINITY) {\n this._addToCurrentObject(-3.4e38);\n } else if (isNaN(value)) {\n this._addToCurrentObject(0.0);\n } else {\n this._addToCurrentObject(value);\n }\n }\n\n public WriteNull() {\n this.StartNewObject(false);\n this._addToCurrentObject(null);\n }\n\n // Prepare a string before adding it to the current collection in\n // WriteStringEnd(). The string will be a concatenation of all the\n // strings passed to WriteStringInner.\n public WriteStringStart() {\n this.StartNewObject(false);\n this._currentString = \"\";\n this._stateStack.push(\n new SimpleJson.Writer.StateElement(SimpleJson.Writer.State.String)\n );\n }\n\n public WriteStringEnd() {\n this.Assert(this.state == SimpleJson.Writer.State.String);\n this._stateStack.pop();\n this._addToCurrentObject(this._currentString);\n this._currentString = null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public WriteStringInner(str: string | null, escape: boolean = true) {\n this.Assert(this.state === SimpleJson.Writer.State.String);\n\n if (str === null) {\n console.error(\"Warning: trying to write a null string\");\n return;\n }\n\n this._currentString += str;\n }\n\n // Serialise the root object into a JSON string.\n public toString() {\n if (this._jsonObject === null) {\n return \"\";\n }\n\n return JSON.stringify(this._jsonObject);\n }\n\n // Prepare the state stack when adding new objects / values.\n private StartNewObject(container: boolean) {\n if (container) {\n this.Assert(\n this.state === SimpleJson.Writer.State.None ||\n this.state === SimpleJson.Writer.State.Property ||\n this.state === SimpleJson.Writer.State.Array\n );\n } else {\n this.Assert(\n this.state === SimpleJson.Writer.State.Property ||\n this.state === SimpleJson.Writer.State.Array\n );\n }\n\n if (this.state === SimpleJson.Writer.State.Property) {\n this.Assert(this.childCount === 0);\n }\n\n if (\n this.state === SimpleJson.Writer.State.Array ||\n this.state === SimpleJson.Writer.State.Property\n ) {\n this.IncrementChildCount();\n }\n }\n\n // These getters peek all the different stacks.\n\n private get state() {\n if (this._stateStack.length > 0) {\n return this._stateStack[this._stateStack.length - 1].type;\n } else {\n return SimpleJson.Writer.State.None;\n }\n }\n\n private get childCount() {\n if (this._stateStack.length > 0) {\n return this._stateStack[this._stateStack.length - 1].childCount;\n } else {\n return 0;\n }\n }\n\n private get currentCollection() {\n if (this._collectionStack.length > 0) {\n return this._collectionStack[this._collectionStack.length - 1];\n } else {\n return null;\n }\n }\n\n private get currentPropertyName() {\n if (this._propertyNameStack.length > 0) {\n return this._propertyNameStack[this._propertyNameStack.length - 1];\n } else {\n return null;\n }\n }\n\n private IncrementChildCount() {\n this.Assert(this._stateStack.length > 0);\n let currEl = this._stateStack.pop()!;\n currEl.childCount++;\n this._stateStack.push(currEl);\n }\n\n private Assert(condition: boolean) {\n if (!condition) throw Error(\"Assert failed while writing JSON\");\n }\n\n // This method did not exist in the original C# code. It adds\n // the given value to the current collection (used by Write methods).\n private _addToCurrentObject(value: number | string | boolean | null) {\n this.Assert(this.currentCollection !== null);\n if (this.state === SimpleJson.Writer.State.Array) {\n this.Assert(Array.isArray(this.currentCollection));\n (this.currentCollection as any[]).push(value);\n } else if (this.state === SimpleJson.Writer.State.Property) {\n this.Assert(!Array.isArray(this.currentCollection));\n this.Assert(this.currentPropertyName !== null);\n (this.currentCollection as Record<string, any>)[\n this.currentPropertyName!\n ] = value;\n this._propertyNameStack.pop();\n }\n }\n\n // In addition to `_stateStack` present in the original code,\n // this implementation of SimpleJson use two other stacks and two\n // temporary variables holding the current context.\n\n // Used to keep track of the current property name being built\n // with `WritePropertyNameStart`, `WritePropertyNameInner` and\n // `WritePropertyNameEnd`.\n private _currentPropertyName: string | null = null;\n\n // Used to keep track of the current string value being built\n // with `WriteStringStart`, `WriteStringInner` and\n // `WriteStringEnd`.\n private _currentString: string | null = null;\n\n private _stateStack: SimpleJson.Writer.StateElement[] = [];\n\n // Keep track of the current collection being built (either an array\n // or an object). For instance, at the '?' step during the hiarchy\n // creation, this hierarchy:\n // [3, {a: [b, ?]}] will have this corresponding stack:\n // (bottom) [Array, Object, Array] (top)\n private _collectionStack: Array<any[] | Record<string, any>> = [];\n\n // Keep track of the current property being assigned. For instance, at\n // the '?' step during the hiarchy creation, this hierarchy:\n // [3, {a: [b, {c: ?}]}] will have this corresponding stack:\n // (bottom) [a, c] (top)\n private _propertyNameStack: string[] = [];\n\n // Object containing the entire hiearchy.\n private _jsonObject: Record<string, any> | any[] | null = null;\n }\n\n export namespace Writer {\n export enum State {\n None,\n Object,\n Array,\n Property,\n PropertyName,\n String,\n }\n\n export class StateElement {\n public type: SimpleJson.Writer.State = SimpleJson.Writer.State.None;\n public childCount: number = 0;\n\n constructor(type: SimpleJson.Writer.State) {\n this.type = type;\n }\n }\n }\n}\n","import { CallStack } from \"./CallStack\";\nimport { Choice } from \"./Choice\";\nimport { JsonSerialisation } from \"./JsonSerialisation\";\nimport { InkObject } from \"./Object\";\nimport { SimpleJson } from \"./SimpleJson\";\nimport { Story } from \"./Story\";\nimport { throwNullException } from \"./NullException\";\n\nexport class Flow {\n public name: string;\n public callStack: CallStack;\n public outputStream: InkObject[];\n public currentChoices: Choice[];\n\n constructor(name: String, story: Story);\n constructor(name: String, story: Story, jObject: Record<string, any>);\n constructor() {\n let name = arguments[0] as string;\n let story = arguments[1] as Story;\n\n this.name = name;\n this.callStack = new CallStack(story);\n\n if (arguments[2]) {\n let jObject = arguments[2] as Record<string, any>;\n\n this.callStack.SetJsonToken(jObject[\"callstack\"], story);\n this.outputStream = JsonSerialisation.JArrayToRuntimeObjList(\n jObject[\"outputStream\"]\n );\n this.currentChoices = JsonSerialisation.JArrayToRuntimeObjList(\n jObject[\"currentChoices\"]\n ) as Choice[];\n\n let jChoiceThreadsObj = jObject[\"choiceThreads\"];\n if (typeof jChoiceThreadsObj !== \"undefined\") {\n this.LoadFlowChoiceThreads(jChoiceThreadsObj, story);\n }\n } else {\n this.outputStream = [];\n this.currentChoices = [];\n }\n }\n\n public WriteJson(writer: SimpleJson.Writer) {\n writer.WriteObjectStart();\n\n writer.WriteProperty(\"callstack\", (w) => this.callStack.WriteJson(w));\n writer.WriteProperty(\"outputStream\", (w) =>\n JsonSerialisation.WriteListRuntimeObjs(w, this.outputStream)\n );\n\n let hasChoiceThreads = false;\n for (let c of this.currentChoices) {\n if (c.threadAtGeneration === null)\n return throwNullException(\"c.threadAtGeneration\");\n\n c.originalThreadIndex = c.threadAtGeneration.threadIndex;\n\n if (this.callStack.ThreadWithIndex(c.originalThreadIndex) === null) {\n if (!hasChoiceThreads) {\n hasChoiceThreads = true;\n writer.WritePropertyStart(\"choiceThreads\");\n writer.WriteObjectStart();\n }\n\n writer.WritePropertyStart(c.originalThreadIndex);\n c.threadAtGeneration.WriteJson(writer);\n writer.WritePropertyEnd();\n }\n }\n\n if (hasChoiceThreads) {\n writer.WriteObjectEnd();\n writer.WritePropertyEnd();\n }\n\n writer.WriteProperty(\"currentChoices\", (w) => {\n w.WriteArrayStart();\n for (let c of this.currentChoices) {\n JsonSerialisation.WriteChoice(w, c);\n }\n w.WriteArrayEnd();\n });\n\n writer.WriteObjectEnd();\n }\n\n public LoadFlowChoiceThreads(\n jChoiceThreads: Record<string, any>,\n story: Story\n ) {\n for (let choice of this.currentChoices) {\n let foundActiveThread = this.callStack.ThreadWithIndex(\n choice.originalThreadIndex\n );\n if (foundActiveThread !== null) {\n choice.threadAtGeneration = foundActiveThread.Copy();\n } else {\n let jSavedChoiceThread =\n jChoiceThreads[`${choice.originalThreadIndex}`];\n choice.threadAtGeneration = new CallStack.Thread(\n jSavedChoiceThread,\n story\n );\n }\n }\n }\n}\n","// TODO: Unify with Compiler.\n\nexport type ErrorHandler = (message: string, type: ErrorType) => void;\n\nexport enum ErrorType {\n Author,\n Warning,\n Error,\n}\n","import { CallStack } from \"./CallStack\";\nimport { VariablesState } from \"./VariablesState\";\nimport { ValueType, Value, StringValue, ListValue } from \"./Value\";\nimport { PushPopType } from \"./PushPop\";\nimport { Tag } from \"./Tag\";\nimport { Glue } from \"./Glue\";\nimport { Path } from \"./Path\";\nimport { ControlCommand } from \"./ControlCommand\";\nimport { StringBuilder } from \"./StringBuilder\";\nimport { JsonSerialisation } from \"./JsonSerialisation\";\nimport { PRNG } from \"./PRNG\";\nimport { Void } from \"./Void\";\nimport { Pointer } from \"./Pointer\";\nimport { tryGetValueFromMap } from \"./TryGetResult\";\nimport { Choice } from \"./Choice\";\nimport { asOrNull, asOrThrows, nullIfUndefined } from \"./TypeAssertion\";\nimport { Debug } from \"./Debug\";\nimport { Container } from \"./Container\";\nimport { InkObject } from \"./Object\";\nimport { throwNullException } from \"./NullException\";\nimport { Story } from \"./Story\";\nimport { StatePatch } from \"./StatePatch\";\nimport { SimpleJson } from \"./SimpleJson\";\nimport { Flow } from \"./Flow\";\nimport { InkList } from \"./InkList\";\n\nexport class StoryState {\n // Backward compatible changes since v8:\n // v10: dynamic tags\n // v9: multi-flows\n public readonly kInkSaveStateVersion = 10;\n public readonly kMinCompatibleLoadVersion = 8;\n\n public onDidLoadState: (() => void) | null = null;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public ToJson(indented: boolean = false) {\n let writer = new SimpleJson.Writer();\n this.WriteJson(writer);\n return writer.toString();\n }\n public toJson(indented: boolean = false) {\n return this.ToJson(indented);\n }\n\n public LoadJson(json: string) {\n let jObject = SimpleJson.TextToDictionary(json);\n this.LoadJsonObj(jObject);\n if (this.onDidLoadState !== null) this.onDidLoadState();\n }\n\n public VisitCountAtPathString(pathString: string) {\n let visitCountOut;\n\n if (this._patch !== null) {\n let container = this.story.ContentAtPath(new Path(pathString)).container;\n if (container === null)\n throw new Error(\"Content at path not found: \" + pathString);\n\n visitCountOut = this._patch.TryGetVisitCount(container, 0);\n if (visitCountOut.exists) return visitCountOut.result;\n }\n\n visitCountOut = tryGetValueFromMap(this._visitCounts, pathString, null);\n if (visitCountOut.exists) return visitCountOut.result;\n\n return 0;\n }\n\n public VisitCountForContainer(container: Container | null): number {\n if (container === null) {\n return throwNullException(\"container\");\n }\n if (!container.visitsShouldBeCounted) {\n this.story.Error(\n \"Read count for target (\" +\n container.name +\n \" - on \" +\n container.debugMetadata +\n \") unknown. The story may need to be compiled with countAllVisits flag (-c).\"\n );\n return 0;\n }\n\n if (this._patch !== null) {\n let count = this._patch.TryGetVisitCount(container, 0);\n if (count.exists) {\n return count.result!;\n }\n }\n\n let containerPathStr = container.path.toString();\n let count2 = tryGetValueFromMap(this._visitCounts, containerPathStr, null);\n if (count2.exists) {\n return count2.result!;\n }\n\n return 0;\n }\n\n public IncrementVisitCountForContainer(container: Container) {\n if (this._patch !== null) {\n let currCount = this.VisitCountForContainer(container);\n currCount++;\n this._patch.SetVisitCount(container, currCount);\n return;\n }\n\n let containerPathStr = container.path.toString();\n let count = tryGetValueFromMap(this._visitCounts, containerPathStr, null);\n if (count.exists) {\n this._visitCounts.set(containerPathStr, count.result! + 1);\n } else {\n this._visitCounts.set(containerPathStr, 1);\n }\n }\n\n public RecordTurnIndexVisitToContainer(container: Container) {\n if (this._patch !== null) {\n this._patch.SetTurnIndex(container, this.currentTurnIndex);\n return;\n }\n\n let containerPathStr = container.path.toString();\n this._turnIndices.set(containerPathStr, this.currentTurnIndex);\n }\n\n public TurnsSinceForContainer(container: Container) {\n if (!container.turnIndexShouldBeCounted) {\n this.story.Error(\n \"TURNS_SINCE() for target (\" +\n container.name +\n \" - on \" +\n container.debugMetadata +\n \") unknown. The story may need to be compiled with countAllVisits flag (-c).\"\n );\n }\n\n if (this._patch !== null) {\n let index = this._patch.TryGetTurnIndex(container, 0);\n if (index.exists) {\n return this.currentTurnIndex - index.result!;\n }\n }\n\n let containerPathStr = container.path.toString();\n let index2 = tryGetValueFromMap(this._turnIndices, containerPathStr, 0);\n if (index2.exists) {\n return this.currentTurnIndex - index2.result!;\n } else {\n return -1;\n }\n }\n\n get callstackDepth() {\n return this.callStack.depth;\n }\n\n get outputStream() {\n return this._currentFlow.outputStream;\n }\n\n get currentChoices() {\n // If we can continue generating text content rather than choices,\n // then we reflect the choice list as being empty, since choices\n // should always come at the end.\n if (this.canContinue) return [];\n return this._currentFlow.currentChoices;\n }\n\n get generatedChoices() {\n return this._currentFlow.currentChoices;\n }\n\n get currentErrors() {\n return this._currentErrors;\n }\n private _currentErrors: string[] | null = null;\n\n get currentWarnings() {\n return this._currentWarnings;\n }\n private _currentWarnings: string[] | null = null;\n\n get variablesState() {\n return this._variablesState;\n }\n set variablesState(value) {\n this._variablesState = value;\n }\n private _variablesState: VariablesState;\n\n get callStack() {\n return this._currentFlow.callStack;\n }\n\n get evaluationStack() {\n return this._evaluationStack;\n }\n private _evaluationStack: InkObject[];\n\n public divertedPointer: Pointer = Pointer.Null;\n\n get currentTurnIndex() {\n return this._currentTurnIndex;\n }\n set currentTurnIndex(value) {\n this._currentTurnIndex = value;\n }\n private _currentTurnIndex: number = 0;\n\n public storySeed: number = 0;\n public previousRandom: number = 0;\n public didSafeExit: boolean = false;\n\n public story: Story;\n\n get currentPathString() {\n let pointer = this.currentPointer;\n if (pointer.isNull) {\n return null;\n } else {\n if (pointer.path === null) {\n return throwNullException(\"pointer.path\");\n }\n return pointer.path.toString();\n }\n }\n\n get currentPointer() {\n return this.callStack.currentElement.currentPointer.copy();\n }\n\n set currentPointer(value) {\n this.callStack.currentElement.currentPointer = value.copy();\n }\n\n get previousPointer() {\n return this.callStack.currentThread.previousPointer.copy();\n }\n\n set previousPointer(value) {\n this.callStack.currentThread.previousPointer = value.copy();\n }\n\n get canContinue() {\n return !this.currentPointer.isNull && !this.hasError;\n }\n\n get hasError() {\n return this.currentErrors != null && this.currentErrors.length > 0;\n }\n\n get hasWarning() {\n return this.currentWarnings != null && this.currentWarnings.length > 0;\n }\n\n get currentText() {\n if (this._outputStreamTextDirty) {\n let sb = new StringBuilder();\n\n let inTag: boolean = false;\n\n for (let outputObj of this.outputStream) {\n // var textContent = outputObj as StringValue;\n let textContent = asOrNull(outputObj, StringValue);\n if (!inTag && textContent !== null) {\n sb.Append(textContent.value);\n } else {\n let controlCommand = asOrNull(outputObj, ControlCommand);\n if (controlCommand !== null) {\n if (\n controlCommand.commandType == ControlCommand.CommandType.BeginTag\n ) {\n inTag = true;\n } else if (\n controlCommand.commandType == ControlCommand.CommandType.EndTag\n ) {\n inTag = false;\n }\n }\n }\n }\n\n this._currentText = this.CleanOutputWhitespace(sb.toString());\n this._outputStreamTextDirty = false;\n }\n\n return this._currentText;\n }\n private _currentText: string | null = null;\n\n public CleanOutputWhitespace(str: string) {\n let sb = new StringBuilder();\n\n let currentWhitespaceStart = -1;\n let startOfLine = 0;\n\n for (let i = 0; i < str.length; i++) {\n let c = str.charAt(i);\n\n let isInlineWhitespace = c == \" \" || c == \"\\t\";\n\n if (isInlineWhitespace && currentWhitespaceStart == -1)\n currentWhitespaceStart = i;\n\n if (!isInlineWhitespace) {\n if (\n c != \"\\n\" &&\n currentWhitespaceStart > 0 &&\n currentWhitespaceStart != startOfLine\n ) {\n sb.Append(\" \");\n }\n currentWhitespaceStart = -1;\n }\n\n if (c == \"\\n\") startOfLine = i + 1;\n\n if (!isInlineWhitespace) sb.Append(c);\n }\n\n return sb.toString();\n }\n\n get currentTags() {\n if (this._outputStreamTagsDirty) {\n this._currentTags = [];\n let inTag: boolean = false;\n let sb = new StringBuilder();\n\n for (let outputObj of this.outputStream) {\n let controlCommand = asOrNull(outputObj, ControlCommand);\n if (controlCommand != null) {\n if (\n controlCommand.commandType == ControlCommand.CommandType.BeginTag\n ) {\n if (inTag && sb.Length > 0) {\n let txt = this.CleanOutputWhitespace(sb.toString());\n this._currentTags.push(txt);\n sb.Clear();\n }\n inTag = true;\n } else if (\n controlCommand.commandType == ControlCommand.CommandType.EndTag\n ) {\n if (sb.Length > 0) {\n let txt = this.CleanOutputWhitespace(sb.toString());\n this._currentTags.push(txt);\n sb.Clear();\n }\n inTag = false;\n }\n } else if (inTag) {\n let strVal = asOrNull(outputObj, StringValue);\n if (strVal !== null) {\n sb.Append(strVal.value);\n }\n } else {\n let tag = asOrNull(outputObj, Tag);\n if (tag != null && tag.text != null && tag.text.length > 0) {\n this._currentTags.push(tag.text); // tag.text has whitespae already cleaned\n }\n }\n }\n\n if (sb.Length > 0) {\n let txt = this.CleanOutputWhitespace(sb.toString());\n this._currentTags.push(txt);\n sb.Clear();\n }\n\n this._outputStreamTagsDirty = false;\n }\n\n return this._currentTags;\n }\n private _currentTags: string[] | null = null;\n\n get currentFlowName() {\n return this._currentFlow.name;\n }\n\n get currentFlowIsDefaultFlow() {\n return this._currentFlow.name == this.kDefaultFlowName;\n }\n\n get aliveFlowNames() {\n if (this._aliveFlowNamesDirty) {\n this._aliveFlowNames = [];\n\n if (this._namedFlows != null) {\n for (let flowName of this._namedFlows.keys()) {\n if (flowName != this.kDefaultFlowName) {\n this._aliveFlowNames.push(flowName);\n }\n }\n }\n\n this._aliveFlowNamesDirty = false;\n }\n\n return this._aliveFlowNames;\n }\n\n get inExpressionEvaluation() {\n return this.callStack.currentElement.inExpressionEvaluation;\n }\n set inExpressionEvaluation(value) {\n this.callStack.currentElement.inExpressionEvaluation = value;\n }\n\n constructor(story: Story) {\n this.story = story;\n\n this._currentFlow = new Flow(this.kDefaultFlowName, story);\n this.OutputStreamDirty();\n\n this._aliveFlowNamesDirty = true;\n this._evaluationStack = [];\n\n this._variablesState = new VariablesState(\n this.callStack,\n story.listDefinitions\n );\n\n this._visitCounts = new Map();\n this._turnIndices = new Map();\n this.currentTurnIndex = -1;\n\n let timeSeed = new Date().getTime();\n this.storySeed = new PRNG(timeSeed).next() % 100;\n this.previousRandom = 0;\n\n this.GoToStart();\n }\n\n public GoToStart() {\n this.callStack.currentElement.currentPointer = Pointer.StartOf(\n this.story.mainContentContainer\n );\n }\n\n public SwitchFlow_Internal(flowName: string | null) {\n if (flowName === null)\n throw new Error(\"Must pass a non-null string to Story.SwitchFlow\");\n\n if (this._namedFlows === null) {\n this._namedFlows = new Map();\n this._namedFlows.set(this.kDefaultFlowName, this._currentFlow);\n }\n\n if (flowName === this._currentFlow.name) {\n return;\n }\n\n let flow: Flow;\n let content = tryGetValueFromMap(this._namedFlows, flowName, null);\n if (content.exists) {\n flow = content.result!;\n } else {\n flow = new Flow(flowName, this.story);\n this._namedFlows.set(flowName, flow);\n this._aliveFlowNamesDirty = true;\n }\n\n this._currentFlow = flow;\n this.variablesState.callStack = this._currentFlow.callStack;\n\n this.OutputStreamDirty();\n }\n\n public SwitchToDefaultFlow_Internal() {\n if (this._namedFlows === null) return;\n this.SwitchFlow_Internal(this.kDefaultFlowName);\n }\n\n public RemoveFlow_Internal(flowName: string | null) {\n if (flowName === null)\n throw new Error(\"Must pass a non-null string to Story.DestroyFlow\");\n if (flowName === this.kDefaultFlowName)\n throw new Error(\"Cannot destroy default flow\");\n\n if (this._currentFlow.name === flowName) {\n this.SwitchToDefaultFlow_Internal();\n }\n\n if (this._namedFlows === null)\n return throwNullException(\"this._namedFlows\");\n this._namedFlows.delete(flowName);\n this._aliveFlowNamesDirty = true;\n }\n\n public CopyAndStartPatching() {\n let copy = new StoryState(this.story);\n\n copy._patch = new StatePatch(this._patch);\n\n copy._currentFlow.name = this._currentFlow.name;\n copy._currentFlow.callStack = new CallStack(this._currentFlow.callStack);\n copy._currentFlow.currentChoices.push(...this._currentFlow.currentChoices);\n copy._currentFlow.outputStream.push(...this._currentFlow.outputStream);\n copy.OutputStreamDirty();\n\n if (this._namedFlows !== null) {\n copy._namedFlows = new Map();\n for (let [namedFlowKey, namedFlowValue] of this._namedFlows) {\n copy._namedFlows.set(namedFlowKey, namedFlowValue);\n copy._aliveFlowNamesDirty = true;\n }\n copy._namedFlows.set(this._currentFlow.name, copy._currentFlow);\n }\n\n if (this.hasError) {\n copy._currentErrors = [];\n copy._currentErrors.push(...(this.currentErrors || []));\n }\n\n if (this.hasWarning) {\n copy._currentWarnings = [];\n copy._currentWarnings.push(...(this.currentWarnings || []));\n }\n\n copy.variablesState = this.variablesState;\n copy.variablesState.callStack = copy.callStack;\n copy.variablesState.patch = copy._patch;\n\n copy.evaluationStack.push(...this.evaluationStack);\n\n if (!this.divertedPointer.isNull)\n copy.divertedPointer = this.divertedPointer.copy();\n\n copy.previousPointer = this.previousPointer.copy();\n\n copy._visitCounts = this._visitCounts;\n copy._turnIndices = this._turnIndices;\n\n copy.currentTurnIndex = this.currentTurnIndex;\n copy.storySeed = this.storySeed;\n copy.previousRandom = this.previousRandom;\n\n copy.didSafeExit = this.didSafeExit;\n\n return copy;\n }\n\n public RestoreAfterPatch() {\n this.variablesState.callStack = this.callStack;\n this.variablesState.patch = this._patch;\n }\n\n public ApplyAnyPatch() {\n if (this._patch === null) return;\n\n this.variablesState.ApplyPatch();\n\n for (let [key, value] of this._patch.visitCounts)\n this.ApplyCountChanges(key, value, true);\n\n for (let [key, value] of this._patch.turnIndices)\n this.ApplyCountChanges(key, value, false);\n\n this._patch = null;\n }\n\n public ApplyCountChanges(\n container: Container,\n newCount: number,\n isVisit: boolean\n ) {\n let counts = isVisit ? this._visitCounts : this._turnIndices;\n counts.set(container.path.toString(), newCount);\n }\n\n public WriteJson(writer: SimpleJson.Writer) {\n writer.WriteObjectStart();\n\n writer.WritePropertyStart(\"flows\");\n writer.WriteObjectStart();\n\n // NOTE: Never pass `WriteJson` directly as an argument to `WriteProperty`.\n // Call it inside a function to make sure `this` is correctly bound\n // and passed down the call hierarchy.\n\n if (this._namedFlows !== null) {\n for (let [namedFlowKey, namedFlowValue] of this._namedFlows) {\n writer.WriteProperty(namedFlowKey, (w) => namedFlowValue.WriteJson(w));\n }\n } else {\n writer.WriteProperty(this._currentFlow.name, (w) =>\n this._currentFlow.WriteJson(w)\n );\n }\n\n writer.WriteObjectEnd();\n writer.WritePropertyEnd();\n\n writer.WriteProperty(\"currentFlowName\", this._currentFlow.name);\n\n writer.WriteProperty(\"variablesState\", (w) =>\n this.variablesState.WriteJson(w)\n );\n\n writer.WriteProperty(\"evalStack\", (w) =>\n JsonSerialisation.WriteListRuntimeObjs(w, this.evaluationStack)\n );\n\n if (!this.divertedPointer.isNull) {\n if (this.divertedPointer.path === null) {\n return throwNullException(\"divertedPointer\");\n }\n writer.WriteProperty(\n \"currentDivertTarget\",\n this.divertedPointer.path.componentsString\n );\n }\n\n writer.WriteProperty(\"visitCounts\", (w) =>\n JsonSerialisation.WriteIntDictionary(w, this._visitCounts)\n );\n writer.WriteProperty(\"turnIndices\", (w) =>\n JsonSerialisation.WriteIntDictionary(w, this._turnIndices)\n );\n\n writer.WriteIntProperty(\"turnIdx\", this.currentTurnIndex);\n writer.WriteIntProperty(\"storySeed\", this.storySeed);\n writer.WriteIntProperty(\"previousRandom\", this.previousRandom);\n\n writer.WriteIntProperty(\"inkSaveVersion\", this.kInkSaveStateVersion);\n\n writer.WriteIntProperty(\"inkFormatVersion\", Story.inkVersionCurrent);\n\n writer.WriteObjectEnd();\n }\n\n public LoadJsonObj(value: Record<string, any>) {\n let jObject = value;\n\n let jSaveVersion = jObject[\"inkSaveVersion\"];\n if (jSaveVersion == null) {\n throw new Error(\"ink save format incorrect, can't load.\");\n } else if (parseInt(jSaveVersion) < this.kMinCompatibleLoadVersion) {\n throw new Error(\n \"Ink save format isn't compatible with the current version (saw '\" +\n jSaveVersion +\n \"', but minimum is \" +\n this.kMinCompatibleLoadVersion +\n \"), so can't load.\"\n );\n }\n\n let flowsObj = jObject[\"flows\"];\n if (flowsObj != null) {\n let flowsObjDict = flowsObj as Record<string, any>;\n\n // Single default flow\n if (Object.keys(flowsObjDict).length === 1) {\n this._namedFlows = null;\n } else if (this._namedFlows === null) {\n this._namedFlows = new Map();\n } else {\n this._namedFlows.clear();\n }\n\n let flowsObjDictEntries = Object.entries(flowsObjDict);\n for (let [namedFlowObjKey, namedFlowObjValue] of flowsObjDictEntries) {\n let name = namedFlowObjKey;\n let flowObj = namedFlowObjValue as Record<string, any>;\n\n let flow = new Flow(name, this.story, flowObj);\n\n if (Object.keys(flowsObjDict).length === 1) {\n this._currentFlow = new Flow(name, this.story, flowObj);\n } else {\n if (this._namedFlows === null)\n return throwNullException(\"this._namedFlows\");\n this._namedFlows.set(name, flow);\n }\n }\n\n if (this._namedFlows != null && this._namedFlows.size > 1) {\n let currFlowName = jObject[\"currentFlowName\"] as string;\n // Adding a bang at the end, because we're trusting the save, as\n // done in upstream. If the save is corrupted, the execution\n // is undefined.\n this._currentFlow = this._namedFlows.get(currFlowName)!;\n }\n } else {\n this._namedFlows = null;\n this._currentFlow.name = this.kDefaultFlowName;\n this._currentFlow.callStack.SetJsonToken(\n jObject[\"callstackThreads\"] as Record<string, any>,\n this.story\n );\n this._currentFlow.outputStream = JsonSerialisation.JArrayToRuntimeObjList(\n jObject[\"outputStream\"] as any[]\n );\n this._currentFlow.currentChoices =\n JsonSerialisation.JArrayToRuntimeObjList(\n jObject[\"currentChoices\"] as any[]\n ) as Choice[];\n\n let jChoiceThreadsObj = jObject[\"choiceThreads\"];\n this._currentFlow.LoadFlowChoiceThreads(jChoiceThreadsObj, this.story);\n }\n\n this.OutputStreamDirty();\n this._aliveFlowNamesDirty = true;\n\n this.variablesState.SetJsonToken(jObject[\"variablesState\"]);\n this.variablesState.callStack = this._currentFlow.callStack;\n\n this._evaluationStack = JsonSerialisation.JArrayToRuntimeObjList(\n jObject[\"evalStack\"]\n );\n\n let currentDivertTargetPath = jObject[\"currentDivertTarget\"];\n if (currentDivertTargetPath != null) {\n let divertPath = new Path(currentDivertTargetPath.toString());\n this.divertedPointer = this.story.PointerAtPath(divertPath);\n }\n\n this._visitCounts = JsonSerialisation.JObjectToIntDictionary(\n jObject[\"visitCounts\"]\n );\n this._turnIndices = JsonSerialisation.JObjectToIntDictionary(\n jObject[\"turnIndices\"]\n );\n this.currentTurnIndex = parseInt(jObject[\"turnIdx\"]);\n this.storySeed = parseInt(jObject[\"storySeed\"]);\n this.previousRandom = parseInt(jObject[\"previousRandom\"]);\n }\n\n public ResetErrors() {\n this._currentErrors = null;\n this._currentWarnings = null;\n }\n public ResetOutput(objs: InkObject[] | null = null) {\n this.outputStream.length = 0;\n if (objs !== null) this.outputStream.push(...objs);\n this.OutputStreamDirty();\n }\n\n public PushToOutputStream(obj: InkObject | null) {\n // var text = obj as StringValue;\n let text = asOrNull(obj, StringValue);\n if (text !== null) {\n let listText = this.TrySplittingHeadTailWhitespace(text);\n if (listText !== null) {\n for (let textObj of listText) {\n this.PushToOutputStreamIndividual(textObj);\n }\n this.OutputStreamDirty();\n return;\n }\n }\n\n this.PushToOutputStreamIndividual(obj);\n this.OutputStreamDirty();\n }\n\n public PopFromOutputStream(count: number) {\n this.outputStream.splice(this.outputStream.length - count, count);\n this.OutputStreamDirty();\n }\n\n public TrySplittingHeadTailWhitespace(single: StringValue) {\n let str = single.value;\n if (str === null) {\n return throwNullException(\"single.value\");\n }\n\n let headFirstNewlineIdx = -1;\n let headLastNewlineIdx = -1;\n for (let i = 0; i < str.length; i++) {\n let c = str[i];\n if (c == \"\\n\") {\n if (headFirstNewlineIdx == -1) headFirstNewlineIdx = i;\n headLastNewlineIdx = i;\n } else if (c == \" \" || c == \"\\t\") continue;\n else break;\n }\n\n let tailLastNewlineIdx = -1;\n let tailFirstNewlineIdx = -1;\n for (let i = str.length - 1; i >= 0; i--) {\n let c = str[i];\n if (c == \"\\n\") {\n if (tailLastNewlineIdx == -1) tailLastNewlineIdx = i;\n tailFirstNewlineIdx = i;\n } else if (c == \" \" || c == \"\\t\") continue;\n else break;\n }\n\n // No splitting to be done?\n if (headFirstNewlineIdx == -1 && tailLastNewlineIdx == -1) return null;\n\n let listTexts: StringValue[] = [];\n let innerStrStart = 0;\n let innerStrEnd = str.length;\n\n if (headFirstNewlineIdx != -1) {\n if (headFirstNewlineIdx > 0) {\n let leadingSpaces = new StringValue(\n str.substring(0, headFirstNewlineIdx)\n );\n listTexts.push(leadingSpaces);\n }\n listTexts.push(new StringValue(\"\\n\"));\n innerStrStart = headLastNewlineIdx + 1;\n }\n\n if (tailLastNewlineIdx != -1) {\n innerStrEnd = tailFirstNewlineIdx;\n }\n\n if (innerStrEnd > innerStrStart) {\n let innerStrText = str.substring(innerStrStart, innerStrEnd);\n listTexts.push(new StringValue(innerStrText));\n }\n\n if (tailLastNewlineIdx != -1 && tailFirstNewlineIdx > headLastNewlineIdx) {\n listTexts.push(new StringValue(\"\\n\"));\n if (tailLastNewlineIdx < str.length - 1) {\n let numSpaces = str.length - tailLastNewlineIdx - 1;\n let trailingSpaces = new StringValue(\n str.substring(\n tailLastNewlineIdx + 1,\n tailLastNewlineIdx + 1 + numSpaces\n )\n );\n listTexts.push(trailingSpaces);\n }\n }\n\n return listTexts;\n }\n\n public PushToOutputStreamIndividual(obj: InkObject | null) {\n let glue = asOrNull(obj, Glue);\n let text = asOrNull(obj, StringValue);\n\n let includeInOutput = true;\n\n if (glue) {\n this.TrimNewlinesFromOutputStream();\n includeInOutput = true;\n } else if (text) {\n let functionTrimIndex = -1;\n let currEl = this.callStack.currentElement;\n if (currEl.type == PushPopType.Function) {\n functionTrimIndex = currEl.functionStartInOutputStream;\n }\n\n let glueTrimIndex = -1;\n for (let i = this.outputStream.length - 1; i >= 0; i--) {\n let o = this.outputStream[i];\n let c = o instanceof ControlCommand ? o : null;\n let g = o instanceof Glue ? o : null;\n\n if (g != null) {\n glueTrimIndex = i;\n break;\n } else if (\n c != null &&\n c.commandType == ControlCommand.CommandType.BeginString\n ) {\n if (i >= functionTrimIndex) {\n functionTrimIndex = -1;\n }\n break;\n }\n }\n\n let trimIndex = -1;\n if (glueTrimIndex != -1 && functionTrimIndex != -1)\n trimIndex = Math.min(functionTrimIndex, glueTrimIndex);\n else if (glueTrimIndex != -1) trimIndex = glueTrimIndex;\n else trimIndex = functionTrimIndex;\n\n if (trimIndex != -1) {\n if (text.isNewline) {\n includeInOutput = false;\n } else if (text.isNonWhitespace) {\n if (glueTrimIndex > -1) this.RemoveExistingGlue();\n\n if (functionTrimIndex > -1) {\n let callStackElements = this.callStack.elements;\n for (let i = callStackElements.length - 1; i >= 0; i--) {\n let el = callStackElements[i];\n if (el.type == PushPopType.Function) {\n el.functionStartInOutputStream = -1;\n } else {\n break;\n }\n }\n }\n }\n } else if (text.isNewline) {\n if (this.outputStreamEndsInNewline || !this.outputStreamContainsContent)\n includeInOutput = false;\n }\n }\n\n if (includeInOutput) {\n if (obj === null) {\n return throwNullException(\"obj\");\n }\n this.outputStream.push(obj);\n this.OutputStreamDirty();\n }\n }\n\n public TrimNewlinesFromOutputStream() {\n let removeWhitespaceFrom = -1;\n\n let i = this.outputStream.length - 1;\n while (i >= 0) {\n let obj = this.outputStream[i];\n let cmd = asOrNull(obj, ControlCommand);\n let txt = asOrNull(obj, StringValue);\n\n if (cmd != null || (txt != null && txt.isNonWhitespace)) {\n break;\n } else if (txt != null && txt.isNewline) {\n removeWhitespaceFrom = i;\n }\n i--;\n }\n\n // Remove the whitespace\n if (removeWhitespaceFrom >= 0) {\n i = removeWhitespaceFrom;\n while (i < this.outputStream.length) {\n let text = asOrNull(this.outputStream[i], StringValue);\n if (text) {\n this.outputStream.splice(i, 1);\n } else {\n i++;\n }\n }\n }\n\n this.OutputStreamDirty();\n }\n\n public RemoveExistingGlue() {\n for (let i = this.outputStream.length - 1; i >= 0; i--) {\n let c = this.outputStream[i];\n if (c instanceof Glue) {\n this.outputStream.splice(i, 1);\n } else if (c instanceof ControlCommand) {\n break;\n }\n }\n\n this.OutputStreamDirty();\n }\n\n get outputStreamEndsInNewline() {\n if (this.outputStream.length > 0) {\n for (let i = this.outputStream.length - 1; i >= 0; i--) {\n let obj = this.outputStream[i];\n if (obj instanceof ControlCommand) break;\n let text = this.outputStream[i];\n if (text instanceof StringValue) {\n if (text.isNewline) return true;\n else if (text.isNonWhitespace) break;\n }\n }\n }\n\n return false;\n }\n\n get outputStreamContainsContent() {\n for (let content of this.outputStream) {\n if (content instanceof StringValue) return true;\n }\n return false;\n }\n\n get inStringEvaluation() {\n for (let i = this.outputStream.length - 1; i >= 0; i--) {\n let cmd = asOrNull(this.outputStream[i], ControlCommand);\n if (\n cmd instanceof ControlCommand &&\n cmd.commandType == ControlCommand.CommandType.BeginString\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n public PushEvaluationStack(obj: InkObject | null) {\n // var listValue = obj as ListValue;\n let listValue = asOrNull(obj, ListValue);\n if (listValue) {\n // Update origin when list is has something to indicate the list origin\n let rawList = listValue.value;\n if (rawList === null) {\n return throwNullException(\"rawList\");\n }\n\n if (rawList.originNames != null) {\n if (!rawList.origins) rawList.origins = [];\n rawList.origins.length = 0;\n\n for (let n of rawList.originNames) {\n if (this.story.listDefinitions === null)\n return throwNullException(\"StoryState.story.listDefinitions\");\n let def = this.story.listDefinitions.TryListGetDefinition(n, null);\n if (def.result === null)\n return throwNullException(\"StoryState def.result\");\n if (rawList.origins.indexOf(def.result) < 0)\n rawList.origins.push(def.result);\n }\n }\n }\n\n if (obj === null) {\n return throwNullException(\"obj\");\n }\n this.evaluationStack.push(obj);\n }\n\n public PopEvaluationStack(): InkObject;\n public PopEvaluationStack(numberOfObjects: number): InkObject[];\n public PopEvaluationStack(numberOfObjects?: number) {\n if (typeof numberOfObjects === \"undefined\") {\n let obj = this.evaluationStack.pop();\n return nullIfUndefined(obj);\n } else {\n if (numberOfObjects > this.evaluationStack.length) {\n throw new Error(\"trying to pop too many objects\");\n }\n\n let popped = this.evaluationStack.splice(\n this.evaluationStack.length - numberOfObjects,\n numberOfObjects\n );\n return nullIfUndefined(popped);\n }\n }\n\n public PeekEvaluationStack() {\n return this.evaluationStack[this.evaluationStack.length - 1];\n }\n\n public ForceEnd() {\n this.callStack.Reset();\n\n this._currentFlow.currentChoices.length = 0;\n\n this.currentPointer = Pointer.Null;\n this.previousPointer = Pointer.Null;\n\n this.didSafeExit = true;\n }\n\n public TrimWhitespaceFromFunctionEnd() {\n Debug.Assert(this.callStack.currentElement.type == PushPopType.Function);\n let functionStartPoint =\n this.callStack.currentElement.functionStartInOutputStream;\n\n if (functionStartPoint == -1) {\n functionStartPoint = 0;\n }\n\n for (let i = this.outputStream.length - 1; i >= functionStartPoint; i--) {\n let obj = this.outputStream[i];\n let txt = asOrNull(obj, StringValue);\n let cmd = asOrNull(obj, ControlCommand);\n\n if (txt == null) continue;\n if (cmd) break;\n\n if (txt.isNewline || txt.isInlineWhitespace) {\n this.outputStream.splice(i, 1);\n this.OutputStreamDirty();\n } else {\n break;\n }\n }\n }\n\n public PopCallStack(popType: PushPopType | null = null) {\n if (this.callStack.currentElement.type == PushPopType.Function)\n this.TrimWhitespaceFromFunctionEnd();\n\n this.callStack.Pop(popType);\n }\n\n public SetChosenPath(path: Path, incrementingTurnIndex: boolean) {\n // Changing direction, assume we need to clear current set of choices\n this._currentFlow.currentChoices.length = 0;\n\n let newPointer = this.story.PointerAtPath(path);\n if (!newPointer.isNull && newPointer.index == -1) newPointer.index = 0;\n\n this.currentPointer = newPointer;\n\n if (incrementingTurnIndex) {\n this.currentTurnIndex++;\n }\n }\n\n public StartFunctionEvaluationFromGame(\n funcContainer: Container,\n args: any[]\n ) {\n this.callStack.Push(\n PushPopType.FunctionEvaluationFromGame,\n this.evaluationStack.length\n );\n this.callStack.currentElement.currentPointer =\n Pointer.StartOf(funcContainer);\n\n this.PassArgumentsToEvaluationStack(args);\n }\n\n public PassArgumentsToEvaluationStack(args: any[] | null) {\n if (args !== null) {\n for (let i = 0; i < args.length; i++) {\n if (\n !(\n typeof args[i] === \"number\" ||\n typeof args[i] === \"string\" ||\n typeof args[i] === \"boolean\" ||\n args[i] instanceof InkList\n )\n ) {\n throw new Error(\n \"ink arguments when calling EvaluateFunction / ChoosePathStringWithParameters must be\" +\n \"number, string, bool or InkList. Argument was \" +\n (nullIfUndefined(arguments[i]) === null)\n ? \"null\"\n : arguments[i].constructor.name\n );\n }\n\n this.PushEvaluationStack(Value.Create(args[i]));\n }\n }\n }\n\n public TryExitFunctionEvaluationFromGame() {\n if (\n this.callStack.currentElement.type ==\n PushPopType.FunctionEvaluationFromGame\n ) {\n this.currentPointer = Pointer.Null;\n this.didSafeExit = true;\n return true;\n }\n\n return false;\n }\n\n public CompleteFunctionEvaluationFromGame() {\n if (\n this.callStack.currentElement.type !=\n PushPopType.FunctionEvaluationFromGame\n ) {\n throw new Error(\n \"Expected external function evaluation to be complete. Stack trace: \" +\n this.callStack.callStackTrace\n );\n }\n\n let originalEvaluationStackHeight =\n this.callStack.currentElement.evaluationStackHeightWhenPushed;\n\n let returnedObj: InkObject | null = null;\n while (this.evaluationStack.length > originalEvaluationStackHeight) {\n let poppedObj = this.PopEvaluationStack();\n if (returnedObj === null) returnedObj = poppedObj;\n }\n\n this.PopCallStack(PushPopType.FunctionEvaluationFromGame);\n\n if (returnedObj) {\n if (returnedObj instanceof Void) return null;\n\n // Some kind of value, if not void\n // var returnVal = returnedObj as Runtime.Value;\n let returnVal = asOrThrows(returnedObj, Value);\n\n // DivertTargets get returned as the string of components\n // (rather than a Path, which isn't public)\n if (returnVal.valueType == ValueType.DivertTarget) {\n return returnVal.valueObject.toString();\n }\n\n // Other types can just have their exact object type:\n // int, float, string. VariablePointers get returned as strings.\n return returnVal.valueObject;\n }\n\n return null;\n }\n\n public AddError(message: string, isWarning: boolean) {\n if (!isWarning) {\n if (this._currentErrors == null) this._currentErrors = [];\n this._currentErrors.push(message);\n } else {\n if (this._currentWarnings == null) this._currentWarnings = [];\n this._currentWarnings.push(message);\n }\n }\n\n public OutputStreamDirty() {\n this._outputStreamTextDirty = true;\n this._outputStreamTagsDirty = true;\n }\n\n private _visitCounts: Map<string, number>;\n private _turnIndices: Map<string, number>;\n\n private _outputStreamTextDirty = true;\n private _outputStreamTagsDirty = true;\n\n private _patch: StatePatch | null = null;\n\n private _currentFlow: Flow;\n private _aliveFlowNames: string[] | null = null;\n private _namedFlows: Map<string, Flow> | null = null;\n private readonly kDefaultFlowName = \"DEFAULT_FLOW\";\n private _aliveFlowNamesDirty: boolean = true;\n}\n","// This is simple replacement of the Stopwatch class from the .NET Framework.\n// The original class can count time with much more accuracy than the Javascript version.\n// It might be worth considering using `window.performance` in the browser\n// or `process.hrtime()` in node.\nexport class Stopwatch {\n private startTime: number | undefined;\n\n constructor() {\n this.startTime = undefined;\n }\n\n get ElapsedMilliseconds(): number {\n if (typeof this.startTime === \"undefined\") {\n return 0;\n }\n return new Date().getTime() - this.startTime;\n }\n\n public Start() {\n this.startTime = new Date().getTime();\n }\n public Stop() {\n this.startTime = undefined;\n }\n}\n","import { Container } from \"./Container\";\nimport { InkObject } from \"./Object\";\nimport { JsonSerialisation } from \"./JsonSerialisation\";\nimport { StoryState } from \"./StoryState\";\nimport { ControlCommand } from \"./ControlCommand\";\nimport { PushPopType } from \"./PushPop\";\nimport { ChoicePoint } from \"./ChoicePoint\";\nimport { Choice } from \"./Choice\";\nimport { Divert } from \"./Divert\";\nimport {\n Value,\n StringValue,\n IntValue,\n DivertTargetValue,\n VariablePointerValue,\n ListValue,\n} from \"./Value\";\nimport { Path } from \"./Path\";\nimport { Void } from \"./Void\";\nimport { Tag } from \"./Tag\";\nimport { VariableAssignment } from \"./VariableAssignment\";\nimport { VariableReference } from \"./VariableReference\";\nimport { NativeFunctionCall } from \"./NativeFunctionCall\";\nimport { StoryException } from \"./StoryException\";\nimport { PRNG } from \"./PRNG\";\nimport { StringBuilder } from \"./StringBuilder\";\nimport { ListDefinitionsOrigin } from \"./ListDefinitionsOrigin\";\nimport { ListDefinition } from \"./ListDefinition\";\nimport { Stopwatch } from \"./StopWatch\";\nimport { Pointer } from \"./Pointer\";\nimport { InkList, InkListItem, KeyValuePair } from \"./InkList\";\nimport { asOrNull, asOrThrows } from \"./TypeAssertion\";\nimport { DebugMetadata } from \"./DebugMetadata\";\nimport { throwNullException } from \"./NullException\";\nimport { SimpleJson } from \"./SimpleJson\";\nimport { ErrorHandler, ErrorType } from \"./Error\";\n\nexport { InkList } from \"./InkList\";\n\nif (!Number.isInteger) {\n Number.isInteger = function isInteger(nVal: any) {\n return (\n typeof nVal === \"number\" &&\n isFinite(nVal) &&\n nVal > -9007199254740992 &&\n nVal < 9007199254740992 &&\n Math.floor(nVal) === nVal\n );\n };\n}\n\nexport class Story extends InkObject {\n public static inkVersionCurrent = 21;\n\n public inkVersionMinimumCompatible = 18;\n\n get currentChoices() {\n let choices: Choice[] = [];\n\n if (this._state === null) {\n return throwNullException(\"this._state\");\n }\n for (let c of this._state.currentChoices) {\n if (!c.isInvisibleDefault) {\n c.index = choices.length;\n choices.push(c);\n }\n }\n\n return choices;\n }\n\n get currentText() {\n this.IfAsyncWeCant(\"call currentText since it's a work in progress\");\n return this.state.currentText;\n }\n\n get currentTags() {\n this.IfAsyncWeCant(\"call currentTags since it's a work in progress\");\n return this.state.currentTags;\n }\n\n get currentErrors() {\n return this.state.currentErrors;\n }\n\n get currentWarnings() {\n return this.state.currentWarnings;\n }\n\n get currentFlowName() {\n return this.state.currentFlowName;\n }\n\n get currentFlowIsDefaultFlow() {\n return this.state.currentFlowIsDefaultFlow;\n }\n\n get aliveFlowNames() {\n return this.state.aliveFlowNames;\n }\n\n get hasError() {\n return this.state.hasError;\n }\n\n get hasWarning() {\n return this.state.hasWarning;\n }\n\n get variablesState() {\n return this.state.variablesState;\n }\n\n get listDefinitions() {\n return this._listDefinitions;\n }\n\n get state() {\n return this._state;\n }\n\n public onError: ErrorHandler | null = null;\n\n public onDidContinue: (() => void) | null = null;\n\n public onMakeChoice: ((arg1: Choice) => void) | null = null;\n\n public onEvaluateFunction: ((arg1: string, arg2: any[]) => void) | null =\n null;\n\n public onCompleteEvaluateFunction:\n | ((arg1: string, arg2: any[], arg3: string, arg4: any) => void)\n | null = null;\n\n public onChoosePathString: ((arg1: string, arg2: any[]) => void) | null =\n null;\n\n // TODO: Implement Profiler\n public StartProfiling() {\n /* */\n }\n public EndProfiling() {\n /* */\n }\n\n constructor(contentContainer: Container, lists: ListDefinition[] | null);\n constructor(jsonString: string);\n constructor(json: Record<string, any>);\n constructor() {\n super();\n\n // Discrimination between constructors\n let contentContainer: Container;\n let lists: ListDefinition[] | null = null;\n let json: Record<string, any> | null = null;\n\n if (arguments[0] instanceof Container) {\n contentContainer = arguments[0] as Container;\n\n if (typeof arguments[1] !== \"undefined\") {\n lists = arguments[1] as ListDefinition[];\n }\n\n // ------ Story (Container contentContainer, List<Runtime.ListDefinition> lists = null)\n this._mainContentContainer = contentContainer;\n // ------\n } else {\n if (typeof arguments[0] === \"string\") {\n let jsonString = arguments[0] as string;\n json = SimpleJson.TextToDictionary(jsonString);\n } else {\n json = arguments[0] as Record<string, any>;\n }\n }\n\n // ------ Story (Container contentContainer, List<Runtime.ListDefinition> lists = null)\n if (lists != null) this._listDefinitions = new ListDefinitionsOrigin(lists);\n\n this._externals = new Map();\n // ------\n\n // ------ Story(string jsonString) : this((Container)null)\n if (json !== null) {\n let rootObject: Record<string, any> = json;\n\n let versionObj = rootObject[\"inkVersion\"];\n if (versionObj == null)\n throw new Error(\n \"ink version number not found. Are you sure it's a valid .ink.json file?\"\n );\n\n let formatFromFile = parseInt(versionObj);\n if (formatFromFile > Story.inkVersionCurrent) {\n throw new Error(\n \"Version of ink used to build story was newer than the current version of the engine\"\n );\n } else if (formatFromFile < this.inkVersionMinimumCompatible) {\n throw new Error(\n \"Version of ink used to build story is too old to be loaded by this version of the engine\"\n );\n } else if (formatFromFile != Story.inkVersionCurrent) {\n console.warn(\n \"WARNING: Version of ink used to build story doesn't match current version of engine. Non-critical, but recommend synchronising.\"\n );\n }\n\n let rootToken = rootObject[\"root\"];\n if (rootToken == null)\n throw new Error(\n \"Root node for ink not found. Are you sure it's a valid .ink.json file?\"\n );\n\n let listDefsObj;\n if ((listDefsObj = rootObject[\"listDefs\"])) {\n this._listDefinitions =\n JsonSerialisation.JTokenToListDefinitions(listDefsObj);\n }\n\n this._mainContentContainer = asOrThrows(\n JsonSerialisation.JTokenToRuntimeObject(rootToken),\n Container\n );\n\n this.ResetState();\n }\n // ------\n }\n\n // Merge together `public string ToJson()` and `void ToJson(SimpleJson.Writer writer)`.\n // Will only return a value if writer was not provided.\n public ToJson(writer?: SimpleJson.Writer): string | void {\n let shouldReturn = false;\n\n if (!writer) {\n shouldReturn = true;\n writer = new SimpleJson.Writer();\n }\n\n writer.WriteObjectStart();\n\n writer.WriteIntProperty(\"inkVersion\", Story.inkVersionCurrent);\n\n writer.WriteProperty(\"root\", (w) =>\n JsonSerialisation.WriteRuntimeContainer(w, this._mainContentContainer)\n );\n\n if (this._listDefinitions != null) {\n writer.WritePropertyStart(\"listDefs\");\n writer.WriteObjectStart();\n\n for (let def of this._listDefinitions.lists) {\n writer.WritePropertyStart(def.name);\n writer.WriteObjectStart();\n\n for (let [key, value] of def.items) {\n let item = InkListItem.fromSerializedKey(key);\n let val = value;\n writer.WriteIntProperty(item.itemName, val);\n }\n\n writer.WriteObjectEnd();\n writer.WritePropertyEnd();\n }\n\n writer.WriteObjectEnd();\n writer.WritePropertyEnd();\n }\n\n writer.WriteObjectEnd();\n\n if (shouldReturn) return writer.toString();\n }\n\n public ResetState() {\n this.IfAsyncWeCant(\"ResetState\");\n\n this._state = new StoryState(this);\n this._state.variablesState.ObserveVariableChange(\n this.VariableStateDidChangeEvent.bind(this)\n );\n\n this.ResetGlobals();\n }\n\n public ResetErrors() {\n if (this._state === null) {\n return throwNullException(\"this._state\");\n }\n this._state.ResetErrors();\n }\n\n public ResetCallstack() {\n this.IfAsyncWeCant(\"ResetCallstack\");\n if (this._state === null) {\n return throwNullException(\"this._state\");\n }\n this._state.ForceEnd();\n }\n\n public ResetGlobals() {\n if (this._mainContentContainer.namedContent.get(\"global decl\")) {\n let originalPointer = this.state.currentPointer.copy();\n\n this.ChoosePath(new Path(\"global decl\"), false);\n\n this.ContinueInternal();\n\n this.state.currentPointer = originalPointer;\n }\n\n this.state.variablesState.SnapshotDefaultGlobals();\n }\n\n public SwitchFlow(flowName: string) {\n this.IfAsyncWeCant(\"switch flow\");\n if (this._asyncSaving) {\n throw new Error(\n \"Story is already in background saving mode, can't switch flow to \" +\n flowName\n );\n }\n\n this.state.SwitchFlow_Internal(flowName);\n }\n\n public RemoveFlow(flowName: string) {\n this.state.RemoveFlow_Internal(flowName);\n }\n\n public SwitchToDefaultFlow() {\n this.state.SwitchToDefaultFlow_Internal();\n }\n\n public Continue() {\n this.ContinueAsync(0);\n return this.currentText;\n }\n\n get canContinue() {\n return this.state.canContinue;\n }\n\n get asyncContinueComplete() {\n return !this._asyncContinueActive;\n }\n\n public ContinueAsync(millisecsLimitAsync: number) {\n if (!this._hasValidatedExternals) this.ValidateExternalBindings();\n\n this.ContinueInternal(millisecsLimitAsync);\n }\n\n public ContinueInternal(millisecsLimitAsync = 0) {\n if (this._profiler != null) this._profiler.PreContinue();\n\n let isAsyncTimeLimited = millisecsLimitAsync > 0;\n this._recursiveContinueCount++;\n\n if (!this._asyncContinueActive) {\n this._asyncContinueActive = isAsyncTimeLimited;\n\n if (!this.canContinue) {\n throw new Error(\n \"Can't continue - should check canContinue before calling Continue\"\n );\n }\n\n this._state.didSafeExit = false;\n this._state.ResetOutput();\n\n if (this._recursiveContinueCount == 1)\n this._state.variablesState.batchObservingVariableChanges = true;\n }\n\n let durationStopwatch = new Stopwatch();\n durationStopwatch.Start();\n\n let outputStreamEndsInNewline = false;\n this._sawLookaheadUnsafeFunctionAfterNewline = false;\n do {\n try {\n outputStreamEndsInNewline = this.ContinueSingleStep();\n } catch (e) {\n if (!(e instanceof StoryException)) throw e;\n\n this.AddError(e.message, undefined, e.useEndLineNumber);\n break;\n }\n\n if (outputStreamEndsInNewline) break;\n\n if (\n this._asyncContinueActive &&\n durationStopwatch.ElapsedMilliseconds > millisecsLimitAsync\n ) {\n break;\n }\n } while (this.canContinue);\n\n durationStopwatch.Stop();\n\n if (outputStreamEndsInNewline || !this.canContinue) {\n if (this._stateSnapshotAtLastNewline !== null) {\n this.RestoreStateSnapshot();\n }\n\n if (!this.canContinue) {\n if (this.state.callStack.canPopThread)\n this.AddError(\n \"Thread available to pop, threads should always be flat by the end of evaluation?\"\n );\n\n if (\n this.state.generatedChoices.length == 0 &&\n !this.state.didSafeExit &&\n this._temporaryEvaluationContainer == null\n ) {\n if (this.state.callStack.CanPop(PushPopType.Tunnel))\n this.AddError(\n \"unexpectedly reached end of content. Do you need a '->->' to return from a tunnel?\"\n );\n else if (this.state.callStack.CanPop(PushPopType.Function))\n this.AddError(\n \"unexpectedly reached end of content. Do you need a '~ return'?\"\n );\n else if (!this.state.callStack.canPop)\n this.AddError(\n \"ran out of content. Do you need a '-> DONE' or '-> END'?\"\n );\n else\n this.AddError(\n \"unexpectedly reached end of content for unknown reason. Please debug compiler!\"\n );\n }\n }\n\n this.state.didSafeExit = false;\n this._sawLookaheadUnsafeFunctionAfterNewline = false;\n\n if (this._recursiveContinueCount == 1)\n this._state.variablesState.batchObservingVariableChanges = false;\n\n this._asyncContinueActive = false;\n if (this.onDidContinue !== null) this.onDidContinue();\n }\n\n this._recursiveContinueCount--;\n\n if (this._profiler != null) this._profiler.PostContinue();\n\n // In the following code, we're masking a lot of non-null assertion,\n // because testing for against `hasError` or `hasWarning` makes sure\n // the arrays are present and contain at least one element.\n if (this.state.hasError || this.state.hasWarning) {\n if (this.onError !== null) {\n if (this.state.hasError) {\n for (let err of this.state.currentErrors!) {\n this.onError(err, ErrorType.Error);\n }\n }\n if (this.state.hasWarning) {\n for (let err of this.state.currentWarnings!) {\n this.onError(err, ErrorType.Warning);\n }\n }\n this.ResetErrors();\n } else {\n let sb = new StringBuilder();\n sb.Append(\"Ink had \");\n if (this.state.hasError) {\n sb.Append(`${this.state.currentErrors!.length}`);\n sb.Append(\n this.state.currentErrors!.length == 1 ? \" error\" : \"errors\"\n );\n if (this.state.hasWarning) sb.Append(\" and \");\n }\n if (this.state.hasWarning) {\n sb.Append(`${this.state.currentWarnings!.length}`);\n sb.Append(\n this.state.currentWarnings!.length == 1 ? \" warning\" : \"warnings\"\n );\n if (this.state.hasWarning) sb.Append(\" and \");\n }\n sb.Append(\n \". It is strongly suggested that you assign an error handler to story.onError. The first issue was: \"\n );\n sb.Append(\n this.state.hasError\n ? this.state.currentErrors![0]\n : this.state.currentWarnings![0]\n );\n\n throw new StoryException(sb.toString());\n }\n }\n }\n\n public ContinueSingleStep() {\n if (this._profiler != null) this._profiler.PreStep();\n\n this.Step();\n\n if (this._profiler != null) this._profiler.PostStep();\n\n if (!this.canContinue && !this.state.callStack.elementIsEvaluateFromGame) {\n this.TryFollowDefaultInvisibleChoice();\n }\n\n if (this._profiler != null) this._profiler.PreSnapshot();\n\n if (!this.state.inStringEvaluation) {\n if (this._stateSnapshotAtLastNewline !== null) {\n if (this._stateSnapshotAtLastNewline.currentTags === null) {\n return throwNullException(\"this._stateAtLastNewline.currentTags\");\n }\n if (this.state.currentTags === null) {\n return throwNullException(\"this.state.currentTags\");\n }\n\n let change = this.CalculateNewlineOutputStateChange(\n this._stateSnapshotAtLastNewline.currentText,\n this.state.currentText,\n this._stateSnapshotAtLastNewline.currentTags.length,\n this.state.currentTags.length\n );\n\n if (\n change == Story.OutputStateChange.ExtendedBeyondNewline ||\n this._sawLookaheadUnsafeFunctionAfterNewline\n ) {\n this.RestoreStateSnapshot();\n\n return true;\n } else if (change == Story.OutputStateChange.NewlineRemoved) {\n this.DiscardSnapshot();\n }\n }\n\n if (this.state.outputStreamEndsInNewline) {\n if (this.canContinue) {\n if (this._stateSnapshotAtLastNewline == null) this.StateSnapshot();\n } else {\n this.DiscardSnapshot();\n }\n }\n }\n\n if (this._profiler != null) this._profiler.PostSnapshot();\n\n return false;\n }\n\n public CalculateNewlineOutputStateChange(\n prevText: string | null,\n currText: string | null,\n prevTagCount: number,\n currTagCount: number\n ) {\n if (prevText === null) {\n return throwNullException(\"prevText\");\n }\n if (currText === null) {\n return throwNullException(\"currText\");\n }\n\n let newlineStillExists =\n currText.length >= prevText.length &&\n prevText.length > 0 &&\n currText.charAt(prevText.length - 1) == \"\\n\";\n if (\n prevTagCount == currTagCount &&\n prevText.length == currText.length &&\n newlineStillExists\n )\n return Story.OutputStateChange.NoChange;\n\n if (!newlineStillExists) {\n return Story.OutputStateChange.NewlineRemoved;\n }\n\n if (currTagCount > prevTagCount)\n return Story.OutputStateChange.ExtendedBeyondNewline;\n\n for (let i = prevText.length; i < currText.length; i++) {\n let c = currText.charAt(i);\n if (c != \" \" && c != \"\\t\") {\n return Story.OutputStateChange.ExtendedBeyondNewline;\n }\n }\n\n return Story.OutputStateChange.NoChange;\n }\n\n public ContinueMaximally() {\n this.IfAsyncWeCant(\"ContinueMaximally\");\n\n let sb = new StringBuilder();\n\n while (this.canContinue) {\n sb.Append(this.Continue());\n }\n\n return sb.toString();\n }\n\n public ContentAtPath(path: Path) {\n return this.mainContentContainer.ContentAtPath(path);\n }\n\n public KnotContainerWithName(name: string) {\n let namedContainer = this.mainContentContainer.namedContent.get(name);\n if (namedContainer instanceof Container) return namedContainer;\n else return null;\n }\n\n public PointerAtPath(path: Path) {\n if (path.length == 0) return Pointer.Null;\n\n let p = new Pointer();\n\n let pathLengthToUse = path.length;\n\n let result = null;\n if (path.lastComponent === null) {\n return throwNullException(\"path.lastComponent\");\n }\n\n if (path.lastComponent.isIndex) {\n pathLengthToUse = path.length - 1;\n result = this.mainContentContainer.ContentAtPath(\n path,\n undefined,\n pathLengthToUse\n );\n p.container = result.container;\n p.index = path.lastComponent.index;\n } else {\n result = this.mainContentContainer.ContentAtPath(path);\n p.container = result.container;\n p.index = -1;\n }\n\n if (\n result.obj == null ||\n (result.obj == this.mainContentContainer && pathLengthToUse > 0)\n ) {\n this.Error(\n \"Failed to find content at path '\" +\n path +\n \"', and no approximation of it was possible.\"\n );\n } else if (result.approximate)\n this.Warning(\n \"Failed to find content at path '\" +\n path +\n \"', so it was approximated to: '\" +\n result.obj.path +\n \"'.\"\n );\n\n return p;\n }\n\n public StateSnapshot() {\n this._stateSnapshotAtLastNewline = this._state;\n this._state = this._state.CopyAndStartPatching();\n }\n\n public RestoreStateSnapshot() {\n if (this._stateSnapshotAtLastNewline === null) {\n throwNullException(\"_stateSnapshotAtLastNewline\");\n }\n this._stateSnapshotAtLastNewline.RestoreAfterPatch();\n\n this._state = this._stateSnapshotAtLastNewline;\n this._stateSnapshotAtLastNewline = null;\n\n if (!this._asyncSaving) {\n this._state.ApplyAnyPatch();\n }\n }\n\n public DiscardSnapshot() {\n if (!this._asyncSaving) this._state.ApplyAnyPatch();\n\n this._stateSnapshotAtLastNewline = null;\n }\n\n public CopyStateForBackgroundThreadSave() {\n this.IfAsyncWeCant(\"start saving on a background thread\");\n\n if (this._asyncSaving)\n throw new Error(\n \"Story is already in background saving mode, can't call CopyStateForBackgroundThreadSave again!\"\n );\n\n let stateToSave = this._state;\n this._state = this._state.CopyAndStartPatching();\n this._asyncSaving = true;\n return stateToSave;\n }\n\n public BackgroundSaveComplete() {\n if (this._stateSnapshotAtLastNewline === null) {\n this._state.ApplyAnyPatch();\n }\n\n this._asyncSaving = false;\n }\n\n public Step() {\n let shouldAddToStream = true;\n\n let pointer = this.state.currentPointer.copy();\n if (pointer.isNull) {\n return;\n }\n\n // Container containerToEnter = pointer.Resolve () as Container;\n let containerToEnter = asOrNull(pointer.Resolve(), Container);\n\n while (containerToEnter) {\n this.VisitContainer(containerToEnter, true);\n\n // No content? the most we can do is step past it\n if (containerToEnter.content.length == 0) {\n break;\n }\n\n pointer = Pointer.StartOf(containerToEnter);\n // containerToEnter = pointer.Resolve() as Container;\n containerToEnter = asOrNull(pointer.Resolve(), Container);\n }\n\n this.state.currentPointer = pointer.copy();\n\n if (this._profiler != null) this._profiler.Step(this.state.callStack);\n\n // Is the current content object:\n // - Normal content\n // - Or a logic/flow statement - if so, do it\n // Stop flow if we hit a stack pop when we're unable to pop (e.g. return/done statement in knot\n // that was diverted to rather than called as a function)\n let currentContentObj = pointer.Resolve();\n let isLogicOrFlowControl =\n this.PerformLogicAndFlowControl(currentContentObj);\n\n // Has flow been forced to end by flow control above?\n if (this.state.currentPointer.isNull) {\n return;\n }\n\n if (isLogicOrFlowControl) {\n shouldAddToStream = false;\n }\n\n // Choice with condition?\n // var choicePoint = currentContentObj as ChoicePoint;\n let choicePoint = asOrNull(currentContentObj, ChoicePoint);\n if (choicePoint) {\n let choice = this.ProcessChoice(choicePoint);\n if (choice) {\n this.state.generatedChoices.push(choice);\n }\n\n currentContentObj = null;\n shouldAddToStream = false;\n }\n\n // If the container has no content, then it will be\n // the \"content\" itself, but we skip over it.\n if (currentContentObj instanceof Container) {\n shouldAddToStream = false;\n }\n\n // Content to add to evaluation stack or the output stream\n if (shouldAddToStream) {\n // If we're pushing a variable pointer onto the evaluation stack, ensure that it's specific\n // to our current (possibly temporary) context index. And make a copy of the pointer\n // so that we're not editing the original runtime object.\n // var varPointer = currentContentObj as VariablePointerValue;\n let varPointer = asOrNull(currentContentObj, VariablePointerValue);\n if (varPointer && varPointer.contextIndex == -1) {\n // Create new object so we're not overwriting the story's own data\n let contextIdx = this.state.callStack.ContextForVariableNamed(\n varPointer.variableName\n );\n currentContentObj = new VariablePointerValue(\n varPointer.variableName,\n contextIdx\n );\n }\n\n // Expression evaluation content\n if (this.state.inExpressionEvaluation) {\n this.state.PushEvaluationStack(currentContentObj);\n }\n // Output stream content (i.e. not expression evaluation)\n else {\n this.state.PushToOutputStream(currentContentObj);\n }\n }\n\n // Increment the content pointer, following diverts if necessary\n this.NextContent();\n\n // Starting a thread should be done after the increment to the content pointer,\n // so that when returning from the thread, it returns to the content after this instruction.\n // var controlCmd = currentContentObj as ;\n let controlCmd = asOrNull(currentContentObj, ControlCommand);\n if (\n controlCmd &&\n controlCmd.commandType == ControlCommand.CommandType.StartThread\n ) {\n this.state.callStack.PushThread();\n }\n }\n\n public VisitContainer(container: Container, atStart: boolean) {\n if (!container.countingAtStartOnly || atStart) {\n if (container.visitsShouldBeCounted)\n this.state.IncrementVisitCountForContainer(container);\n\n if (container.turnIndexShouldBeCounted)\n this.state.RecordTurnIndexVisitToContainer(container);\n }\n }\n\n private _prevContainers: Container[] = [];\n public VisitChangedContainersDueToDivert() {\n let previousPointer = this.state.previousPointer.copy();\n let pointer = this.state.currentPointer.copy();\n\n if (pointer.isNull || pointer.index == -1) return;\n\n this._prevContainers.length = 0;\n if (!previousPointer.isNull) {\n // Container prevAncestor = previousPointer.Resolve() as Container ?? previousPointer.container as Container;\n let resolvedPreviousAncestor = previousPointer.Resolve();\n let prevAncestor =\n asOrNull(resolvedPreviousAncestor, Container) ||\n asOrNull(previousPointer.container, Container);\n while (prevAncestor) {\n this._prevContainers.push(prevAncestor);\n // prevAncestor = prevAncestor.parent as Container;\n prevAncestor = asOrNull(prevAncestor.parent, Container);\n }\n }\n\n let currentChildOfContainer = pointer.Resolve();\n\n if (currentChildOfContainer == null) return;\n\n // Container currentContainerAncestor = currentChildOfContainer.parent as Container;\n let currentContainerAncestor = asOrNull(\n currentChildOfContainer.parent,\n Container\n );\n let allChildrenEnteredAtStart = true;\n while (\n currentContainerAncestor &&\n (this._prevContainers.indexOf(currentContainerAncestor) < 0 ||\n currentContainerAncestor.countingAtStartOnly)\n ) {\n // Check whether this ancestor container is being entered at the start,\n // by checking whether the child object is the first.\n let enteringAtStart =\n currentContainerAncestor.content.length > 0 &&\n currentChildOfContainer == currentContainerAncestor.content[0] &&\n allChildrenEnteredAtStart;\n\n if (!enteringAtStart) allChildrenEnteredAtStart = false;\n\n // Mark a visit to this container\n this.VisitContainer(currentContainerAncestor, enteringAtStart);\n\n currentChildOfContainer = currentContainerAncestor;\n // currentContainerAncestor = currentContainerAncestor.parent as Container;\n currentContainerAncestor = asOrNull(\n currentContainerAncestor.parent,\n Container\n );\n }\n }\n\n public PopChoiceStringAndTags(tags: string[]) {\n let choiceOnlyStrVal = asOrThrows(\n this.state.PopEvaluationStack(),\n StringValue\n );\n\n while (\n this.state.evaluationStack.length > 0 &&\n asOrNull(this.state.PeekEvaluationStack(), Tag) != null\n ) {\n let tag = asOrNull(this.state.PopEvaluationStack(), Tag);\n if (tag) tags.push(tag.text);\n }\n return choiceOnlyStrVal.value;\n }\n\n public ProcessChoice(choicePoint: ChoicePoint) {\n let showChoice = true;\n\n // Don't create choice if choice point doesn't pass conditional\n if (choicePoint.hasCondition) {\n let conditionValue = this.state.PopEvaluationStack();\n if (!this.IsTruthy(conditionValue)) {\n showChoice = false;\n }\n }\n\n let startText = \"\";\n let choiceOnlyText = \"\";\n let tags: string[] = [];\n\n if (choicePoint.hasChoiceOnlyContent) {\n choiceOnlyText = this.PopChoiceStringAndTags(tags) || \"\";\n }\n\n if (choicePoint.hasStartContent) {\n startText = this.PopChoiceStringAndTags(tags) || \"\";\n }\n\n // Don't create choice if player has already read this content\n if (choicePoint.onceOnly) {\n let visitCount = this.state.VisitCountForContainer(\n choicePoint.choiceTarget\n );\n if (visitCount > 0) {\n showChoice = false;\n }\n }\n\n // We go through the full process of creating the choice above so\n // that we consume the content for it, since otherwise it'll\n // be shown on the output stream.\n if (!showChoice) {\n return null;\n }\n\n let choice = new Choice();\n choice.targetPath = choicePoint.pathOnChoice;\n choice.sourcePath = choicePoint.path.toString();\n choice.isInvisibleDefault = choicePoint.isInvisibleDefault;\n choice.threadAtGeneration = this.state.callStack.ForkThread();\n choice.tags = tags.reverse(); //C# is a stack\n choice.text = (startText + choiceOnlyText).replace(/^[ \\t]+|[ \\t]+$/g, \"\");\n\n return choice;\n }\n\n public IsTruthy(obj: InkObject) {\n let truthy = false;\n if (obj instanceof Value) {\n let val = obj;\n\n if (val instanceof DivertTargetValue) {\n let divTarget = val;\n this.Error(\n \"Shouldn't use a divert target (to \" +\n divTarget.targetPath +\n \") as a conditional value. Did you intend a function call 'likeThis()' or a read count check 'likeThis'? (no arrows)\"\n );\n return false;\n }\n\n return val.isTruthy;\n }\n return truthy;\n }\n\n public PerformLogicAndFlowControl(contentObj: InkObject | null) {\n if (contentObj == null) {\n return false;\n }\n\n // Divert\n if (contentObj instanceof Divert) {\n let currentDivert = contentObj;\n\n if (currentDivert.isConditional) {\n let conditionValue = this.state.PopEvaluationStack();\n\n // False conditional? Cancel divert\n if (!this.IsTruthy(conditionValue)) return true;\n }\n\n if (currentDivert.hasVariableTarget) {\n let varName = currentDivert.variableDivertName;\n\n let varContents =\n this.state.variablesState.GetVariableWithName(varName);\n\n if (varContents == null) {\n this.Error(\n \"Tried to divert using a target from a variable that could not be found (\" +\n varName +\n \")\"\n );\n } else if (!(varContents instanceof DivertTargetValue)) {\n // var intContent = varContents as IntValue;\n let intContent = asOrNull(varContents, IntValue);\n\n let errorMessage =\n \"Tried to divert to a target from a variable, but the variable (\" +\n varName +\n \") didn't contain a divert target, it \";\n if (intContent instanceof IntValue && intContent.value == 0) {\n errorMessage += \"was empty/null (the value 0).\";\n } else {\n errorMessage += \"contained '\" + varContents + \"'.\";\n }\n\n this.Error(errorMessage);\n }\n\n let target = asOrThrows(varContents, DivertTargetValue);\n this.state.divertedPointer = this.PointerAtPath(target.targetPath);\n } else if (currentDivert.isExternal) {\n this.CallExternalFunction(\n currentDivert.targetPathString,\n currentDivert.externalArgs\n );\n return true;\n } else {\n this.state.divertedPointer = currentDivert.targetPointer.copy();\n }\n\n if (currentDivert.pushesToStack) {\n this.state.callStack.Push(\n currentDivert.stackPushType,\n undefined,\n this.state.outputStream.length\n );\n }\n\n if (this.state.divertedPointer.isNull && !currentDivert.isExternal) {\n if (\n currentDivert &&\n currentDivert.debugMetadata &&\n currentDivert.debugMetadata.sourceName != null\n ) {\n this.Error(\n \"Divert target doesn't exist: \" +\n currentDivert.debugMetadata.sourceName\n );\n } else {\n this.Error(\"Divert resolution failed: \" + currentDivert);\n }\n }\n\n return true;\n }\n\n // Start/end an expression evaluation? Or print out the result?\n else if (contentObj instanceof ControlCommand) {\n let evalCommand = contentObj;\n\n switch (evalCommand.commandType) {\n case ControlCommand.CommandType.EvalStart:\n this.Assert(\n this.state.inExpressionEvaluation === false,\n \"Already in expression evaluation?\"\n );\n this.state.inExpressionEvaluation = true;\n break;\n\n case ControlCommand.CommandType.EvalEnd:\n this.Assert(\n this.state.inExpressionEvaluation === true,\n \"Not in expression evaluation mode\"\n );\n this.state.inExpressionEvaluation = false;\n break;\n\n case ControlCommand.CommandType.EvalOutput:\n // If the expression turned out to be empty, there may not be anything on the stack\n if (this.state.evaluationStack.length > 0) {\n let output = this.state.PopEvaluationStack();\n\n // Functions may evaluate to Void, in which case we skip output\n if (!(output instanceof Void)) {\n // TODO: Should we really always blanket convert to string?\n // It would be okay to have numbers in the output stream the\n // only problem is when exporting text for viewing, it skips over numbers etc.\n let text = new StringValue(output.toString());\n\n this.state.PushToOutputStream(text);\n }\n }\n break;\n\n case ControlCommand.CommandType.NoOp:\n break;\n\n case ControlCommand.CommandType.Duplicate:\n this.state.PushEvaluationStack(this.state.PeekEvaluationStack());\n break;\n\n case ControlCommand.CommandType.PopEvaluatedValue:\n this.state.PopEvaluationStack();\n break;\n\n case ControlCommand.CommandType.PopFunction:\n case ControlCommand.CommandType.PopTunnel:\n let popType =\n evalCommand.commandType == ControlCommand.CommandType.PopFunction\n ? PushPopType.Function\n : PushPopType.Tunnel;\n\n let overrideTunnelReturnTarget: DivertTargetValue | null = null;\n if (popType == PushPopType.Tunnel) {\n let popped = this.state.PopEvaluationStack();\n // overrideTunnelReturnTarget = popped as DivertTargetValue;\n overrideTunnelReturnTarget = asOrNull(popped, DivertTargetValue);\n if (overrideTunnelReturnTarget === null) {\n this.Assert(\n popped instanceof Void,\n \"Expected void if ->-> doesn't override target\"\n );\n }\n }\n\n if (this.state.TryExitFunctionEvaluationFromGame()) {\n break;\n } else if (\n this.state.callStack.currentElement.type != popType ||\n !this.state.callStack.canPop\n ) {\n let names: Map<PushPopType, string> = new Map();\n names.set(\n PushPopType.Function,\n \"function return statement (~ return)\"\n );\n names.set(PushPopType.Tunnel, \"tunnel onwards statement (->->)\");\n\n let expected = names.get(this.state.callStack.currentElement.type);\n if (!this.state.callStack.canPop) {\n expected = \"end of flow (-> END or choice)\";\n }\n\n let errorMsg =\n \"Found \" + names.get(popType) + \", when expected \" + expected;\n\n this.Error(errorMsg);\n } else {\n this.state.PopCallStack();\n\n if (overrideTunnelReturnTarget)\n this.state.divertedPointer = this.PointerAtPath(\n overrideTunnelReturnTarget.targetPath\n );\n }\n break;\n\n case ControlCommand.CommandType.BeginString:\n this.state.PushToOutputStream(evalCommand);\n\n this.Assert(\n this.state.inExpressionEvaluation === true,\n \"Expected to be in an expression when evaluating a string\"\n );\n this.state.inExpressionEvaluation = false;\n break;\n\n // Leave it to story.currentText and story.currentTags to sort out the text from the tags\n // This is mostly because we can't always rely on the existence of EndTag, and we don't want\n // to try and flatten dynamic tags to strings every time \\n is pushed to output\n case ControlCommand.CommandType.BeginTag:\n this.state.PushToOutputStream(evalCommand);\n break;\n\n // EndTag has 2 modes:\n // - When in string evaluation (for choices)\n // - Normal\n //\n // The only way you could have an EndTag in the middle of\n // string evaluation is if we're currently generating text for a\n // choice, such as:\n //\n // + choice # tag\n //\n // In the above case, the ink will be run twice:\n // - First, to generate the choice text. String evaluation\n // will be on, and the final string will be pushed to the\n // evaluation stack, ready to be popped to make a Choice\n // object.\n // - Second, when ink generates text after choosing the choice.\n // On this ocassion, it's not in string evaluation mode.\n //\n // On the writing side, we disallow manually putting tags within\n // strings like this:\n //\n // {\"hello # world\"}\n //\n // So we know that the tag must be being generated as part of\n // choice content. Therefore, when the tag has been generated,\n // we push it onto the evaluation stack in the exact same way\n // as the string for the choice content.\n case ControlCommand.CommandType.EndTag: {\n if (this.state.inStringEvaluation) {\n let contentStackForTag: InkObject[] = [];\n let outputCountConsumed = 0;\n for (let i = this.state.outputStream.length - 1; i >= 0; --i) {\n let obj = this.state.outputStream[i];\n outputCountConsumed++;\n\n // var command = obj as ControlCommand;\n let command = asOrNull(obj, ControlCommand);\n if (command != null) {\n if (\n command.commandType == ControlCommand.CommandType.BeginTag\n ) {\n break;\n } else {\n this.Error(\n \"Unexpected ControlCommand while extracting tag from choice\"\n );\n break;\n }\n }\n if (obj instanceof StringValue) {\n contentStackForTag.push(obj);\n }\n }\n\n // Consume the content that was produced for this string\n this.state.PopFromOutputStream(outputCountConsumed);\n // Build string out of the content we collected\n let sb = new StringBuilder();\n for (let strVal of contentStackForTag) {\n sb.Append(strVal.toString());\n }\n let choiceTag = new Tag(\n this.state.CleanOutputWhitespace(sb.toString())\n );\n // Pushing to the evaluation stack means it gets picked up\n // when a Choice is generated from the next Choice Point.\n this.state.PushEvaluationStack(choiceTag);\n } else {\n // Otherwise! Simply push EndTag, so that in the output stream we\n // have a structure of: [BeginTag, \"the tag content\", EndTag]\n this.state.PushToOutputStream(evalCommand);\n }\n break;\n }\n\n case ControlCommand.CommandType.EndString: {\n let contentStackForString: InkObject[] = [];\n let contentToRetain: InkObject[] = [];\n\n let outputCountConsumed = 0;\n for (let i = this.state.outputStream.length - 1; i >= 0; --i) {\n let obj = this.state.outputStream[i];\n\n outputCountConsumed++;\n\n // var command = obj as ControlCommand;\n let command = asOrNull(obj, ControlCommand);\n if (\n command &&\n command.commandType == ControlCommand.CommandType.BeginString\n ) {\n break;\n }\n if (obj instanceof Tag) {\n contentToRetain.push(obj);\n }\n if (obj instanceof StringValue) {\n contentStackForString.push(obj);\n }\n }\n\n // Consume the content that was produced for this string\n this.state.PopFromOutputStream(outputCountConsumed);\n\n // Rescue the tags that we want actually to keep on the output stack\n // rather than consume as part of the string we're building.\n // At the time of writing, this only applies to Tag objects generated\n // by choices, which are pushed to the stack during string generation.\n for (let rescuedTag of contentToRetain)\n this.state.PushToOutputStream(rescuedTag);\n\n // The C# version uses a Stack for contentStackForString, but we're\n // using a simple array, so we need to reverse it before using it\n contentStackForString = contentStackForString.reverse();\n\n // Build string out of the content we collected\n let sb = new StringBuilder();\n for (let c of contentStackForString) {\n sb.Append(c.toString());\n }\n\n // Return to expression evaluation (from content mode)\n this.state.inExpressionEvaluation = true;\n this.state.PushEvaluationStack(new StringValue(sb.toString()));\n break;\n }\n\n case ControlCommand.CommandType.ChoiceCount:\n let choiceCount = this.state.generatedChoices.length;\n this.state.PushEvaluationStack(new IntValue(choiceCount));\n break;\n\n case ControlCommand.CommandType.Turns:\n this.state.PushEvaluationStack(\n new IntValue(this.state.currentTurnIndex + 1)\n );\n break;\n\n case ControlCommand.CommandType.TurnsSince:\n case ControlCommand.CommandType.ReadCount:\n let target = this.state.PopEvaluationStack();\n if (!(target instanceof DivertTargetValue)) {\n let extraNote = \"\";\n if (target instanceof IntValue)\n extraNote =\n \". Did you accidentally pass a read count ('knot_name') instead of a target ('-> knot_name')?\";\n this.Error(\n \"TURNS_SINCE / READ_COUNT expected a divert target (knot, stitch, label name), but saw \" +\n target +\n extraNote\n );\n break;\n }\n\n // var divertTarget = target as DivertTargetValue;\n let divertTarget = asOrThrows(target, DivertTargetValue);\n // var container = ContentAtPath (divertTarget.targetPath).correctObj as Container;\n let container = asOrNull(\n this.ContentAtPath(divertTarget.targetPath).correctObj,\n Container\n );\n\n let eitherCount;\n if (container != null) {\n if (\n evalCommand.commandType == ControlCommand.CommandType.TurnsSince\n )\n eitherCount = this.state.TurnsSinceForContainer(container);\n else eitherCount = this.state.VisitCountForContainer(container);\n } else {\n if (\n evalCommand.commandType == ControlCommand.CommandType.TurnsSince\n )\n eitherCount = -1;\n else eitherCount = 0;\n\n this.Warning(\n \"Failed to find container for \" +\n evalCommand.toString() +\n \" lookup at \" +\n divertTarget.targetPath.toString()\n );\n }\n\n this.state.PushEvaluationStack(new IntValue(eitherCount));\n break;\n\n case ControlCommand.CommandType.Random: {\n let maxInt = asOrNull(this.state.PopEvaluationStack(), IntValue);\n let minInt = asOrNull(this.state.PopEvaluationStack(), IntValue);\n\n if (minInt == null || minInt instanceof IntValue === false)\n return this.Error(\n \"Invalid value for minimum parameter of RANDOM(min, max)\"\n );\n\n if (maxInt == null || minInt instanceof IntValue === false)\n return this.Error(\n \"Invalid value for maximum parameter of RANDOM(min, max)\"\n );\n\n // Originally a primitive type, but here, can be null.\n // TODO: Replace by default value?\n if (maxInt.value === null) {\n return throwNullException(\"maxInt.value\");\n }\n if (minInt.value === null) {\n return throwNullException(\"minInt.value\");\n }\n\n // This code is differs a bit from the reference implementation, since\n // JavaScript has no true integers. Hence integer arithmetics and\n // interger overflows don't apply here. A loss of precision can\n // happen with big numbers however.\n //\n // The case where 'randomRange' is lower than zero is handled below,\n // so there's no need to test against Number.MIN_SAFE_INTEGER.\n let randomRange = maxInt.value - minInt.value + 1;\n if (!isFinite(randomRange) || randomRange > Number.MAX_SAFE_INTEGER) {\n randomRange = Number.MAX_SAFE_INTEGER;\n this.Error(\n \"RANDOM was called with a range that exceeds the size that ink numbers can use.\"\n );\n }\n if (randomRange <= 0)\n this.Error(\n \"RANDOM was called with minimum as \" +\n minInt.value +\n \" and maximum as \" +\n maxInt.value +\n \". The maximum must be larger\"\n );\n\n let resultSeed = this.state.storySeed + this.state.previousRandom;\n let random = new PRNG(resultSeed);\n\n let nextRandom = random.next();\n let chosenValue = (nextRandom % randomRange) + minInt.value;\n this.state.PushEvaluationStack(new IntValue(chosenValue));\n\n // Next random number (rather than keeping the Random object around)\n this.state.previousRandom = nextRandom;\n break;\n }\n\n case ControlCommand.CommandType.SeedRandom:\n let seed = asOrNull(this.state.PopEvaluationStack(), IntValue);\n if (seed == null || seed instanceof IntValue === false)\n return this.Error(\"Invalid value passed to SEED_RANDOM\");\n\n // Originally a primitive type, but here, can be null.\n // TODO: Replace by default value?\n if (seed.value === null) {\n return throwNullException(\"minInt.value\");\n }\n\n this.state.storySeed = seed.value;\n this.state.previousRandom = 0;\n\n this.state.PushEvaluationStack(new Void());\n break;\n\n case ControlCommand.CommandType.VisitIndex:\n let count =\n this.state.VisitCountForContainer(\n this.state.currentPointer.container\n ) - 1; // index not count\n this.state.PushEvaluationStack(new IntValue(count));\n break;\n\n case ControlCommand.CommandType.SequenceShuffleIndex:\n let shuffleIndex = this.NextSequenceShuffleIndex();\n this.state.PushEvaluationStack(new IntValue(shuffleIndex));\n break;\n\n case ControlCommand.CommandType.StartThread:\n // Handled in main step function\n break;\n\n case ControlCommand.CommandType.Done:\n // We may exist in the context of the initial\n // act of creating the thread, or in the context of\n // evaluating the content.\n if (this.state.callStack.canPopThread) {\n this.state.callStack.PopThread();\n }\n\n // In normal flow - allow safe exit without warning\n else {\n this.state.didSafeExit = true;\n\n // Stop flow in current thread\n this.state.currentPointer = Pointer.Null;\n }\n\n break;\n\n // Force flow to end completely\n case ControlCommand.CommandType.End:\n this.state.ForceEnd();\n break;\n\n case ControlCommand.CommandType.ListFromInt:\n // var intVal = state.PopEvaluationStack () as IntValue;\n let intVal = asOrNull(this.state.PopEvaluationStack(), IntValue);\n // var listNameVal = state.PopEvaluationStack () as StringValue;\n let listNameVal = asOrThrows(\n this.state.PopEvaluationStack(),\n StringValue\n );\n\n if (intVal === null) {\n throw new StoryException(\n \"Passed non-integer when creating a list element from a numerical value.\"\n );\n }\n\n let generatedListValue = null;\n\n if (this.listDefinitions === null) {\n return throwNullException(\"this.listDefinitions\");\n }\n let foundListDef = this.listDefinitions.TryListGetDefinition(\n listNameVal.value,\n null\n );\n if (foundListDef.exists) {\n // Originally a primitive type, but here, can be null.\n // TODO: Replace by default value?\n if (intVal.value === null) {\n return throwNullException(\"minInt.value\");\n }\n\n let foundItem = foundListDef.result!.TryGetItemWithValue(\n intVal.value,\n InkListItem.Null\n );\n if (foundItem.exists) {\n generatedListValue = new ListValue(\n foundItem.result!,\n intVal.value\n );\n }\n } else {\n throw new StoryException(\n \"Failed to find LIST called \" + listNameVal.value\n );\n }\n\n if (generatedListValue == null) generatedListValue = new ListValue();\n\n this.state.PushEvaluationStack(generatedListValue);\n break;\n\n case ControlCommand.CommandType.ListRange:\n let max = asOrNull(this.state.PopEvaluationStack(), Value);\n let min = asOrNull(this.state.PopEvaluationStack(), Value);\n\n // var targetList = state.PopEvaluationStack () as ListValue;\n let targetList = asOrNull(this.state.PopEvaluationStack(), ListValue);\n\n if (targetList === null || min === null || max === null)\n throw new StoryException(\n \"Expected list, minimum and maximum for LIST_RANGE\"\n );\n\n if (targetList.value === null) {\n return throwNullException(\"targetList.value\");\n }\n let result = targetList.value.ListWithSubRange(\n min.valueObject,\n max.valueObject\n );\n\n this.state.PushEvaluationStack(new ListValue(result));\n break;\n\n case ControlCommand.CommandType.ListRandom: {\n let listVal = this.state.PopEvaluationStack() as ListValue;\n if (listVal === null)\n throw new StoryException(\"Expected list for LIST_RANDOM\");\n\n let list = listVal.value;\n\n let newList: InkList | null = null;\n\n if (list === null) {\n throw throwNullException(\"list\");\n }\n if (list.Count == 0) {\n newList = new InkList();\n } else {\n // Generate a random index for the element to take\n let resultSeed = this.state.storySeed + this.state.previousRandom;\n let random = new PRNG(resultSeed);\n\n let nextRandom = random.next();\n let listItemIndex = nextRandom % list.Count;\n\n // This bit is a little different from the original\n // C# code, since iterators do not work in the same way.\n // First, we iterate listItemIndex - 1 times, calling next().\n // The listItemIndex-th time is made outside of the loop,\n // in order to retrieve the value.\n let listEnumerator = list.entries();\n for (let i = 0; i <= listItemIndex - 1; i++) {\n listEnumerator.next();\n }\n let value = listEnumerator.next().value;\n let randomItem: KeyValuePair<InkListItem, number> = {\n Key: InkListItem.fromSerializedKey(value[0]),\n Value: value[1],\n };\n\n // Origin list is simply the origin of the one element\n if (randomItem.Key.originName === null) {\n return throwNullException(\"randomItem.Key.originName\");\n }\n newList = new InkList(randomItem.Key.originName, this);\n newList.Add(randomItem.Key, randomItem.Value);\n\n this.state.previousRandom = nextRandom;\n }\n\n this.state.PushEvaluationStack(new ListValue(newList));\n break;\n }\n\n default:\n this.Error(\"unhandled ControlCommand: \" + evalCommand);\n break;\n }\n\n return true;\n }\n\n // Variable assignment\n else if (contentObj instanceof VariableAssignment) {\n let varAss = contentObj;\n let assignedVal = this.state.PopEvaluationStack();\n\n this.state.variablesState.Assign(varAss, assignedVal);\n\n return true;\n }\n\n // Variable reference\n else if (contentObj instanceof VariableReference) {\n let varRef = contentObj;\n let foundValue = null;\n\n // Explicit read count value\n if (varRef.pathForCount != null) {\n let container = varRef.containerForCount;\n let count = this.state.VisitCountForContainer(container);\n foundValue = new IntValue(count);\n }\n\n // Normal variable reference\n else {\n foundValue = this.state.variablesState.GetVariableWithName(varRef.name);\n\n if (foundValue == null) {\n this.Warning(\n \"Variable not found: '\" +\n varRef.name +\n \"'. Using default value of 0 (false). This can happen with temporary variables if the declaration hasn't yet been hit. Globals are always given a default value on load if a value doesn't exist in the save state.\"\n );\n foundValue = new IntValue(0);\n }\n }\n\n this.state.PushEvaluationStack(foundValue);\n\n return true;\n }\n\n // Native function call\n else if (contentObj instanceof NativeFunctionCall) {\n let func = contentObj;\n let funcParams = this.state.PopEvaluationStack(func.numberOfParameters);\n let result = func.Call(funcParams);\n this.state.PushEvaluationStack(result);\n return true;\n }\n\n // No control content, must be ordinary content\n return false;\n }\n\n public ChoosePathString(\n path: string,\n resetCallstack = true,\n args: any[] = []\n ) {\n this.IfAsyncWeCant(\"call ChoosePathString right now\");\n if (this.onChoosePathString !== null) this.onChoosePathString(path, args);\n\n if (resetCallstack) {\n this.ResetCallstack();\n } else {\n if (this.state.callStack.currentElement.type == PushPopType.Function) {\n let funcDetail = \"\";\n let container =\n this.state.callStack.currentElement.currentPointer.container;\n if (container != null) {\n funcDetail = \"(\" + container.path.toString() + \") \";\n }\n throw new Error(\n \"Story was running a function \" +\n funcDetail +\n \"when you called ChoosePathString(\" +\n path +\n \") - this is almost certainly not not what you want! Full stack trace: \\n\" +\n this.state.callStack.callStackTrace\n );\n }\n }\n\n this.state.PassArgumentsToEvaluationStack(args);\n this.ChoosePath(new Path(path));\n }\n\n public IfAsyncWeCant(activityStr: string) {\n if (this._asyncContinueActive)\n throw new Error(\n \"Can't \" +\n activityStr +\n \". Story is in the middle of a ContinueAsync(). Make more ContinueAsync() calls or a single Continue() call beforehand.\"\n );\n }\n\n public ChoosePath(p: Path, incrementingTurnIndex: boolean = true) {\n this.state.SetChosenPath(p, incrementingTurnIndex);\n\n // Take a note of newly visited containers for read counts etc\n this.VisitChangedContainersDueToDivert();\n }\n\n public ChooseChoiceIndex(choiceIdx: number) {\n choiceIdx = choiceIdx;\n let choices = this.currentChoices;\n this.Assert(\n choiceIdx >= 0 && choiceIdx < choices.length,\n \"choice out of range\"\n );\n\n let choiceToChoose = choices[choiceIdx];\n if (this.onMakeChoice !== null) this.onMakeChoice(choiceToChoose);\n\n if (choiceToChoose.threadAtGeneration === null) {\n return throwNullException(\"choiceToChoose.threadAtGeneration\");\n }\n if (choiceToChoose.targetPath === null) {\n return throwNullException(\"choiceToChoose.targetPath\");\n }\n\n this.state.callStack.currentThread = choiceToChoose.threadAtGeneration;\n\n this.ChoosePath(choiceToChoose.targetPath);\n }\n\n public HasFunction(functionName: string) {\n try {\n return this.KnotContainerWithName(functionName) != null;\n } catch (e) {\n return false;\n }\n }\n\n public EvaluateFunction(\n functionName: string,\n args: any[] = [],\n returnTextOutput: boolean = false\n ): Story.EvaluateFunctionTextOutput | any {\n // EvaluateFunction behaves slightly differently than the C# version.\n // In C#, you can pass a (second) parameter `out textOutput` to get the\n // text outputted by the function. This is not possible in js. Instead,\n // we maintain the regular signature (functionName, args), plus an\n // optional third parameter returnTextOutput. If set to true, we will\n // return both the textOutput and the returned value, as an object.\n\n if (this.onEvaluateFunction !== null)\n this.onEvaluateFunction(functionName, args);\n\n this.IfAsyncWeCant(\"evaluate a function\");\n\n if (functionName == null) {\n throw new Error(\"Function is null\");\n } else if (functionName == \"\" || functionName.trim() == \"\") {\n throw new Error(\"Function is empty or white space.\");\n }\n\n let funcContainer = this.KnotContainerWithName(functionName);\n if (funcContainer == null) {\n throw new Error(\"Function doesn't exist: '\" + functionName + \"'\");\n }\n\n let outputStreamBefore: InkObject[] = [];\n outputStreamBefore.push(...this.state.outputStream);\n this._state.ResetOutput();\n\n this.state.StartFunctionEvaluationFromGame(funcContainer, args);\n\n // Evaluate the function, and collect the string output\n let stringOutput = new StringBuilder();\n while (this.canContinue) {\n stringOutput.Append(this.Continue());\n }\n let textOutput = stringOutput.toString();\n\n this._state.ResetOutput(outputStreamBefore);\n\n let result = this.state.CompleteFunctionEvaluationFromGame();\n if (this.onCompleteEvaluateFunction != null)\n this.onCompleteEvaluateFunction(functionName, args, textOutput, result);\n\n return returnTextOutput ? { returned: result, output: textOutput } : result;\n }\n\n public EvaluateExpression(exprContainer: Container) {\n let startCallStackHeight = this.state.callStack.elements.length;\n\n this.state.callStack.Push(PushPopType.Tunnel);\n\n this._temporaryEvaluationContainer = exprContainer;\n\n this.state.GoToStart();\n\n let evalStackHeight = this.state.evaluationStack.length;\n\n this.Continue();\n\n this._temporaryEvaluationContainer = null;\n\n // Should have fallen off the end of the Container, which should\n // have auto-popped, but just in case we didn't for some reason,\n // manually pop to restore the state (including currentPath).\n if (this.state.callStack.elements.length > startCallStackHeight) {\n this.state.PopCallStack();\n }\n\n let endStackHeight = this.state.evaluationStack.length;\n if (endStackHeight > evalStackHeight) {\n return this.state.PopEvaluationStack();\n } else {\n return null;\n }\n }\n\n public allowExternalFunctionFallbacks: boolean = false;\n\n public CallExternalFunction(\n funcName: string | null,\n numberOfArguments: number\n ) {\n if (funcName === null) {\n return throwNullException(\"funcName\");\n }\n let funcDef = this._externals.get(funcName);\n let fallbackFunctionContainer = null;\n\n let foundExternal = typeof funcDef !== \"undefined\";\n\n if (\n foundExternal &&\n !funcDef!.lookAheadSafe &&\n this._stateSnapshotAtLastNewline !== null\n ) {\n this._sawLookaheadUnsafeFunctionAfterNewline = true;\n return;\n }\n\n if (!foundExternal) {\n if (this.allowExternalFunctionFallbacks) {\n fallbackFunctionContainer = this.KnotContainerWithName(funcName);\n this.Assert(\n fallbackFunctionContainer !== null,\n \"Trying to call EXTERNAL function '\" +\n funcName +\n \"' which has not been bound, and fallback ink function could not be found.\"\n );\n\n // Divert direct into fallback function and we're done\n this.state.callStack.Push(\n PushPopType.Function,\n undefined,\n this.state.outputStream.length\n );\n this.state.divertedPointer = Pointer.StartOf(fallbackFunctionContainer);\n return;\n } else {\n this.Assert(\n false,\n \"Trying to call EXTERNAL function '\" +\n funcName +\n \"' which has not been bound (and ink fallbacks disabled).\"\n );\n }\n }\n\n // Pop arguments\n let args: any[] = [];\n for (let i = 0; i < numberOfArguments; ++i) {\n // var poppedObj = state.PopEvaluationStack () as Value;\n let poppedObj = asOrThrows(this.state.PopEvaluationStack(), Value);\n let valueObj = poppedObj.valueObject;\n args.push(valueObj);\n }\n\n // Reverse arguments from the order they were popped,\n // so they're the right way round again.\n args.reverse();\n\n // Run the function!\n let funcResult = funcDef!.function(args);\n\n // Convert return value (if any) to the a type that the ink engine can use\n let returnObj = null;\n if (funcResult != null) {\n returnObj = Value.Create(funcResult);\n this.Assert(\n returnObj !== null,\n \"Could not create ink value from returned object of type \" +\n typeof funcResult\n );\n } else {\n returnObj = new Void();\n }\n\n this.state.PushEvaluationStack(returnObj);\n }\n\n public BindExternalFunctionGeneral(\n funcName: string,\n func: Story.ExternalFunction,\n lookaheadSafe: boolean = true\n ) {\n this.IfAsyncWeCant(\"bind an external function\");\n this.Assert(\n !this._externals.has(funcName),\n \"Function '\" + funcName + \"' has already been bound.\"\n );\n this._externals.set(funcName, {\n function: func,\n lookAheadSafe: lookaheadSafe,\n });\n }\n\n public TryCoerce(value: any) {\n // We're skipping type coercition in this implementation. First of, js\n // is loosely typed, so it's not that important. Secondly, there is no\n // clean way (AFAIK) for the user to describe what type of parameters\n // they expect.\n return value;\n }\n\n public BindExternalFunction(\n funcName: string,\n func: Story.ExternalFunction,\n lookaheadSafe: boolean = false\n ) {\n this.Assert(func != null, \"Can't bind a null function\");\n\n this.BindExternalFunctionGeneral(\n funcName,\n (args: any) => {\n this.Assert(\n args.length >= func.length,\n \"External function expected \" + func.length + \" arguments\"\n );\n\n let coercedArgs = [];\n for (let i = 0, l = args.length; i < l; i++) {\n coercedArgs[i] = this.TryCoerce(args[i]);\n }\n return func.apply(null, coercedArgs);\n },\n lookaheadSafe\n );\n }\n\n public UnbindExternalFunction(funcName: string) {\n this.IfAsyncWeCant(\"unbind an external a function\");\n this.Assert(\n this._externals.has(funcName),\n \"Function '\" + funcName + \"' has not been bound.\"\n );\n this._externals.delete(funcName);\n }\n\n public ValidateExternalBindings(): void;\n public ValidateExternalBindings(\n c: Container | null,\n missingExternals: Set<string>\n ): void;\n public ValidateExternalBindings(\n o: InkObject | null,\n missingExternals: Set<string>\n ): void;\n public ValidateExternalBindings() {\n let c: Container | null = null;\n let o: InkObject | null = null;\n let missingExternals: Set<string> = arguments[1] || new Set();\n\n if (arguments[0] instanceof Container) {\n c = arguments[0];\n }\n\n if (arguments[0] instanceof InkObject) {\n o = arguments[0];\n }\n\n if (c === null && o === null) {\n this.ValidateExternalBindings(\n this._mainContentContainer,\n missingExternals\n );\n this._hasValidatedExternals = true;\n\n // No problem! Validation complete\n if (missingExternals.size == 0) {\n this._hasValidatedExternals = true;\n } else {\n let message = \"Error: Missing function binding for external\";\n message += missingExternals.size > 1 ? \"s\" : \"\";\n message += \": '\";\n message += Array.from(missingExternals).join(\"', '\");\n message += \"' \";\n message += this.allowExternalFunctionFallbacks\n ? \", and no fallback ink function found.\"\n : \" (ink fallbacks disabled)\";\n\n this.Error(message);\n }\n } else if (c != null) {\n for (let innerContent of c.content) {\n let container = innerContent as Container;\n if (container == null || !container.hasValidName)\n this.ValidateExternalBindings(innerContent, missingExternals);\n }\n for (let [, value] of c.namedContent) {\n this.ValidateExternalBindings(\n asOrNull(value, InkObject),\n missingExternals\n );\n }\n } else if (o != null) {\n let divert = asOrNull(o, Divert);\n if (divert && divert.isExternal) {\n let name = divert.targetPathString;\n if (name === null) {\n return throwNullException(\"name\");\n }\n if (!this._externals.has(name)) {\n if (this.allowExternalFunctionFallbacks) {\n let fallbackFound =\n this.mainContentContainer.namedContent.has(name);\n if (!fallbackFound) {\n missingExternals.add(name);\n }\n } else {\n missingExternals.add(name);\n }\n }\n }\n }\n }\n\n public ObserveVariable(\n variableName: string,\n observer: Story.VariableObserver\n ) {\n this.IfAsyncWeCant(\"observe a new variable\");\n\n if (this._variableObservers === null) this._variableObservers = new Map();\n\n if (!this.state.variablesState.GlobalVariableExistsWithName(variableName))\n throw new Error(\n \"Cannot observe variable '\" +\n variableName +\n \"' because it wasn't declared in the ink story.\"\n );\n\n if (this._variableObservers.has(variableName)) {\n this._variableObservers.get(variableName)!.push(observer);\n } else {\n this._variableObservers.set(variableName, [observer]);\n }\n }\n\n public ObserveVariables(\n variableNames: string[],\n observers: Story.VariableObserver[]\n ) {\n for (let i = 0, l = variableNames.length; i < l; i++) {\n this.ObserveVariable(variableNames[i], observers[i]);\n }\n }\n\n public RemoveVariableObserver(\n observer?: Story.VariableObserver,\n specificVariableName?: string\n ) {\n // A couple of things to know about this method:\n //\n // 1. Since `RemoveVariableObserver` is exposed to the JavaScript world,\n // optionality is marked as `undefined` rather than `null`.\n // To keep things simple, null-checks are performed using regular\n // equality operators, where undefined == null.\n //\n // 2. Since C# delegates are translated to arrays of functions,\n // -= becomes a call to splice and null-checks are replaced by\n // emptiness-checks.\n //\n this.IfAsyncWeCant(\"remove a variable observer\");\n\n if (this._variableObservers === null) return;\n\n if (specificVariableName != null) {\n if (this._variableObservers.has(specificVariableName)) {\n if (observer != null) {\n let variableObservers =\n this._variableObservers.get(specificVariableName);\n if (variableObservers != null) {\n variableObservers.splice(variableObservers.indexOf(observer), 1);\n if (variableObservers.length === 0) {\n this._variableObservers.delete(specificVariableName);\n }\n }\n } else {\n this._variableObservers.delete(specificVariableName);\n }\n }\n } else if (observer != null) {\n let keys = this._variableObservers.keys();\n for (let varName of keys) {\n let variableObservers = this._variableObservers.get(varName);\n if (variableObservers != null) {\n variableObservers.splice(variableObservers.indexOf(observer), 1);\n if (variableObservers.length === 0) {\n this._variableObservers.delete(varName);\n }\n }\n }\n }\n }\n\n public VariableStateDidChangeEvent(\n variableName: string,\n newValueObj: InkObject\n ) {\n if (this._variableObservers === null) return;\n\n let observers = this._variableObservers.get(variableName);\n if (typeof observers !== \"undefined\") {\n if (!(newValueObj instanceof Value)) {\n throw new Error(\n \"Tried to get the value of a variable that isn't a standard type\"\n );\n }\n // var val = newValueObj as Value;\n let val = asOrThrows(newValueObj, Value);\n\n for (let observer of observers) {\n observer(variableName, val.valueObject);\n }\n }\n }\n\n get globalTags() {\n return this.TagsAtStartOfFlowContainerWithPathString(\"\");\n }\n\n public TagsForContentAtPath(path: string) {\n return this.TagsAtStartOfFlowContainerWithPathString(path);\n }\n\n public TagsAtStartOfFlowContainerWithPathString(pathString: string) {\n let path = new Path(pathString);\n\n let flowContainer = this.ContentAtPath(path).container;\n if (flowContainer === null) {\n return throwNullException(\"flowContainer\");\n }\n while (true) {\n let firstContent: InkObject = flowContainer.content[0];\n if (firstContent instanceof Container) flowContainer = firstContent;\n else break;\n }\n\n let inTag = false;\n let tags: string[] | null = null;\n\n for (let c of flowContainer.content) {\n // var tag = c as Runtime.Tag;\n let command = asOrNull(c, ControlCommand);\n\n if (command != null) {\n if (command.commandType == ControlCommand.CommandType.BeginTag) {\n inTag = true;\n } else if (command.commandType == ControlCommand.CommandType.EndTag) {\n inTag = false;\n }\n } else if (inTag) {\n let str = asOrNull(c, StringValue);\n if (str !== null) {\n if (tags === null) tags = [];\n if (str.value !== null) tags.push(str.value);\n } else {\n this.Error(\n \"Tag contained non-text content. Only plain text is allowed when using globalTags or TagsAtContentPath. If you want to evaluate dynamic content, you need to use story.Continue().\"\n );\n }\n } else {\n break;\n }\n }\n\n return tags;\n }\n\n public BuildStringOfHierarchy() {\n let sb = new StringBuilder();\n\n this.mainContentContainer.BuildStringOfHierarchy(\n sb,\n 0,\n this.state.currentPointer.Resolve()\n );\n\n return sb.toString();\n }\n\n public BuildStringOfContainer(container: Container) {\n let sb = new StringBuilder();\n container.BuildStringOfHierarchy(\n sb,\n 0,\n this.state.currentPointer.Resolve()\n );\n return sb.toString();\n }\n\n public NextContent() {\n this.state.previousPointer = this.state.currentPointer.copy();\n\n if (!this.state.divertedPointer.isNull) {\n this.state.currentPointer = this.state.divertedPointer.copy();\n this.state.divertedPointer = Pointer.Null;\n\n this.VisitChangedContainersDueToDivert();\n\n if (!this.state.currentPointer.isNull) {\n return;\n }\n }\n\n let successfulPointerIncrement = this.IncrementContentPointer();\n\n if (!successfulPointerIncrement) {\n let didPop = false;\n\n if (this.state.callStack.CanPop(PushPopType.Function)) {\n this.state.PopCallStack(PushPopType.Function);\n\n if (this.state.inExpressionEvaluation) {\n this.state.PushEvaluationStack(new Void());\n }\n\n didPop = true;\n } else if (this.state.callStack.canPopThread) {\n this.state.callStack.PopThread();\n\n didPop = true;\n } else {\n this.state.TryExitFunctionEvaluationFromGame();\n }\n\n if (didPop && !this.state.currentPointer.isNull) {\n this.NextContent();\n }\n }\n }\n\n public IncrementContentPointer() {\n let successfulIncrement = true;\n\n let pointer = this.state.callStack.currentElement.currentPointer.copy();\n pointer.index++;\n\n if (pointer.container === null) {\n return throwNullException(\"pointer.container\");\n }\n while (pointer.index >= pointer.container.content.length) {\n successfulIncrement = false;\n\n // Container nextAncestor = pointer.container.parent as Container;\n let nextAncestor = asOrNull(pointer.container.parent, Container);\n if (nextAncestor instanceof Container === false) {\n break;\n }\n\n let indexInAncestor = nextAncestor!.content.indexOf(pointer.container);\n if (indexInAncestor == -1) {\n break;\n }\n\n pointer = new Pointer(nextAncestor, indexInAncestor);\n\n pointer.index++;\n\n successfulIncrement = true;\n if (pointer.container === null) {\n return throwNullException(\"pointer.container\");\n }\n }\n\n if (!successfulIncrement) pointer = Pointer.Null;\n\n this.state.callStack.currentElement.currentPointer = pointer.copy();\n\n return successfulIncrement;\n }\n\n public TryFollowDefaultInvisibleChoice() {\n let allChoices = this._state.currentChoices;\n\n let invisibleChoices = allChoices.filter((c) => c.isInvisibleDefault);\n\n if (\n invisibleChoices.length == 0 ||\n allChoices.length > invisibleChoices.length\n )\n return false;\n\n let choice = invisibleChoices[0];\n\n if (choice.targetPath === null) {\n return throwNullException(\"choice.targetPath\");\n }\n\n if (choice.threadAtGeneration === null) {\n return throwNullException(\"choice.threadAtGeneration\");\n }\n\n this.state.callStack.currentThread = choice.threadAtGeneration;\n\n if (this._stateSnapshotAtLastNewline !== null) {\n this.state.callStack.currentThread = this.state.callStack.ForkThread();\n }\n\n this.ChoosePath(choice.targetPath, false);\n\n return true;\n }\n\n public NextSequenceShuffleIndex() {\n // var numElementsIntVal = state.PopEvaluationStack () as IntValue;\n let numElementsIntVal = asOrNull(this.state.PopEvaluationStack(), IntValue);\n if (!(numElementsIntVal instanceof IntValue)) {\n this.Error(\"expected number of elements in sequence for shuffle index\");\n return 0;\n }\n\n let seqContainer = this.state.currentPointer.container;\n if (seqContainer === null) {\n return throwNullException(\"seqContainer\");\n }\n\n // Originally a primitive type, but here, can be null.\n // TODO: Replace by default value?\n if (numElementsIntVal.value === null) {\n return throwNullException(\"numElementsIntVal.value\");\n }\n let numElements = numElementsIntVal.value;\n\n // var seqCountVal = state.PopEvaluationStack () as IntValue;\n let seqCountVal = asOrThrows(this.state.PopEvaluationStack(), IntValue);\n let seqCount = seqCountVal.value;\n\n // Originally a primitive type, but here, can be null.\n // TODO: Replace by default value?\n if (seqCount === null) {\n return throwNullException(\"seqCount\");\n }\n\n let loopIndex = seqCount / numElements;\n let iterationIndex = seqCount % numElements;\n\n let seqPathStr = seqContainer.path.toString();\n let sequenceHash = 0;\n for (let i = 0, l = seqPathStr.length; i < l; i++) {\n sequenceHash += seqPathStr.charCodeAt(i) || 0;\n }\n let randomSeed = sequenceHash + loopIndex + this.state.storySeed;\n let random = new PRNG(Math.floor(randomSeed));\n\n let unpickedIndices = [];\n for (let i = 0; i < numElements; ++i) {\n unpickedIndices.push(i);\n }\n\n for (let i = 0; i <= iterationIndex; ++i) {\n let chosen = random.next() % unpickedIndices.length;\n let chosenIndex = unpickedIndices[chosen];\n unpickedIndices.splice(chosen, 1);\n\n if (i == iterationIndex) {\n return chosenIndex;\n }\n }\n\n throw new Error(\"Should never reach here\");\n }\n\n public Error(message: string, useEndLineNumber = false): never {\n let e = new StoryException(message);\n e.useEndLineNumber = useEndLineNumber;\n throw e;\n }\n\n public Warning(message: string) {\n this.AddError(message, true);\n }\n\n public AddError(\n message: string,\n isWarning = false,\n useEndLineNumber = false\n ) {\n let dm = this.currentDebugMetadata;\n\n let errorTypeStr = isWarning ? \"WARNING\" : \"ERROR\";\n\n if (dm != null) {\n let lineNum = useEndLineNumber ? dm.endLineNumber : dm.startLineNumber;\n message =\n \"RUNTIME \" +\n errorTypeStr +\n \": '\" +\n dm.fileName +\n \"' line \" +\n lineNum +\n \": \" +\n message;\n } else if (!this.state.currentPointer.isNull) {\n message =\n \"RUNTIME \" +\n errorTypeStr +\n \": (\" +\n this.state.currentPointer +\n \"): \" +\n message;\n } else {\n message = \"RUNTIME \" + errorTypeStr + \": \" + message;\n }\n\n this.state.AddError(message, isWarning);\n\n // In a broken state don't need to know about any other errors.\n if (!isWarning) this.state.ForceEnd();\n }\n\n public Assert(condition: boolean, message: string | null = null) {\n if (condition == false) {\n if (message == null) {\n message = \"Story assert\";\n }\n\n throw new Error(message + \" \" + this.currentDebugMetadata);\n }\n }\n\n get currentDebugMetadata(): DebugMetadata | null {\n let dm: DebugMetadata | null;\n\n let pointer = this.state.currentPointer;\n if (!pointer.isNull && pointer.Resolve() !== null) {\n dm = pointer.Resolve()!.debugMetadata;\n if (dm !== null) {\n return dm;\n }\n }\n\n for (let i = this.state.callStack.elements.length - 1; i >= 0; --i) {\n pointer = this.state.callStack.elements[i].currentPointer;\n if (!pointer.isNull && pointer.Resolve() !== null) {\n dm = pointer.Resolve()!.debugMetadata;\n if (dm !== null) {\n return dm;\n }\n }\n }\n\n for (let i = this.state.outputStream.length - 1; i >= 0; --i) {\n let outputObj = this.state.outputStream[i];\n dm = outputObj.debugMetadata;\n if (dm !== null) {\n return dm;\n }\n }\n\n return null;\n }\n\n get mainContentContainer() {\n if (this._temporaryEvaluationContainer) {\n return this._temporaryEvaluationContainer;\n } else {\n return this._mainContentContainer;\n }\n }\n\n /**\n * `_mainContentContainer` is almost guaranteed to be set in the\n * constructor, unless the json is malformed.\n */\n private _mainContentContainer!: Container;\n private _listDefinitions: ListDefinitionsOrigin | null = null;\n\n private _externals: Map<string, Story.ExternalFunctionDef>;\n private _variableObservers: Map<string, Story.VariableObserver[]> | null =\n null;\n private _hasValidatedExternals: boolean = false;\n\n private _temporaryEvaluationContainer: Container | null = null;\n\n /**\n * `state` is almost guaranteed to be set in the constructor, unless\n * using the compiler-specific constructor which will likely not be used in\n * the real world.\n */\n private _state!: StoryState;\n\n private _asyncContinueActive: boolean = false;\n private _stateSnapshotAtLastNewline: StoryState | null = null;\n private _sawLookaheadUnsafeFunctionAfterNewline: boolean = false;\n\n private _recursiveContinueCount: number = 0;\n\n private _asyncSaving: boolean = false;\n\n private _profiler: any | null = null; // TODO: Profiler\n}\n\nexport namespace Story {\n export enum OutputStateChange {\n NoChange = 0,\n ExtendedBeyondNewline = 1,\n NewlineRemoved = 2,\n }\n\n export interface EvaluateFunctionTextOutput {\n returned: any;\n output: string;\n }\n\n export interface ExternalFunctionDef {\n function: ExternalFunction;\n lookAheadSafe: boolean;\n }\n\n export type VariableObserver = (variableName: string, newValue: any) => void;\n export type ExternalFunction = (...args: any) => any;\n}\n","import { AuthorWarning } from \"./AuthorWarning\";\nimport { ConstantDeclaration } from \"./Declaration/ConstantDeclaration\";\nimport { Container as RuntimeContainer } from \"../../../engine/Container\";\nimport { ControlCommand as RuntimeControlCommand } from \"../../../engine/ControlCommand\";\nimport { ErrorHandler } from \"../../../engine/Error\";\nimport { ErrorType } from \"../ErrorType\";\nimport { Expression } from \"./Expression/Expression\";\nimport { ExternalDeclaration } from \"./Declaration/ExternalDeclaration\";\nimport { FlowBase } from \"./Flow/FlowBase\";\nimport { FlowLevel } from \"./Flow/FlowLevel\";\nimport { IncludedFile } from \"./IncludedFile\";\nimport { ListDefinition } from \"./List/ListDefinition\";\nimport { ListElementDefinition } from \"./List/ListElementDefinition\";\nimport { ParsedObject } from \"./Object\";\nimport { Story as RuntimeStory } from \"../../../engine/Story\";\nimport { SymbolType } from \"./SymbolType\";\nimport { Text } from \"./Text\";\nimport { VariableAssignment as RuntimeVariableAssignment } from \"../../../engine/VariableAssignment\";\nimport { Identifier } from \"./Identifier\";\nimport { asOrNull } from \"../../../engine/TypeAssertion\";\nimport { ClosestFlowBase } from \"./Flow/ClosestFlowBase\";\nimport { FunctionCall } from \"./FunctionCall\";\nimport { Path } from \"./Path\";\nimport { VariableAssignment } from \"./Variable/VariableAssignment\";\n\nexport class Story extends FlowBase {\n public static readonly IsReservedKeyword = (name?: string): boolean => {\n switch (name) {\n case \"true\":\n case \"false\":\n case \"not\":\n case \"return\":\n case \"else\":\n case \"VAR\":\n case \"CONST\":\n case \"temp\":\n case \"LIST\":\n case \"function\":\n return true;\n }\n\n return false;\n };\n\n private _errorHandler: ErrorHandler | null = null;\n private _hadError: boolean = false;\n private _hadWarning: boolean = false;\n private _dontFlattenContainers: Set<RuntimeContainer> = new Set();\n private _listDefs: Map<string, ListDefinition> = new Map();\n\n get flowLevel(): FlowLevel {\n return FlowLevel.Story;\n }\n\n get hadError(): boolean {\n return this._hadError;\n }\n\n get hadWarning(): boolean {\n return this._hadWarning;\n }\n\n public constants: Map<string, Expression> = new Map();\n public externals: Map<string, ExternalDeclaration> = new Map();\n\n // Build setting for exporting:\n // When true, the visit count for *all* knots, stitches, choices,\n // and gathers is counted. When false, only those that are direclty\n // referenced by the ink are recorded. Use this flag to allow game-side\n // querying of arbitrary knots/stitches etc.\n // Storing all counts is more robust and future proof (updates to the story file\n // that reference previously uncounted visits are possible, but generates a much\n // larger safe file, with a lot of potentially redundant counts.\n public countAllVisits: boolean = false;\n\n constructor(toplevelObjects: ParsedObject[], isInclude: boolean = false) {\n // Don't do anything much on construction, leave it lightweight until\n // the ExportRuntime method is called.\n super(null, toplevelObjects, null, false, isInclude);\n }\n\n get typeName(): string {\n return \"Story\";\n }\n\n // Before this function is called, we have IncludedFile objects interspersed\n // in our content wherever an include statement was.\n // So that the include statement can be added in a sensible place (e.g. the\n // top of the file) without side-effects of jumping into a knot that was\n // defined in that include, we separate knots and stitches from anything\n // else defined at the top scope of the included file.\n //\n // Algorithm: For each IncludedFile we find, split its contents into\n // knots/stiches and any other content. Insert the normal content wherever\n // the include statement was, and append the knots/stitches to the very\n // end of the main story.\n public PreProcessTopLevelObjects(topLevelContent: ParsedObject[]): void {\n super.PreProcessTopLevelObjects(topLevelContent);\n\n const flowsFromOtherFiles = [];\n\n // Inject included files\n for (let obj of topLevelContent) {\n if (obj instanceof IncludedFile) {\n const file: IncludedFile = obj;\n\n // Remove the IncludedFile itself\n const posOfObj = topLevelContent.indexOf(obj);\n topLevelContent.splice(posOfObj, 1);\n\n // When an included story fails to load, the include\n // line itself is still valid, so we have to handle it here\n if (file.includedStory) {\n const nonFlowContent: ParsedObject[] = [];\n const subStory = file.includedStory;\n // Allow empty file\n if (subStory.content != null) {\n for (const subStoryObj of subStory.content) {\n if (subStoryObj instanceof FlowBase) {\n flowsFromOtherFiles.push(subStoryObj);\n } else {\n nonFlowContent.push(subStoryObj);\n }\n }\n\n // Add newline on the end of the include\n nonFlowContent.push(new Text(\"\\n\"));\n\n // Add contents of the file in its place\n topLevelContent.splice(posOfObj, 0, ...nonFlowContent);\n\n // Skip past the content of this sub story\n // (since it will already have recursively included\n // any lines from other files)\n }\n }\n\n // Include object has been removed, with possible content inserted,\n // and position of 'i' will have been determined already.\n continue;\n }\n }\n\n // Add the flows we collected from the included files to the\n // end of our list of our content\n topLevelContent.splice(0, 0, ...flowsFromOtherFiles);\n }\n\n public readonly ExportRuntime = (\n errorHandler: ErrorHandler | null = null\n ): RuntimeStory | null => {\n this._errorHandler = errorHandler;\n\n // Find all constants before main export begins, so that VariableReferences know\n // whether to generate a runtime variable reference or the literal value\n this.constants = new Map();\n for (const constDecl of this.FindAll(ConstantDeclaration)()) {\n // Check for duplicate definitions\n const existingDefinition: Expression = this.constants.get(\n constDecl.constantName!\n ) as any;\n\n if (existingDefinition) {\n if (!existingDefinition.Equals(constDecl.expression)) {\n const errorMsg = `CONST '${constDecl.constantName}' has been redefined with a different value. Multiple definitions of the same CONST are valid so long as they contain the same value. Initial definition was on ${existingDefinition.debugMetadata}.`;\n this.Error(errorMsg, constDecl, false);\n }\n }\n\n this.constants.set(constDecl.constantName!, constDecl.expression);\n }\n\n // List definitions are treated like constants too - they should be usable\n // from other variable declarations.\n this._listDefs = new Map();\n for (const listDef of this.FindAll<ListDefinition>(ListDefinition)()) {\n if (listDef.identifier?.name) {\n this._listDefs.set(listDef.identifier?.name, listDef);\n }\n }\n\n this.externals = new Map();\n\n // Resolution of weave point names has to come first, before any runtime code generation\n // since names have to be ready before diverts start getting created.\n // (It used to be done in the constructor for a weave, but didn't allow us to generate\n // errors when name resolution failed.)\n this.ResolveWeavePointNaming();\n\n // Get default implementation of runtimeObject, which calls ContainerBase's generation method\n const rootContainer = this.runtimeObject as RuntimeContainer;\n\n // Export initialisation of global variables\n // TODO: We *could* add this as a declarative block to the story itself...\n const variableInitialisation = new RuntimeContainer();\n variableInitialisation.AddContent(RuntimeControlCommand.EvalStart());\n\n // Global variables are those that are local to the story and marked as global\n const runtimeLists = [];\n for (const [key, value] of this.variableDeclarations) {\n if (value.isGlobalDeclaration) {\n if (value.listDefinition) {\n this._listDefs.set(key, value.listDefinition);\n variableInitialisation.AddContent(\n value.listDefinition.runtimeObject!\n );\n\n runtimeLists.push(value.listDefinition.runtimeListDefinition);\n } else {\n if (!value.expression) {\n throw new Error();\n }\n value.expression.GenerateIntoContainer(variableInitialisation);\n }\n\n const runtimeVarAss = new RuntimeVariableAssignment(key, true);\n runtimeVarAss.isGlobal = true;\n variableInitialisation.AddContent(runtimeVarAss);\n }\n }\n\n variableInitialisation.AddContent(RuntimeControlCommand.EvalEnd());\n variableInitialisation.AddContent(RuntimeControlCommand.End());\n\n if (this.variableDeclarations.size > 0) {\n variableInitialisation.name = \"global decl\";\n rootContainer.AddToNamedContentOnly(variableInitialisation);\n }\n\n // Signal that it's safe to exit without error, even if there are no choices generated\n // (this only happens at the end of top level content that isn't in any particular knot)\n rootContainer.AddContent(RuntimeControlCommand.Done());\n\n // Replace runtimeObject with Story object instead of the Runtime.Container generated by Parsed.ContainerBase\n const runtimeStory = new RuntimeStory(rootContainer, runtimeLists);\n\n this.runtimeObject = runtimeStory;\n\n if (this.hadError) {\n return null;\n }\n\n // Optimisation step - inline containers that can be\n this.FlattenContainersIn(rootContainer);\n\n // Now that the story has been fulled parsed into a hierarchy,\n // and the derived runtime hierarchy has been built, we can\n // resolve referenced symbols such as variables and paths.\n // e.g. for paths \" -> knotName --> stitchName\" into an INKPath (knotName.stitchName)\n // We don't make any assumptions that the INKPath follows the same\n // conventions as the script format, so we resolve to actual objects before\n // translating into an INKPath. (This also allows us to choose whether\n // we want the paths to be absolute)\n this.ResolveReferences(this);\n\n if (this.hadError) {\n return null;\n }\n\n runtimeStory.ResetState();\n\n return runtimeStory;\n };\n\n public readonly ResolveList = (listName: string): ListDefinition | null => {\n let list: ListDefinition | null | undefined = this._listDefs.get(listName);\n if (!list) {\n return null;\n }\n\n return list;\n };\n\n public readonly ResolveListItem = (\n listName: string | null,\n itemName: string,\n source: ParsedObject | null = null\n ): ListElementDefinition | null => {\n let listDef: ListDefinition | null | undefined = null;\n\n // Search a specific list if we know its name (i.e. the form listName.itemName)\n if (listName) {\n if (!(listDef = this._listDefs.get(listName))) {\n return null;\n }\n\n return listDef.ItemNamed(itemName);\n } else {\n // Otherwise, try to search all lists\n\n let foundItem: ListElementDefinition | null = null;\n let originalFoundList: ListDefinition | null = null;\n\n for (const [, value] of this._listDefs.entries()) {\n const itemInThisList = value.ItemNamed(itemName);\n if (itemInThisList) {\n if (foundItem) {\n this.Error(\n `Ambiguous item name '${itemName}' found in multiple sets, including ${\n originalFoundList!.identifier\n } and ${value!.identifier}`,\n source,\n false\n );\n } else {\n foundItem = itemInThisList;\n originalFoundList = value!;\n }\n }\n }\n\n return foundItem;\n }\n };\n\n public readonly FlattenContainersIn = (container: RuntimeContainer): void => {\n // Need to create a collection to hold the inner containers\n // because otherwise we'd end up modifying during iteration\n const innerContainers = new Set<RuntimeContainer>();\n if (container.content) {\n for (const c of container.content) {\n const innerContainer = asOrNull(c, RuntimeContainer);\n if (innerContainer) {\n innerContainers.add(innerContainer);\n }\n }\n }\n\n // Can't flatten the named inner containers, but we can at least\n // iterate through their children\n if (container.namedContent) {\n for (const [, value] of container.namedContent) {\n const namedInnerContainer = asOrNull(value, RuntimeContainer);\n if (namedInnerContainer) {\n innerContainers.add(namedInnerContainer);\n }\n }\n }\n\n for (const innerContainer of innerContainers) {\n this.TryFlattenContainer(innerContainer);\n this.FlattenContainersIn(innerContainer);\n }\n };\n\n public readonly TryFlattenContainer = (container: RuntimeContainer): void => {\n if (\n (container.namedContent && container.namedContent.size > 0) ||\n container.hasValidName ||\n this._dontFlattenContainers.has(container)\n ) {\n return;\n }\n\n // Inline all the content in container into the parent\n const parentContainer = asOrNull(container.parent, RuntimeContainer);\n if (parentContainer) {\n let contentIdx = parentContainer.content.indexOf(container);\n parentContainer.content.splice(contentIdx, 1);\n\n const dm = container.ownDebugMetadata;\n\n if (container.content) {\n for (const innerContent of container.content) {\n innerContent.parent = null;\n if (dm !== null && innerContent.ownDebugMetadata === null) {\n innerContent.debugMetadata = dm;\n }\n\n parentContainer.InsertContent(innerContent, contentIdx);\n contentIdx += 1;\n }\n }\n }\n };\n\n public readonly Error = (\n message: string,\n source: ParsedObject | null | undefined,\n isWarning: boolean | null | undefined\n ) => {\n let errorType: ErrorType = isWarning ? ErrorType.Warning : ErrorType.Error;\n\n let sb = \"\";\n if (source instanceof AuthorWarning) {\n sb += \"TODO: \";\n errorType = ErrorType.Author;\n } else if (isWarning) {\n sb += \"WARNING: \";\n } else {\n sb += \"ERROR: \";\n }\n\n if (\n source &&\n source.debugMetadata !== null &&\n source.debugMetadata.startLineNumber >= 1\n ) {\n if (source.debugMetadata.fileName != null) {\n sb += `'${source.debugMetadata.fileName}' `;\n }\n\n sb += `line ${source.debugMetadata.startLineNumber}: `;\n }\n\n sb += message;\n\n message = sb;\n\n if (this._errorHandler !== null) {\n this._errorHandler(message, errorType);\n } else {\n throw new Error(message);\n }\n\n this._hadError = errorType === ErrorType.Error;\n this._hadWarning = errorType === ErrorType.Warning;\n };\n\n public readonly ResetError = (): void => {\n this._hadError = false;\n this._hadWarning = false;\n };\n\n public readonly IsExternal = (namedFuncTarget: string): boolean =>\n this.externals.has(namedFuncTarget);\n\n public readonly AddExternal = (decl: ExternalDeclaration): void => {\n if (this.externals.has(decl.name!)) {\n this.Error(\n `Duplicate EXTERNAL definition of '${decl.name}'`,\n decl,\n false\n );\n } else if (decl.name) {\n this.externals.set(decl.name, decl);\n }\n };\n\n public readonly DontFlattenContainer = (\n container: RuntimeContainer\n ): void => {\n this._dontFlattenContainers.add(container);\n };\n\n public readonly NameConflictError = (\n obj: ParsedObject,\n name: string,\n existingObj: ParsedObject,\n typeNameToPrint: string\n ): void => {\n obj.Error(\n `${typeNameToPrint} '${name}': name has already been used for a ${existingObj.typeName.toLowerCase()} on ${\n existingObj.debugMetadata\n }`\n );\n };\n\n // Check given symbol type against everything that's of a higher priority in the ordered SymbolType enum (above).\n // When the given symbol type level is reached, we early-out / return.\n public readonly CheckForNamingCollisions = (\n obj: ParsedObject,\n identifier: Identifier,\n symbolType: SymbolType,\n typeNameOverride: string = \"\"\n ): void => {\n const typeNameToPrint: string = typeNameOverride || obj.typeName;\n if (Story.IsReservedKeyword(identifier?.name)) {\n obj.Error(\n `'${identifier}' cannot be used for the name of a ${typeNameToPrint.toLowerCase()} because it's a reserved keyword`\n );\n return;\n } else if (FunctionCall.IsBuiltIn(identifier?.name || \"\")) {\n obj.Error(\n `'${identifier}' cannot be used for the name of a ${typeNameToPrint.toLowerCase()} because it's a built in function`\n );\n\n return;\n }\n\n // Top level knots\n const maybeKnotOrFunction = this.ContentWithNameAtLevel(\n identifier?.name || \"\",\n FlowLevel.Knot\n );\n\n const knotOrFunction = asOrNull(maybeKnotOrFunction, FlowBase);\n\n if (\n knotOrFunction &&\n (knotOrFunction !== obj || symbolType === SymbolType.Arg)\n ) {\n this.NameConflictError(\n obj,\n identifier?.name || \"\",\n knotOrFunction,\n typeNameToPrint\n );\n return;\n }\n\n if (symbolType < SymbolType.List) {\n return;\n }\n\n // Lists\n for (const [key, value] of this._listDefs) {\n if (\n identifier?.name === key &&\n obj !== value &&\n value.variableAssignment !== obj\n ) {\n this.NameConflictError(obj, identifier?.name, value, typeNameToPrint);\n }\n\n // We don't check for conflicts between individual elements in\n // different lists because they are namespaced.\n if (!(obj instanceof ListElementDefinition)) {\n for (const item of value.itemDefinitions) {\n if (identifier?.name === item.name) {\n this.NameConflictError(\n obj,\n identifier?.name || \"\",\n item,\n typeNameToPrint\n );\n }\n }\n }\n }\n\n // Don't check for VAR->VAR conflicts because that's handled separately\n // (necessary since checking looks up in a dictionary)\n if (symbolType <= SymbolType.Var) {\n return;\n }\n\n // Global variable collision\n const varDecl: VariableAssignment | null =\n (identifier?.name && this.variableDeclarations.get(identifier?.name)) ||\n null;\n if (\n varDecl &&\n varDecl !== obj &&\n varDecl.isGlobalDeclaration &&\n varDecl.listDefinition == null\n ) {\n this.NameConflictError(\n obj,\n identifier?.name || \"\",\n varDecl,\n typeNameToPrint\n );\n }\n\n if (symbolType < SymbolType.SubFlowAndWeave) {\n return;\n }\n\n // Stitches, Choices and Gathers\n const path = new Path(identifier);\n const targetContent = path.ResolveFromContext(obj);\n if (targetContent && targetContent !== obj) {\n this.NameConflictError(\n obj,\n identifier?.name || \"\",\n targetContent,\n typeNameToPrint\n );\n return;\n }\n\n if (symbolType < SymbolType.Arg) {\n return;\n }\n\n // Arguments to the current flow\n if (symbolType !== SymbolType.Arg) {\n let flow: FlowBase | null = asOrNull(obj, FlowBase);\n if (!flow) {\n flow = ClosestFlowBase(obj);\n }\n\n if (flow && flow.hasParameters && flow.args) {\n for (const arg of flow.args) {\n if (arg.identifier?.name === identifier?.name) {\n obj.Error(\n `${typeNameToPrint} '${identifier}': name has already been used for a argument to ${flow.identifier} on ${flow.debugMetadata}`\n );\n\n return;\n }\n }\n }\n }\n };\n}\n","import { Container as RuntimeContainer } from \"../../../../engine/Container\";\nimport { ControlCommand as RuntimeControlCommand } from \"../../../../engine/ControlCommand\";\nimport { Expression } from \"./Expression\";\nimport { ParsedObject } from \"../Object\";\nimport { Text } from \"../Text\";\nimport { asOrNull } from \"../../../../engine/TypeAssertion\";\n\nexport class StringExpression extends Expression {\n get isSingleString() {\n if (this.content.length !== 1) {\n return false;\n }\n\n const c = this.content[0];\n if (!(c instanceof Text)) {\n return false;\n }\n\n return true;\n }\n\n constructor(content: ParsedObject[]) {\n super();\n\n this.AddContent(content);\n }\n\n get typeName(): string {\n return \"String\";\n }\n\n public readonly GenerateIntoContainer = (\n container: RuntimeContainer\n ): void => {\n container.AddContent(RuntimeControlCommand.BeginString());\n\n for (const c of this.content) {\n container.AddContent(c.runtimeObject);\n }\n\n container.AddContent(RuntimeControlCommand.EndString());\n };\n\n public readonly toString = (): string => {\n let sb = \"\";\n for (const c of this.content) {\n sb += c;\n }\n\n return sb;\n };\n\n // Equals override necessary in order to check for CONST multiple definition equality\n public Equals(obj: ParsedObject): boolean {\n const otherStr = asOrNull(obj, StringExpression);\n if (otherStr === null) {\n return false;\n }\n\n // Can only compare direct equality on single strings rather than\n // complex string expressions that contain dynamic logic\n if (!this.isSingleString || !otherStr.isSingleString) {\n return false;\n }\n\n const thisTxt = this.toString();\n const otherTxt = otherStr.toString();\n return thisTxt === otherTxt;\n }\n}\n","import { ParsedObject } from \"./Object\";\nimport { ControlCommand } from \"../../../engine/ControlCommand\";\nimport { InkObject as RuntimeObject } from \"../../../engine/Object\";\n\nexport class Tag extends ParsedObject {\n public isStart: boolean;\n public inChoice: boolean;\n\n constructor(isStart: boolean, inChoice: boolean = false) {\n super();\n this.isStart = isStart;\n this.inChoice = inChoice;\n }\n get typeName(): string {\n return \"Tag\";\n }\n public readonly GenerateRuntimeObject = (): RuntimeObject => {\n if (this.isStart) {\n return ControlCommand.BeginTag();\n } else {\n return ControlCommand.EndTag();\n }\n };\n\n public readonly toString = () => {\n if (this.isStart) {\n return \"#StartTag\";\n } else {\n return \"#EndTag\";\n }\n };\n}\n\nimport { Tag as RuntimeTag } from \"../../../engine/Tag\";\nimport { Wrap } from \"./Wrap\";\nexport class LegacyTag extends Wrap<RuntimeTag> {\n constructor(tag: RuntimeTag) {\n super(tag);\n }\n get typeName(): string {\n return \"Tag\";\n }\n}\n","import { IFileHandler } from \"../IFileHandler\";\n\n// This class replaces upstream's DefaultFileHandler. It doesn't perform any\n// resolution and warns the user about providing a proper file handler when\n// INCLUDE statements are parsed. Since the JavaScript parser can be executed in\n// different environments, we let the user decide which FileHandler is best for\n// their use-case. See PosixFileHandler and JsonFileHandler.\nexport class DefaultFileHandler implements IFileHandler {\n constructor(public readonly rootPath?: string) {}\n\n readonly ResolveInkFilename = (): string => {\n throw Error(\n \"Can't resolve filename because no FileHandler was provided when instantiating the parser / compiler.\"\n );\n };\n\n readonly LoadInkFileContents = (): string => {\n throw Error(\n \"Can't load ink content because no FileHandler was provided when instantiating the parser / compiler.\"\n );\n };\n}\n","import { Argument } from \"./ParsedHierarchy/Argument\";\nimport { AuthorWarning } from \"./ParsedHierarchy/AuthorWarning\";\nimport { BinaryExpression } from \"./ParsedHierarchy/Expression/BinaryExpression\";\nimport { CharacterRange } from \"./CharacterRange\";\nimport { CharacterSet } from \"./CharacterSet\";\nimport { Choice } from \"./ParsedHierarchy/Choice\";\nimport { CommentEliminator } from \"./CommentEliminator\";\nimport { Conditional } from \"./ParsedHierarchy/Conditional/Conditional\";\nimport { ConditionalSingleBranch } from \"./ParsedHierarchy/Conditional/ConditionalSingleBranch\";\nimport { ContentList } from \"./ParsedHierarchy/ContentList\";\nimport { ConstantDeclaration } from \"./ParsedHierarchy/Declaration/ConstantDeclaration\";\nimport { CustomFlags } from \"./CustomFlags\";\nimport { DebugMetadata } from \"../../engine/DebugMetadata\";\nimport { Divert } from \"./ParsedHierarchy/Divert/Divert\";\nimport { DivertTarget } from \"./ParsedHierarchy/Divert/DivertTarget\";\nimport { Expression } from \"./ParsedHierarchy/Expression/Expression\";\nimport { ErrorHandler } from \"../../engine/Error\";\nimport { ExternalDeclaration } from \"./ParsedHierarchy/Declaration/ExternalDeclaration\";\nimport { FlowDecl } from \"./FlowDecl\";\nimport { FunctionCall } from \"./ParsedHierarchy/FunctionCall\";\nimport { Gather } from \"./ParsedHierarchy/Gather/Gather\";\nimport { Glue } from \"./ParsedHierarchy/Glue\";\nimport { Glue as RuntimeGlue } from \"../../engine/Glue\";\nimport { IFileHandler } from \"../IFileHandler\";\nimport { IncDecExpression } from \"./ParsedHierarchy/Expression/IncDecExpression\";\nimport { IncludedFile } from \"./ParsedHierarchy/IncludedFile\";\nimport { InfixOperator } from \"./InfixOperator\";\nimport { Knot } from \"./ParsedHierarchy/Knot\";\nimport { List } from \"./ParsedHierarchy/List/List\";\nimport { ListDefinition } from \"./ParsedHierarchy/List/ListDefinition\";\nimport { ListElementDefinition } from \"./ParsedHierarchy/List/ListElementDefinition\";\nimport { MultipleConditionExpression } from \"./ParsedHierarchy/Expression/MultipleConditionExpression\";\nimport { ParsedObject } from \"./ParsedHierarchy/Object\";\nimport { Path } from \"./ParsedHierarchy/Path\";\nimport { ReturnType } from \"./ParsedHierarchy/ReturnType\";\nimport { Sequence } from \"./ParsedHierarchy/Sequence/Sequence\";\nimport { SequenceType } from \"./ParsedHierarchy/Sequence/SequenceType\";\nimport { StatementLevel } from \"./StatementLevel\";\nimport { Stitch } from \"./ParsedHierarchy/Stitch\";\nimport { Story } from \"./ParsedHierarchy/Story\";\nimport { StringExpression } from \"./ParsedHierarchy/Expression/StringExpression\";\nimport {\n StringParser,\n SpecificParseRule,\n ParseRule,\n ParseRuleReturn,\n ParseSuccess,\n} from \"./StringParser/StringParser\";\nimport { StringParserElement } from \"./StringParser/StringParserElement\";\nimport { Tag } from \"./ParsedHierarchy/Tag\";\nimport { Text } from \"./ParsedHierarchy/Text\";\nimport { TunnelOnwards } from \"./ParsedHierarchy/TunnelOnwards\";\nimport { VariableAssignment } from \"./ParsedHierarchy/Variable/VariableAssignment\";\nimport { VariableReference } from \"./ParsedHierarchy/Variable/VariableReference\";\nimport { UnaryExpression } from \"./ParsedHierarchy/Expression/UnaryExpression\";\nimport { asOrNull, filterUndef } from \"../../engine/TypeAssertion\";\nimport { Identifier } from \"./ParsedHierarchy/Identifier\";\nimport { NumberExpression } from \"./ParsedHierarchy/Expression/NumberExpression\";\nimport { ErrorType } from \"./ErrorType\";\nimport { DefaultFileHandler } from \"../FileHandler/DefaultFileHandler\";\n\nexport class InkParser extends StringParser {\n /**\n * Begin base InkParser section.\n */\n\n get fileHandler(): IFileHandler {\n if (!this._fileHandler) {\n throw new Error(\"No FileHandler defined\");\n }\n return this._fileHandler;\n }\n\n set fileHandler(value: IFileHandler) {\n this._fileHandler = value;\n }\n\n constructor(\n str: string,\n filename: string | null = null,\n externalErrorHandler: ErrorHandler | null = null,\n rootParser: InkParser | null = null,\n fileHandler: IFileHandler | null = null\n ) {\n super(str);\n\n this._filename = filename;\n this.RegisterExpressionOperators();\n this.GenerateStatementLevelRules();\n\n this.errorHandler = this.OnStringParserError;\n\n this._externalErrorHandler = externalErrorHandler;\n\n if (fileHandler === null) {\n this._fileHandler = new DefaultFileHandler();\n } else {\n this._fileHandler = fileHandler;\n }\n\n if (rootParser === null) {\n this._rootParser = this;\n this._openFilenames = [];\n\n if (this._filename !== null) {\n const fullRootInkPath = this.fileHandler.ResolveInkFilename(\n this._filename\n );\n this._openFilenames.push(fullRootInkPath);\n }\n } else {\n this._rootParser = rootParser;\n }\n }\n\n // Main entry point\n // NOTE: This method is named Parse() in upstream.\n public readonly ParseStory = (): Story => {\n const topLevelContent: ParsedObject[] = this.StatementsAtLevel(\n StatementLevel.Top\n );\n\n // Note we used to return null if there were any errors, but this would mean\n // that include files would return completely empty rather than attempting to\n // continue with errors. Returning an empty include files meant that anything\n // that *did* compile successfully would otherwise be ignored, generating way\n // more errors than necessary.\n return new Story(topLevelContent, this._rootParser !== this);\n };\n\n public readonly SeparatedList = <T extends ParseRule>(\n mainRule: SpecificParseRule<T>,\n separatorRule: ParseRule\n ): ParseRuleReturn[] | null => {\n const firstElement: ParseRuleReturn = this.Parse(mainRule);\n if (firstElement === null) {\n return null;\n }\n\n const allElements = [];\n allElements.push(firstElement);\n\n do {\n const nextElementRuleId: number = this.BeginRule();\n let sep = separatorRule();\n if (sep === null) {\n this.FailRule(nextElementRuleId);\n break;\n }\n\n const nextElement = this.Parse(mainRule);\n if (nextElement === null) {\n this.FailRule(nextElementRuleId);\n break;\n }\n\n this.SucceedRule(nextElementRuleId);\n allElements.push(nextElement);\n } while (true);\n\n return allElements;\n };\n\n public PreProcessInputString(str: string): string {\n const commentEliminator = new CommentEliminator(str);\n return commentEliminator.Process();\n }\n\n public readonly CreateDebugMetadata = (\n stateAtStart: StringParserElement | null,\n stateAtEnd: StringParserElement\n ): DebugMetadata => {\n const md = new DebugMetadata();\n md.startLineNumber = (stateAtStart?.lineIndex || 0) + 1;\n md.endLineNumber = stateAtEnd.lineIndex + 1;\n md.startCharacterNumber = (stateAtStart?.characterInLineIndex || 0) + 1;\n md.endCharacterNumber = stateAtEnd.characterInLineIndex + 1;\n md.fileName = this._filename;\n\n return md;\n };\n\n public readonly RuleDidSucceed = (\n result: ParseRuleReturn,\n stateAtStart: StringParserElement | null,\n stateAtEnd: StringParserElement\n ): void => {\n // Apply DebugMetadata based on the state at the start of the rule\n // (i.e. use line number as it was at the start of the rule)\n const parsedObj = asOrNull(result, ParsedObject);\n if (parsedObj) {\n parsedObj.debugMetadata = this.CreateDebugMetadata(\n stateAtStart,\n stateAtEnd\n );\n }\n\n // A list of objects that doesn't already have metadata?\n const parsedListObjs: ParsedObject[] | null = Array.isArray(result)\n ? (result as ParsedObject[])\n : null;\n if (parsedListObjs !== null) {\n for (const parsedListObj of parsedListObjs) {\n const singleObj = asOrNull(parsedListObj, ParsedObject);\n if (!singleObj) continue;\n if (!parsedListObj.hasOwnDebugMetadata) {\n parsedListObj.debugMetadata = this.CreateDebugMetadata(\n stateAtStart,\n stateAtEnd\n );\n }\n }\n }\n\n const id = asOrNull(result, Identifier);\n if (id != null) {\n id.debugMetadata = this.CreateDebugMetadata(stateAtStart, stateAtEnd);\n }\n };\n\n get parsingStringExpression(): boolean {\n return this.GetFlag(Number(CustomFlags.ParsingString));\n }\n\n set parsingStringExpression(value: boolean) {\n this.SetFlag(Number(CustomFlags.ParsingString), value);\n }\n\n get tagActive(): boolean {\n return this.GetFlag(Number(CustomFlags.TagActive));\n }\n\n set tagActive(value: boolean) {\n this.SetFlag(Number(CustomFlags.TagActive), value);\n }\n\n public readonly OnStringParserError = (\n message: string,\n index: number,\n lineIndex: number = 0,\n isWarning: boolean = false\n ): void => {\n const warningType: string = isWarning ? \"WARNING:\" : \"ERROR:\";\n let fullMessage: string = warningType;\n\n if (this._filename !== null) {\n fullMessage += ` '${this._filename}'`;\n }\n\n fullMessage += ` line ${lineIndex + 1}: ${message}`;\n\n if (this._externalErrorHandler !== null) {\n this._externalErrorHandler(\n fullMessage,\n isWarning ? ErrorType.Warning : ErrorType.Error\n );\n } else {\n throw new Error(fullMessage);\n }\n };\n\n public readonly AuthorWarning = (): AuthorWarning | null => {\n this.Whitespace();\n\n const identifier = this.Parse(\n this.IdentifierWithMetadata\n ) as unknown as Identifier | null;\n if (identifier === null || identifier.name !== \"TODO\") {\n return null;\n }\n\n this.Whitespace();\n this.ParseString(\":\");\n this.Whitespace();\n\n const message = this.ParseUntilCharactersFromString(\"\\n\\r\");\n\n if (message) {\n return new AuthorWarning(message);\n }\n\n return null;\n };\n\n /**\n * End base InkParser section.\n */\n\n /**\n * Begin CharacterRanges section.\n */\n\n public static readonly LatinBasic: CharacterRange = CharacterRange.Define(\n \"\\u0041\",\n \"\\u007A\",\n new CharacterSet().AddRange(\"\\u005B\", \"\\u0060\")\n );\n\n public static readonly LatinExtendedA: CharacterRange = CharacterRange.Define(\n \"\\u0100\",\n \"\\u017F\"\n // no excludes here\n );\n\n public static readonly LatinExtendedB: CharacterRange = CharacterRange.Define(\n \"\\u0180\",\n \"\\u024F\"\n // no excludes here\n );\n\n public static readonly Greek: CharacterRange = CharacterRange.Define(\n \"\\u0370\",\n \"\\u03FF\",\n new CharacterSet()\n .AddRange(\"\\u0378\", \"\\u0385\")\n .AddCharacters(\"\\u0374\\u0375\\u0378\\u0387\\u038B\\u038D\\u03A2\")\n );\n\n public static readonly Cyrillic: CharacterRange = CharacterRange.Define(\n \"\\u0400\",\n \"\\u04FF\",\n new CharacterSet().AddRange(\"\\u0482\", \"\\u0489\")\n );\n\n public static readonly Armenian: CharacterRange = CharacterRange.Define(\n \"\\u0530\",\n \"\\u058F\",\n new CharacterSet()\n .AddCharacters(\"\\u0530\")\n .AddRange(\"\\u0557\", \"\\u0560\")\n .AddRange(\"\\u0588\", \"\\u058E\")\n );\n\n public static readonly Hebrew: CharacterRange = CharacterRange.Define(\n \"\\u0590\",\n \"\\u05FF\",\n new CharacterSet()\n );\n\n public static readonly Arabic: CharacterRange = CharacterRange.Define(\n \"\\u0600\",\n \"\\u06FF\",\n new CharacterSet()\n );\n\n public static readonly Korean: CharacterRange = CharacterRange.Define(\n \"\\uAC00\",\n \"\\uD7AF\",\n new CharacterSet()\n );\n\n private readonly ExtendIdentifierCharacterRanges = (\n identifierCharSet: CharacterSet\n ): void => {\n const characterRanges = InkParser.ListAllCharacterRanges();\n for (const charRange of characterRanges) {\n identifierCharSet.AddCharacters(charRange.ToCharacterSet());\n }\n };\n\n /// <summary>\n /// Gets an array of <see cref=\"CharacterRange\" /> representing all of the currently supported\n /// non-ASCII character ranges that can be used in identifier names.\n /// </summary>\n /// <returns>\n /// An array of <see cref=\"CharacterRange\" /> representing all of the currently supported\n /// non-ASCII character ranges that can be used in identifier names.\n /// </returns>\n public static readonly ListAllCharacterRanges = (): CharacterRange[] => [\n InkParser.LatinBasic,\n InkParser.LatinExtendedA,\n InkParser.LatinExtendedB,\n InkParser.Arabic,\n InkParser.Armenian,\n InkParser.Cyrillic,\n InkParser.Greek,\n InkParser.Hebrew,\n InkParser.Korean,\n ];\n\n /**\n * End CharacterRanges section.\n */\n\n /**\n * Begin Choices section.\n */\n\n public _parsingChoice: boolean = false;\n\n public readonly Choice = (): Choice | null => {\n let onceOnlyChoice: boolean = true;\n let bullets = this.Interleave<string>(\n this.OptionalExclude(this.Whitespace),\n this.String(\"*\")\n );\n\n if (!bullets) {\n bullets = this.Interleave<string>(\n this.OptionalExclude(this.Whitespace),\n this.String(\"+\")\n );\n\n if (bullets === null) {\n return null;\n }\n\n onceOnlyChoice = false;\n }\n\n // Optional name for the choice\n const optionalName: Identifier = this.Parse(\n this.BracketedName\n ) as Identifier;\n\n this.Whitespace();\n\n // Optional condition for whether the choice should be shown to the player\n const conditionExpr: Expression = this.Parse(\n this.ChoiceCondition\n ) as Expression;\n\n this.Whitespace();\n\n // Ordinarily we avoid parser state variables like these, since\n // nesting would require us to store them in a stack. But since you should\n // never be able to nest choices within choice content, it's fine here.\n if (this._parsingChoice) {\n throw new Error(\n \"Already parsing a choice - shouldn't have nested choices\"\n );\n }\n\n this._parsingChoice = true;\n\n let startContent: ContentList | null = null;\n const startTextAndLogic = this.Parse(\n this.MixedTextAndLogic\n ) as ParsedObject[];\n if (startTextAndLogic) {\n startContent = new ContentList(startTextAndLogic);\n }\n\n let optionOnlyContent: ContentList | null = null;\n let innerContent: ContentList | null = null;\n\n // Check for a the weave style format:\n // * \"Hello[.\"],\" he said.\n const hasWeaveStyleInlineBrackets: boolean = this.ParseString(\"[\") !== null;\n if (hasWeaveStyleInlineBrackets) {\n this.EndTagIfNecessary(startContent);\n\n const optionOnlyTextAndLogic = this.Parse(\n this.MixedTextAndLogic\n ) as ParsedObject[];\n\n if (optionOnlyTextAndLogic !== null) {\n optionOnlyContent = new ContentList(optionOnlyTextAndLogic);\n }\n\n this.Expect(this.String(\"]\"), \"closing ']' for weave-style option\");\n\n this.EndTagIfNecessary(optionOnlyContent);\n\n let innerTextAndLogic = this.Parse(\n this.MixedTextAndLogic\n ) as ParsedObject[];\n if (innerTextAndLogic !== null) {\n innerContent = new ContentList(innerTextAndLogic);\n }\n }\n\n this.Whitespace();\n\n this.EndTagIfNecessary(innerContent ?? startContent);\n\n // Finally, now we know we're at the end of the main choice body, parse\n // any diverts separately.\n const diverts: ParsedObject[] = this.Parse(\n this.MultiDivert\n ) as ParsedObject[];\n\n this._parsingChoice = false;\n\n this.Whitespace();\n\n // Completely empty choice without even an empty divert?\n const emptyContent: boolean =\n !startContent && !innerContent && !optionOnlyContent;\n\n if (emptyContent && diverts === null) {\n this.Warning(\n \"Choice is completely empty. Interpretting as a default fallback choice. Add a divert arrow to remove this warning: * ->\"\n );\n }\n\n if (!startContent && hasWeaveStyleInlineBrackets && !optionOnlyContent) {\n // * [] some text\n this.Warning(\n \"Blank choice - if you intended a default fallback choice, use the `* ->` syntax\"\n );\n }\n\n if (!innerContent) {\n innerContent = new ContentList();\n }\n\n this.EndTagIfNecessary(innerContent);\n\n // Normal diverts on the end of a choice - simply add to the normal content\n if (diverts !== null) {\n for (const divObj of diverts) {\n // may be TunnelOnwards\n const div = asOrNull(divObj, Divert);\n\n // Empty divert serves no purpose other than to say\n // \"this choice is intentionally left blank\"\n // (as an invisible default choice)\n if (div && div.isEmpty) {\n continue;\n }\n\n innerContent.AddContent(divObj);\n }\n }\n\n // Terminate main content with a newline since this is the end of the line\n // Note that this will be redundant if the diverts above definitely take\n // the flow away permanently.\n innerContent.AddContent(new Text(\"\\n\"));\n\n const choice = new Choice(startContent!, optionOnlyContent!, innerContent);\n if (optionalName) choice.identifier = optionalName;\n choice.indentationDepth = bullets.length;\n choice.hasWeaveStyleInlineBrackets = hasWeaveStyleInlineBrackets;\n choice.condition = conditionExpr;\n choice.onceOnly = onceOnlyChoice;\n choice.isInvisibleDefault = emptyContent;\n return choice;\n };\n\n public readonly ChoiceCondition = (): Expression | null => {\n const conditions = this.Interleave<Expression>(\n this.ChoiceSingleCondition,\n this.ChoiceConditionsSpace\n );\n\n if (conditions === null) {\n return null;\n } else if (conditions.length === 1) {\n return conditions[0];\n }\n\n return new MultipleConditionExpression(conditions);\n };\n\n public readonly ChoiceConditionsSpace = (): typeof ParseSuccess => {\n // Both optional\n // Newline includes initial end of line whitespace\n this.Newline();\n this.Whitespace();\n\n return ParseSuccess;\n };\n\n public readonly ChoiceSingleCondition = (): Expression | null => {\n if (this.ParseString(\"{\") === null) {\n return null;\n }\n\n const condExpr = this.Expect(\n this.Expression,\n \"choice condition inside { }\"\n ) as Expression;\n\n this.DisallowIncrement(condExpr);\n this.Expect(this.String(\"}\"), \"closing '}' for choice condition\");\n\n return condExpr;\n };\n\n public readonly Gather = (): Gather | null => {\n const gatherDashCountObj: number = this.Parse(this.GatherDashes) as number;\n if (gatherDashCountObj === null) {\n return null;\n }\n\n const gatherDashCount: number = Number(gatherDashCountObj);\n\n // Optional name for the gather\n const optionalName: Identifier = this.Parse(\n this.BracketedName\n ) as Identifier;\n\n const gather = new Gather(optionalName, gatherDashCount);\n\n // Optional newline before gather's content begins\n this.Newline();\n\n return gather;\n };\n\n public readonly GatherDashes = (): number | null => {\n this.Whitespace();\n\n let gatherDashCount: number = 0;\n while (this.ParseDashNotArrow() !== null) {\n gatherDashCount += 1;\n this.Whitespace();\n }\n\n if (gatherDashCount === 0) {\n return null;\n }\n\n return gatherDashCount as number;\n };\n\n public readonly ParseDashNotArrow = () => {\n const ruleId = this.BeginRule();\n\n if (\n this.ParseString(\"->\") === null &&\n this.ParseSingleCharacter() === \"-\"\n ) {\n return this.SucceedRule(ruleId);\n }\n\n return this.FailRule(ruleId);\n };\n\n public readonly BracketedName = (): Identifier | null => {\n if (this.ParseString(\"(\") === null) {\n return null;\n }\n\n this.Whitespace();\n\n const name = this.Parse(this.IdentifierWithMetadata) as Identifier | null;\n if (name === null) {\n return null;\n }\n\n this.Whitespace();\n\n this.Expect(this.String(\")\"), \"closing ')' for bracketed name\");\n\n return name;\n };\n\n /**\n * End Choices section.\n */\n\n /**\n * Begin Conditional section.\n */\n\n public readonly InnerConditionalContent = (\n initialQueryExpression: Expression\n ): Conditional | null => {\n if (initialQueryExpression === undefined) {\n const initialQueryExpression = this.Parse(this.ConditionExpression);\n const conditional = this.Parse(() =>\n this.InnerConditionalContent(initialQueryExpression as Expression)\n ) as Conditional;\n\n if (conditional === null) {\n return null;\n }\n\n return conditional;\n }\n\n let alternatives: ConditionalSingleBranch[] | null;\n const canBeInline: boolean = initialQueryExpression !== null;\n const isInline: boolean = this.Parse(this.Newline) === null;\n\n if (isInline && !canBeInline) {\n return null;\n }\n\n if (isInline) {\n // Inline innards\n alternatives = this.InlineConditionalBranches();\n } else {\n // Multiline innards\n alternatives = this.MultilineConditionalBranches();\n\n if (alternatives === null) {\n // Allow single piece of content within multi-line expression, e.g.:\n // { true:\n // Some content that isn't preceded by '-'\n // }\n if (initialQueryExpression) {\n let soleContent: ParsedObject[] = this.StatementsAtLevel(\n StatementLevel.InnerBlock\n );\n if (soleContent !== null) {\n const soleBranch = new ConditionalSingleBranch(soleContent);\n alternatives = [soleBranch];\n\n // Also allow a final \"- else:\" clause\n const elseBranch = this.Parse(\n this.SingleMultilineCondition\n ) as ConditionalSingleBranch;\n if (elseBranch) {\n if (!elseBranch.isElse) {\n this.ErrorWithParsedObject(\n \"Expected an '- else:' clause here rather than an extra condition\",\n elseBranch\n );\n\n elseBranch.isElse = true;\n }\n\n alternatives.push(elseBranch);\n }\n }\n }\n\n // Still null?\n if (alternatives === null) {\n return null;\n }\n } else if (\n alternatives.length === 1 &&\n alternatives[0].isElse &&\n initialQueryExpression\n ) {\n // Empty true branch - didn't get parsed, but should insert one for semantic correctness,\n // and to make sure that any evaluation stack values get tidied up correctly.\n const emptyTrueBranch = new ConditionalSingleBranch(null);\n emptyTrueBranch.isTrueBranch = true;\n alternatives.unshift(emptyTrueBranch);\n }\n\n // Like a switch statement\n // { initialQueryExpression:\n // ... match the expression\n // }\n if (initialQueryExpression) {\n let earlierBranchesHaveOwnExpression: boolean = false;\n for (let ii = 0; ii < alternatives.length; ++ii) {\n const branch = alternatives[ii];\n const isLast: boolean = ii === alternatives.length - 1;\n\n // Matching equality with initial query expression\n // We set this flag even for the \"else\" clause so that\n // it knows to tidy up the evaluation stack at the end\n\n // Match query\n if (branch.ownExpression) {\n branch.matchingEquality = true;\n earlierBranchesHaveOwnExpression = true;\n } else if (earlierBranchesHaveOwnExpression && isLast) {\n // Else (final branch)\n branch.matchingEquality = true;\n branch.isElse = true;\n } else {\n // Binary condition:\n // { trueOrFalse:\n // - when true\n // - when false\n // }\n if (!isLast && alternatives.length > 2) {\n this.ErrorWithParsedObject(\n \"Only final branch can be an 'else'. Did you miss a ':'?\",\n branch\n );\n } else {\n if (ii === 0) {\n branch.isTrueBranch = true;\n } else {\n branch.isElse = true;\n }\n }\n }\n }\n } else {\n // No initial query, so just a multi-line conditional. e.g.:\n // {\n // - x > 3: greater than three\n // - x == 3: equal to three\n // - x < 3: less than three\n // }\n\n for (let ii = 0; ii < alternatives.length; ++ii) {\n const alt = alternatives[ii];\n const isLast: boolean = ii === alternatives.length - 1;\n\n if (alt.ownExpression === null) {\n if (isLast) {\n alt.isElse = true;\n } else {\n if (alt.isElse) {\n // Do we ALSO have a valid \"else\" at the end? Let's report the error there.\n const finalClause = alternatives[alternatives.length - 1];\n if (finalClause.isElse) {\n this.ErrorWithParsedObject(\n \"Multiple 'else' cases. Can have a maximum of one, at the end.\",\n finalClause\n );\n } else {\n this.ErrorWithParsedObject(\n \"'else' case in conditional should always be the final one\",\n alt\n );\n }\n } else {\n this.ErrorWithParsedObject(\n \"Branch doesn't have condition. Are you missing a ':'? \",\n alt\n );\n }\n }\n }\n }\n\n if (\n alternatives.length === 1 &&\n alternatives[0].ownExpression === null\n ) {\n this.ErrorWithParsedObject(\n \"Condition block with no conditions\",\n alternatives[0]\n );\n }\n }\n }\n\n // TODO: Come up with water-tight error conditions... it's quite a flexible system!\n // e.g.\n // - inline conditionals must have exactly 1 or 2 alternatives\n // - multiline expression shouldn't have mixed existence of branch-conditions?\n if (alternatives === null) {\n return null;\n }\n\n for (const branch of alternatives) {\n branch.isInline = isInline;\n }\n\n const cond = new Conditional(initialQueryExpression, alternatives);\n\n return cond;\n };\n\n public readonly InlineConditionalBranches = ():\n | ConditionalSingleBranch[]\n | null => {\n const listOfLists = this.Interleave<ParsedObject[]>(\n this.MixedTextAndLogic,\n this.Exclude(this.String(\"|\")),\n null,\n false\n );\n\n if (listOfLists === null || listOfLists.length === 0) {\n return null;\n }\n\n const result: ConditionalSingleBranch[] = [];\n\n if (listOfLists.length > 2) {\n this.Error(\n \"Expected one or two alternatives separated by '|' in inline conditional\"\n );\n } else {\n const trueBranch = new ConditionalSingleBranch(listOfLists[0]);\n trueBranch.isTrueBranch = true;\n result.push(trueBranch);\n\n if (listOfLists.length > 1) {\n const elseBranch = new ConditionalSingleBranch(listOfLists[1]);\n elseBranch.isElse = true;\n result.push(elseBranch);\n }\n }\n\n return result;\n };\n\n public readonly MultilineConditionalBranches = ():\n | ConditionalSingleBranch[]\n | null => {\n this.MultilineWhitespace();\n\n const multipleConditions = this.OneOrMore(this.SingleMultilineCondition);\n if (multipleConditions === null) {\n return null;\n }\n\n this.MultilineWhitespace();\n\n return multipleConditions as ConditionalSingleBranch[];\n };\n\n public readonly SingleMultilineCondition =\n (): ConditionalSingleBranch | null => {\n this.Whitespace();\n\n if (\n // Make sure we're not accidentally parsing a divert\n this.ParseString(\"->\") !== null ||\n this.ParseString(\"-\") === null\n ) {\n return null;\n }\n\n this.Whitespace();\n\n let expr: Expression | null = null;\n const isElse: boolean = this.Parse(this.ElseExpression) !== null;\n\n if (!isElse) {\n expr = this.Parse(this.ConditionExpression) as Expression;\n }\n\n let content: ParsedObject[] = this.StatementsAtLevel(\n StatementLevel.InnerBlock\n );\n if (expr === null && content === null) {\n this.Error(\"expected content for the conditional branch following '-'\");\n\n // Recover\n content = [new Text(\"\")];\n }\n\n // Allow additional multiline whitespace, if the statements were empty (valid)\n // then their surrounding multiline whitespacce needs to be handled manually.\n // e.g.\n // { x:\n // - 1: // intentionally left blank, but newline needs to be parsed\n // - 2: etc\n // }\n this.MultilineWhitespace();\n\n const branch = new ConditionalSingleBranch(content);\n branch.ownExpression = expr;\n branch.isElse = isElse;\n\n return branch;\n };\n\n public readonly ConditionExpression = (): ParsedObject | null => {\n const expr = this.Parse(this.Expression) as ParsedObject;\n if (expr === null) {\n return null;\n }\n\n this.DisallowIncrement(expr);\n\n this.Whitespace();\n\n if (this.ParseString(\":\") === null) {\n return null;\n }\n\n return expr;\n };\n\n public readonly ElseExpression = (): typeof ParseSuccess | null => {\n if (this.ParseString(\"else\") === null) {\n return null;\n }\n\n this.Whitespace();\n\n if (this.ParseString(\":\") === null) {\n return null;\n }\n\n return ParseSuccess;\n };\n\n /**\n * End Conditional section.\n */\n\n /**\n * Begin Content section.\n */\n\n public _nonTextPauseCharacters: CharacterSet | null = null;\n public _nonTextEndCharacters: CharacterSet | null = null;\n public _notTextEndCharactersChoice: CharacterSet | null = null;\n public _notTextEndCharactersString: CharacterSet | null = null;\n\n public readonly TrimEndWhitespace = (\n mixedTextAndLogicResults: ParsedObject[],\n terminateWithSpace: boolean\n ): void => {\n // Trim whitespace from end\n if (mixedTextAndLogicResults.length > 0) {\n const lastObjIdx = mixedTextAndLogicResults.length - 1;\n const lastObj = mixedTextAndLogicResults[lastObjIdx];\n if (lastObj instanceof Text) {\n const textObj: Text = lastObj;\n textObj.text = textObj.text.replace(new RegExp(/[ \\t]+$/g), \"\");\n\n if (terminateWithSpace) {\n textObj.text += \" \";\n } else if (textObj.text.length === 0) {\n // No content left at all? trim the whole object\n mixedTextAndLogicResults.splice(lastObjIdx, 1);\n\n // Recurse in case there's more whitespace\n this.TrimEndWhitespace(mixedTextAndLogicResults, false);\n }\n }\n }\n };\n\n public readonly LineOfMixedTextAndLogic = (): ParsedObject[] | null => {\n // Consume any whitespace at the start of the line\n // (Except for escaped whitespace)\n this.Parse(this.Whitespace);\n\n let result: ParsedObject[] = this.Parse(\n this.MixedTextAndLogic\n ) as ParsedObject[];\n\n if (!result || !result.length) {\n return null;\n }\n\n // Warn about accidentally writing \"return\" without \"~\"\n const firstText = result[0] as Text;\n if (firstText && firstText.text && firstText.text.startsWith(\"return\")) {\n this.Warning(\n \"Do you need a '~' before 'return'? If not, perhaps use a glue: <> (since it's lowercase) or rewrite somehow?\"\n );\n }\n\n if (result.length === 0) {\n return null;\n }\n\n const lastObj = result[result.length - 1];\n if (!(lastObj instanceof Divert)) {\n this.TrimEndWhitespace(result, false);\n }\n\n this.EndTagIfNecessary(result);\n\n // If the line doens't actually contain any normal text content\n // but is in fact entirely a tag, then let's not append\n // a newline, since we want the tag (or tags) to be associated\n // with the line below rather than being completely independent.\n let lineIsPureTag =\n result.length > 0 && result[0] instanceof Tag && result[0].isStart;\n\n if (!lineIsPureTag) {\n result.push(new Text(\"\\n\"));\n }\n\n this.Expect(this.EndOfLine, \"end of line\", this.SkipToNextLine);\n return result;\n };\n\n public readonly MixedTextAndLogic = (): ParsedObject[] | null => {\n // Check for disallowed \"~\" within this context\n const disallowedTilde = this.ParseObject(this.Spaced(this.String(\"~\")));\n if (disallowedTilde !== null) {\n this.Error(\n \"You shouldn't use a '~' here - tildas are for logic that's on its own line. To do inline logic, use { curly braces } instead\"\n );\n }\n\n // Either, or both interleaved\n let results: ParsedObject[] = this.Interleave<ParsedObject>(\n this.Optional(this.ContentText),\n this.Optional(this.InlineLogicOrGlueOrStartTag)\n );\n\n // Terminating divert?\n // (When parsing content for the text of a choice, diverts aren't allowed.\n // The divert on the end of the body of a choice is handled specially.)\n if (!this._parsingChoice) {\n const diverts: ParsedObject[] = this.Parse(\n this.MultiDivert\n ) as ParsedObject[];\n if (diverts !== null) {\n // May not have had any results at all if there's *only* a divert!\n if (results === null) {\n results = [];\n }\n\n // End previously active tag if necessary\n this.EndTagIfNecessary(results);\n\n this.TrimEndWhitespace(results, true);\n\n results.push(...diverts);\n }\n }\n\n if (!results) {\n return null;\n }\n\n return results;\n };\n\n public readonly ContentText = () => {\n return this.ContentTextAllowingEscapeChar();\n };\n\n public readonly ContentTextAllowingEscapeChar = (): Text | null => {\n let sb: string | null = null;\n\n do {\n let str = this.Parse(this.ContentTextNoEscape);\n const gotEscapeChar: boolean = this.ParseString(\"\\\\\") !== null;\n\n if (gotEscapeChar || str !== null) {\n if (sb === null) {\n sb = \"\";\n }\n\n if (str !== null) {\n sb += String(str);\n }\n\n if (gotEscapeChar) {\n const c: string = this.ParseSingleCharacter();\n sb += c;\n }\n } else {\n break;\n }\n } while (true);\n\n if (sb !== null) {\n return new Text(sb);\n }\n\n return null;\n };\n\n // Content text is an unusual parse rule compared with most since it's\n // less about saying \"this is is the small selection of stuff that we parse\"\n // and more \"we parse ANYTHING except this small selection of stuff\".\n public readonly ContentTextNoEscape = (): string | null => {\n // Eat through text, pausing at the following characters, and\n // attempt to parse the nonTextRule.\n // \"-\": possible start of divert or start of gather\n // \"<\": possible start of glue\n if (this._nonTextPauseCharacters === null) {\n this._nonTextPauseCharacters = new CharacterSet(\"-<\");\n }\n\n // If we hit any of these characters, we stop *immediately* without bothering to even check the nonTextRule\n // \"{\" for start of logic\n // \"|\" for mid logic branch\n if (this._nonTextEndCharacters === null) {\n this._nonTextEndCharacters = new CharacterSet(\"{}|\\n\\r\\\\#\");\n this._notTextEndCharactersChoice = new CharacterSet(\n this._nonTextEndCharacters\n );\n this._notTextEndCharactersChoice.AddCharacters(\"[]\");\n this._notTextEndCharactersString = new CharacterSet(\n this._nonTextEndCharacters\n );\n this._notTextEndCharactersString.AddCharacters('\"');\n }\n\n // When the ParseUntil pauses, check these rules in case they evaluate successfully\n const nonTextRule: ParseRule = () =>\n this.OneOf([\n this.ParseDivertArrow,\n this.ParseThreadArrow,\n this.EndOfLine,\n this.Glue,\n ]);\n\n let endChars: CharacterSet | null = null;\n if (this.parsingStringExpression) {\n endChars = this._notTextEndCharactersString;\n } else if (this._parsingChoice) {\n endChars = this._notTextEndCharactersChoice;\n } else {\n endChars = this._nonTextEndCharacters;\n }\n\n const pureTextContent: string = this.ParseUntil(\n nonTextRule,\n this._nonTextPauseCharacters,\n endChars\n );\n\n if (pureTextContent !== null) {\n return pureTextContent;\n }\n\n return null;\n };\n\n /**\n * End Content section.\n */\n\n /**\n * Begin Divert section.\n */\n\n public readonly MultiDivert = (): ParsedObject[] | null => {\n this.Whitespace();\n\n let diverts: ParsedObject[] = [];\n\n // Try single thread first\n const threadDivert = this.Parse(this.StartThread) as ParsedObject;\n if (threadDivert) {\n diverts = [threadDivert];\n\n return diverts;\n }\n\n // Normal diverts and tunnels\n const arrowsAndDiverts = this.Interleave<ParsedObject>(\n this.ParseDivertArrowOrTunnelOnwards,\n this.DivertIdentifierWithArguments\n );\n\n if (!arrowsAndDiverts) {\n return null;\n }\n\n diverts = [];\n\n this.EndTagIfNecessary(diverts);\n\n // Possible patterns:\n // -> -- explicit gather\n // ->-> -- tunnel onwards\n // -> div -- normal divert\n // ->-> div -- tunnel onwards, followed by override divert\n // -> div -> -- normal tunnel\n // -> div ->-> -- tunnel then tunnel continue\n // -> div -> div -- tunnel then divert\n // -> div -> div -> -- tunnel then tunnel\n // -> div -> div ->->\n // -> div -> div ->-> div (etc)\n\n // Look at the arrows and diverts\n for (let ii = 0; ii < arrowsAndDiverts.length; ++ii) {\n const isArrow: boolean = ii % 2 === 0;\n\n // Arrow string\n if (isArrow) {\n // Tunnel onwards\n if ((arrowsAndDiverts[ii] as any) === \"->->\") {\n const tunnelOnwardsPlacementValid: boolean =\n ii === 0 ||\n ii === arrowsAndDiverts.length - 1 ||\n ii === arrowsAndDiverts.length - 2;\n\n if (!tunnelOnwardsPlacementValid) {\n this.Error(\n \"Tunnel onwards '->->' must only come at the begining or the start of a divert\"\n );\n }\n\n const tunnelOnwards = new TunnelOnwards();\n if (ii < arrowsAndDiverts.length - 1) {\n const tunnelOnwardDivert = asOrNull(\n arrowsAndDiverts[ii + 1],\n Divert\n );\n tunnelOnwards.divertAfter = tunnelOnwardDivert;\n }\n\n diverts.push(tunnelOnwards);\n\n // Not allowed to do anything after a tunnel onwards.\n // If we had anything left it would be caused in the above Error for\n // the positioning of a ->->\n break;\n }\n } else {\n // Divert\n const divert = arrowsAndDiverts[ii] as Divert;\n // More to come? (further arrows) Must be tunnelling.\n if (ii < arrowsAndDiverts.length - 1) {\n divert.isTunnel = true;\n }\n\n diverts.push(divert);\n }\n }\n\n // Single -> (used for default choices)\n if (diverts.length === 0 && arrowsAndDiverts.length === 1) {\n const gatherDivert = new Divert(null);\n gatherDivert.isEmpty = true;\n diverts.push(gatherDivert);\n\n if (!this._parsingChoice) {\n this.Error(\"Empty diverts (->) are only valid on choices\");\n }\n }\n\n return diverts;\n };\n\n public readonly StartThread = (): Divert | null => {\n this.Whitespace();\n\n if (this.ParseThreadArrow() === null) {\n return null;\n }\n\n this.Whitespace();\n\n const divert = this.Expect(\n this.DivertIdentifierWithArguments,\n \"target for new thread\",\n () => new Divert(null)\n ) as Divert;\n\n divert.isThread = true;\n\n return divert;\n };\n\n public readonly DivertIdentifierWithArguments = (): Divert | null => {\n this.Whitespace();\n\n const targetComponents: Identifier[] = this.Parse(\n this.DotSeparatedDivertPathComponents\n ) as Identifier[];\n\n if (!targetComponents) {\n return null;\n }\n\n this.Whitespace();\n\n const optionalArguments = this.Parse(\n this.ExpressionFunctionCallArguments\n ) as Expression[];\n\n this.Whitespace();\n\n const targetPath = new Path(targetComponents);\n\n return new Divert(targetPath, optionalArguments);\n };\n\n public readonly SingleDivert = (): Divert | null => {\n const diverts = this.Parse(this.MultiDivert) as ParsedObject[];\n if (!diverts) {\n return null;\n }\n\n // Ideally we'd report errors if we get the\n // wrong kind of divert, but unfortunately we\n // have to hack around the fact that sequences use\n // a very similar syntax.\n // i.e. if you have a multi-divert at the start\n // of a sequence, it initially tries to parse it\n // as a divert target (part of an expression of\n // a conditional) and gives errors. So instead\n // we just have to blindly reject it as a single\n // divert, and give a slightly less nice error\n // when you DO use a multi divert as a divert taret.\n\n if (diverts.length !== 1) {\n return null;\n }\n\n const singleDivert = diverts[0];\n if (singleDivert instanceof TunnelOnwards) {\n return null;\n }\n\n const divert = diverts[0] as Divert;\n if (divert.isTunnel) {\n return null;\n }\n\n return divert;\n };\n\n public readonly DotSeparatedDivertPathComponents = (): Identifier[] =>\n this.Interleave<Identifier>(\n this.Spaced(this.IdentifierWithMetadata),\n this.Exclude(this.String(\".\"))\n );\n\n public readonly ParseDivertArrowOrTunnelOnwards = (): string | null => {\n let numArrows: number = 0;\n while (this.ParseString(\"->\") !== null) {\n numArrows += 1;\n }\n\n if (numArrows === 0) {\n return null;\n } else if (numArrows === 1) {\n return \"->\";\n } else if (numArrows === 2) {\n return \"->->\";\n }\n\n this.Error(\n \"Unexpected number of arrows in divert. Should only have '->' or '->->'\"\n );\n\n return \"->->\";\n };\n\n public readonly ParseDivertArrow = () => this.ParseString(\"->\");\n\n public readonly ParseThreadArrow = () => this.ParseString(\"<-\");\n\n /**\n * End Divert section.\n */\n\n /**\n * Begin Expressions section.\n */\n\n public _binaryOperators: InfixOperator[] = [];\n public _maxBinaryOpLength: number = 0;\n\n public readonly TempDeclarationOrAssignment = (): ParsedObject | null => {\n this.Whitespace();\n\n const isNewDeclaration: boolean = this.ParseTempKeyword();\n\n this.Whitespace();\n\n let varIdentifier: Identifier | null = null;\n if (isNewDeclaration) {\n varIdentifier = this.Expect(\n this.IdentifierWithMetadata,\n \"variable name\"\n ) as Identifier;\n } else {\n varIdentifier = this.Parse(this.IdentifierWithMetadata) as Identifier;\n }\n\n if (varIdentifier === null) {\n return null;\n }\n\n this.Whitespace();\n\n // += -=\n const isIncrement: boolean = this.ParseString(\"+\") !== null;\n const isDecrement: boolean = this.ParseString(\"-\") !== null;\n\n if (isIncrement && isDecrement) {\n this.Error(\"Unexpected sequence '+-'\");\n }\n\n if (this.ParseString(\"=\") === null) {\n // Definitely in an assignment expression?\n if (isNewDeclaration) {\n this.Error(\"Expected '='\");\n }\n\n return null;\n }\n\n const assignedExpression: Expression = this.Expect(\n this.Expression,\n \"value expression to be assigned\"\n ) as Expression;\n\n if (isIncrement || isDecrement) {\n const result = new IncDecExpression(\n varIdentifier,\n assignedExpression,\n isIncrement\n );\n return result;\n }\n\n const result = new VariableAssignment({\n variableIdentifier: varIdentifier,\n assignedExpression,\n isTemporaryNewDeclaration: isNewDeclaration,\n });\n\n return result;\n };\n\n public readonly DisallowIncrement = (expr: ParsedObject): void => {\n if (expr instanceof IncDecExpression) {\n this.Error(\n \"Can't use increment/decrement here. It can only be used on a ~ line\"\n );\n }\n };\n\n public readonly ParseTempKeyword = () => {\n const ruleId = this.BeginRule();\n\n if (this.Parse(this.Identifier) === \"temp\") {\n this.SucceedRule(ruleId);\n return true;\n }\n\n this.FailRule(ruleId);\n return false;\n };\n\n public readonly ReturnStatement = (): ReturnType | null => {\n this.Whitespace();\n\n const returnOrDone = this.Parse(this.Identifier);\n if (returnOrDone !== \"return\") {\n return null;\n }\n\n this.Whitespace();\n\n const expr = this.Parse(this.Expression) as Expression;\n\n const returnObj = new ReturnType(expr);\n\n return returnObj;\n };\n\n // Pratt Parser\n // aka \"Top down operator precedence parser\"\n // http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/\n // Algorithm overview:\n // The two types of precedence are handled in two different ways:\n // ((((a . b) . c) . d) . e)\t\t\t#1\n // (a . (b . (c . (d . e))))\t\t\t#2\n // Where #1 is automatically handled by successive loops within the main 'while' in this function,\n // so long as continuing operators have lower (or equal) precedence (e.g. imagine some series of \"*\"s then \"+\" above.\n // ...and #2 is handled by recursion of the right hand term in the binary expression parser.\n // (see link for advice on how to extend for postfix and mixfix operators)\n public readonly Expression = (\n minimumPrecedence: number = 0\n ): Expression | null => {\n this.Whitespace();\n\n // First parse a unary expression e.g. \"-a\" or parethensised \"(1 + 2)\"\n let expr = this.ExpressionUnary();\n if (expr === null) {\n return null;\n }\n\n this.Whitespace();\n\n // Attempt to parse (possibly multiple) continuing infix expressions (e.g. 1 + 2 + 3)\n while (true) {\n const ruleId = this.BeginRule();\n\n // Operator\n const infixOp = this.ParseInfixOperator();\n if (infixOp !== null && infixOp.precedence > minimumPrecedence) {\n // Expect right hand side of operator\n const expectationMessage = `right side of '${infixOp.type}' expression`;\n const multiaryExpr = this.Expect(\n () => this.ExpressionInfixRight(expr, infixOp),\n expectationMessage\n );\n\n if (multiaryExpr === null) {\n // Fail for operator and right-hand side of multiary expression\n this.FailRule(ruleId);\n\n return null;\n }\n\n expr = this.SucceedRule(ruleId, multiaryExpr) as Expression;\n\n continue;\n }\n\n this.FailRule(ruleId);\n break;\n }\n\n this.Whitespace();\n\n return expr;\n };\n\n public readonly ExpressionUnary = (): Expression | null => {\n // Divert target is a special case - it can't have any other operators\n // applied to it, and we also want to check for it first so that we don't\n // confuse \"->\" for subtraction.\n const divertTarget = this.Parse(this.ExpressionDivertTarget) as Expression;\n if (divertTarget !== null) {\n return divertTarget;\n }\n\n let prefixOp: Expression = this.OneOf([\n this.String(\"-\"),\n this.String(\"!\"),\n ]) as Expression;\n\n // Don't parse like the string rules above, in case its actually\n // a variable that simply starts with \"not\", e.g. \"notable\".\n // This rule uses the Identifier rule, which will scan as much text\n // as possible before returning.\n if (prefixOp === null) {\n prefixOp = this.Parse(this.ExpressionNot) as Expression;\n }\n\n this.Whitespace();\n\n // - Since we allow numbers at the start of variable names, variable names are checked before literals\n // - Function calls before variable names in case we see parentheses\n let expr = this.OneOf([\n this.ExpressionList,\n this.ExpressionParen,\n this.ExpressionFunctionCall,\n this.ExpressionVariableName,\n this.ExpressionLiteral,\n ]) as Expression | null;\n\n // Only recurse immediately if we have one of the (usually optional) unary ops\n if (expr === null && prefixOp !== null) {\n expr = this.ExpressionUnary();\n }\n\n if (expr === null) {\n return null;\n } else if (prefixOp !== null) {\n expr = UnaryExpression.WithInner(expr, prefixOp as any) as Expression;\n }\n\n this.Whitespace();\n\n const postfixOp = this.OneOf([this.String(\"++\"), this.String(\"--\")]);\n\n if (postfixOp !== null) {\n const isInc: boolean = postfixOp === \"++\";\n\n if (!(expr instanceof VariableReference)) {\n this.Error(\n `can only increment and decrement variables, but saw '${expr}'.`\n );\n\n // Drop down and succeed without the increment after reporting error\n } else {\n const varRef = expr as VariableReference;\n expr = new IncDecExpression(varRef.identifier, isInc);\n }\n }\n\n return expr;\n };\n\n public readonly ExpressionNot = (): string | null => {\n const id = this.Identifier();\n if (id === \"not\") {\n return id;\n }\n\n return null;\n };\n\n public readonly ExpressionLiteral = (): Expression =>\n this.OneOf([\n this.ExpressionFloat,\n this.ExpressionInt,\n this.ExpressionBool,\n this.ExpressionString,\n ]) as Expression;\n\n public readonly ExpressionDivertTarget = (): Expression | null => {\n this.Whitespace();\n\n const divert = this.Parse(this.SingleDivert) as Divert;\n if (!divert || (divert && divert.isThread)) {\n return null;\n }\n\n this.Whitespace();\n\n return new DivertTarget(divert);\n };\n\n public readonly ExpressionInt = (): NumberExpression | null => {\n const intOrNull: number = this.ParseInt() as number;\n if (intOrNull === null) {\n return null;\n }\n\n return new NumberExpression(intOrNull, \"int\");\n };\n\n public readonly ExpressionFloat = (): NumberExpression | null => {\n const floatOrNull: number = this.ParseFloat() as number;\n if (floatOrNull === null) {\n return null;\n }\n\n return new NumberExpression(floatOrNull, \"float\");\n };\n\n public readonly ExpressionString = (): StringExpression | null => {\n const openQuote = this.ParseString('\"');\n if (openQuote === null) {\n return null;\n }\n\n // Set custom parser state flag so that within the text parser,\n // it knows to treat the quote character (\") as an end character\n this.parsingStringExpression = true;\n\n let textAndLogic: ParsedObject[] = this.Parse(\n this.MixedTextAndLogic\n ) as ParsedObject[];\n\n this.Expect(this.String('\"'), \"close quote for string expression\");\n\n this.parsingStringExpression = false;\n\n if (textAndLogic === null) {\n textAndLogic = [new Text(\"\")];\n } else if (textAndLogic.find((c) => c instanceof Divert)) {\n this.Error(\"String expressions cannot contain diverts (->)\");\n }\n\n return new StringExpression(textAndLogic);\n };\n\n public readonly ExpressionBool = (): NumberExpression | null => {\n const id = this.Parse(this.Identifier);\n if (id === \"true\") {\n return new NumberExpression(true, \"bool\");\n } else if (id === \"false\") {\n return new NumberExpression(false, \"bool\");\n }\n\n return null;\n };\n\n public readonly ExpressionFunctionCall = (): Expression | null => {\n const iden = this.Parse(this.IdentifierWithMetadata);\n if (iden === null) {\n return null;\n }\n\n this.Whitespace();\n\n const args = this.Parse(this.ExpressionFunctionCallArguments);\n if (args === null) {\n return null;\n }\n\n return new FunctionCall(iden as Identifier, args as any);\n };\n\n public readonly ExpressionFunctionCallArguments = (): Expression[] | null => {\n if (this.ParseString(\"(\") === null) {\n return null;\n }\n\n // \"Exclude\" requires the rule to succeed, but causes actual comma string to be excluded from the list of results\n const commas: ParseRule = this.Exclude(this.String(\",\"));\n let args = this.Interleave<Expression>(this.Expression, commas);\n if (args === null) {\n args = [];\n }\n\n this.Whitespace();\n\n this.Expect(this.String(\")\"), \"closing ')' for function call\");\n\n return args;\n };\n\n public readonly ExpressionVariableName = (): Expression | null => {\n const path = this.Interleave<Identifier>(\n this.IdentifierWithMetadata,\n this.Exclude(this.Spaced(this.String(\".\")))\n );\n\n if (path === null || Story.IsReservedKeyword(path[0].name)) {\n return null;\n }\n\n return new VariableReference(path);\n };\n\n public readonly ExpressionParen = (): Expression | null => {\n if (this.ParseString(\"(\") === null) {\n return null;\n }\n\n const innerExpr = this.Parse(this.Expression) as Expression;\n if (innerExpr === null) {\n return null;\n }\n\n this.Whitespace();\n\n this.Expect(this.String(\")\"), \"closing parenthesis ')' for expression\");\n\n return innerExpr;\n };\n\n public readonly ExpressionInfixRight = (\n left: Expression | null,\n op: InfixOperator\n ) => {\n if (!left) {\n return null;\n }\n\n this.Whitespace();\n\n const right = this.Parse(() =>\n this.Expression(op.precedence)\n ) as Expression;\n if (right) {\n // We assume that the character we use for the operator's type is the same\n // as that used internally by e.g. Runtime.Expression.Add, Runtime.Expression.Multiply etc\n const expr = new BinaryExpression(left, right, op.type);\n return expr;\n }\n\n return null;\n };\n\n private readonly ParseInfixOperator = (): InfixOperator | null => {\n for (const op of this._binaryOperators) {\n const ruleId: number = this.BeginRule();\n\n if (this.ParseString(op.type) !== null) {\n if (op.requireWhitespace) {\n if (this.Whitespace() === null) {\n this.FailRule(ruleId);\n\n continue;\n }\n }\n\n return this.SucceedRule(ruleId, op) as InfixOperator;\n }\n\n this.FailRule(ruleId);\n }\n\n return null;\n };\n\n public readonly ExpressionList = (): List | null => {\n this.Whitespace();\n\n if (this.ParseString(\"(\") === null) {\n return null;\n }\n\n this.Whitespace();\n\n // When list has:\n // - 0 elements (null list) - this is okay, it's an empty list: \"()\"\n // - 1 element - it could be confused for a single non-list related\n // identifier expression in brackets, but this is a useless thing\n // to do, so we reserve that syntax for a list with one item.\n // - 2 or more elements - normal!\n const memberNames: Identifier[] = this.SeparatedList(\n this.ListMember,\n this.Spaced(this.String(\",\"))\n ) as Identifier[];\n\n this.Whitespace();\n\n // May have failed to parse the inner list - the parentheses may\n // be for a normal expression\n if (this.ParseString(\")\") === null) {\n return null;\n }\n return new List(memberNames);\n };\n\n public readonly ListMember = (): Identifier | null => {\n this.Whitespace();\n\n let identifier: Identifier = this.Parse(\n this.IdentifierWithMetadata\n ) as Identifier;\n if (identifier === null) {\n return null;\n }\n\n const dot = this.ParseString(\".\");\n if (dot !== null) {\n const identifier2: Identifier = this.Expect(\n this.IdentifierWithMetadata,\n `element name within the set ${identifier}`\n ) as Identifier;\n\n identifier.name += `.${identifier2?.name}`;\n }\n\n this.Whitespace();\n\n return identifier;\n };\n\n public readonly RegisterExpressionOperators = () => {\n // These will be tried in order, so we need \"<=\" before \"<\"\n // for correctness\n\n this.RegisterBinaryOperator(\"&&\", 1);\n this.RegisterBinaryOperator(\"||\", 1);\n this.RegisterBinaryOperator(\"and\", 1, true);\n this.RegisterBinaryOperator(\"or\", 1, true);\n this.RegisterBinaryOperator(\"==\", 2);\n this.RegisterBinaryOperator(\">=\", 2);\n this.RegisterBinaryOperator(\"<=\", 2);\n this.RegisterBinaryOperator(\"<\", 2);\n this.RegisterBinaryOperator(\">\", 2);\n this.RegisterBinaryOperator(\"!=\", 2);\n\n // (apples, oranges) + cabbages has (oranges, cabbages) === true\n this.RegisterBinaryOperator(\"?\", 3);\n this.RegisterBinaryOperator(\"has\", 3, true);\n this.RegisterBinaryOperator(\"!?\", 3);\n this.RegisterBinaryOperator(\"hasnt\", 3, true);\n this.RegisterBinaryOperator(\"^\", 3);\n\n this.RegisterBinaryOperator(\"+\", 4);\n this.RegisterBinaryOperator(\"-\", 5);\n this.RegisterBinaryOperator(\"*\", 6);\n this.RegisterBinaryOperator(\"/\", 7);\n\n this.RegisterBinaryOperator(\"%\", 8);\n this.RegisterBinaryOperator(\"mod\", 8, true);\n };\n\n public readonly RegisterBinaryOperator = (\n op: string,\n precedence: number,\n requireWhitespace: boolean = false\n ): void => {\n const infix = new InfixOperator(op, precedence, requireWhitespace);\n this._binaryOperators.push(infix);\n this._maxBinaryOpLength = Math.max(this._maxBinaryOpLength, op.length);\n };\n\n /**\n * End Expressions section.\n */\n\n /**\n * Begin Include section.\n */\n\n private _rootParser: InkParser;\n private _openFilenames: string[] = [];\n\n public readonly IncludeStatement = () => {\n this.Whitespace();\n\n if (this.ParseString(\"INCLUDE\") === null) {\n return null;\n }\n\n this.Whitespace();\n\n let filename: string = this.Expect(\n () => this.ParseUntilCharactersFromString(\"\\n\\r\"),\n \"filename for include statement\"\n ) as string;\n\n filename = filename.replace(new RegExp(/[ \\t]+$/g), \"\");\n\n // Working directory should already have been set up relative to the root ink file.\n const fullFilename = this.fileHandler.ResolveInkFilename(filename);\n\n if (this.FilenameIsAlreadyOpen(fullFilename)) {\n this.Error(\n `Recursive INCLUDE detected: '${fullFilename}' is already open.`\n );\n this.ParseUntilCharactersFromString(\"\\r\\n\");\n return new IncludedFile(null);\n } else {\n this.AddOpenFilename(fullFilename);\n }\n\n let includedStory: Story | null = null;\n let includedString: string = \"\";\n try {\n includedString =\n this._rootParser.fileHandler.LoadInkFileContents(fullFilename);\n } catch (err) {\n this.Error(`Failed to load: '${filename}'.\\nError:${err}`);\n }\n\n if (includedString) {\n const parser: InkParser = new InkParser(\n includedString,\n filename,\n this._externalErrorHandler,\n this._rootParser,\n this.fileHandler\n );\n\n includedStory = parser.ParseStory();\n }\n\n this.RemoveOpenFilename(fullFilename);\n\n // Return valid IncludedFile object even if there were errors when parsing.\n // We don't want to attempt to re-parse the include line as something else,\n // and we want to include the bits that *are* valid, so we don't generate\n // more errors than necessary.\n return new IncludedFile(includedStory);\n };\n\n public readonly FilenameIsAlreadyOpen = (fullFilename: string): boolean =>\n this._rootParser._openFilenames.includes(fullFilename);\n\n public readonly AddOpenFilename = (fullFilename: string): void => {\n this._rootParser._openFilenames.push(fullFilename);\n };\n\n public readonly RemoveOpenFilename = (fullFilename: string) => {\n this._rootParser._openFilenames.splice(\n this._rootParser._openFilenames.indexOf(fullFilename),\n 1\n );\n };\n\n /**\n * End Include section.\n */\n\n /**\n * Begin Knot section.\n */\n\n public readonly KnotDefinition = (): Knot | null => {\n const knotDecl: FlowDecl = this.Parse(this.KnotDeclaration) as FlowDecl;\n if (knotDecl === null) {\n return null;\n }\n\n this.Expect(\n this.EndOfLine,\n \"end of line after knot name definition\",\n this.SkipToNextLine\n );\n\n const innerKnotStatements: ParseRule = (): ParsedObject[] =>\n this.StatementsAtLevel(StatementLevel.Knot);\n\n const content = this.Expect(\n innerKnotStatements,\n \"at least one line within the knot\",\n this.KnotStitchNoContentRecoveryRule\n ) as ParsedObject[];\n\n return new Knot(knotDecl.name, content, knotDecl.args, knotDecl.isFunction);\n };\n\n public readonly KnotDeclaration = (): FlowDecl | null => {\n this.Whitespace();\n\n if (this.KnotTitleEquals() === null) {\n return null;\n }\n\n this.Whitespace();\n\n const identifier: Identifier = this.Parse(\n this.IdentifierWithMetadata\n ) as Identifier;\n let knotName: Identifier;\n\n const isFunc: boolean = identifier?.name === \"function\";\n if (isFunc) {\n this.Expect(this.Whitespace, \"whitespace after the 'function' keyword\");\n\n knotName = this.Parse(this.IdentifierWithMetadata) as Identifier;\n } else {\n knotName = identifier;\n }\n\n if (knotName === null) {\n this.Error(`Expected the name of the ${isFunc ? \"function\" : \"knot\"}`);\n knotName = new Identifier(\"\"); // prevent later null ref\n }\n\n this.Whitespace();\n\n const parameterNames: Argument[] = this.Parse(\n this.BracketedKnotDeclArguments\n ) as Argument[];\n\n this.Whitespace();\n\n // Optional equals after name\n this.Parse(this.KnotTitleEquals);\n\n return new FlowDecl(knotName, parameterNames, isFunc);\n };\n\n public readonly KnotTitleEquals = (): string | null => {\n // 2+ \"=\" starts a knot\n const multiEquals = this.ParseCharactersFromString(\"=\");\n if (multiEquals === null || multiEquals.length <= 1) {\n return null;\n }\n\n return multiEquals;\n };\n\n public readonly StitchDefinition = (): ParseRuleReturn => {\n const decl = this.Parse(this.StitchDeclaration) as FlowDecl;\n if (decl === null) {\n return null;\n }\n\n this.Expect(\n this.EndOfLine,\n \"end of line after stitch name\",\n this.SkipToNextLine\n );\n\n const innerStitchStatements: ParseRule = () =>\n this.StatementsAtLevel(StatementLevel.Stitch);\n\n const content = this.Expect(\n innerStitchStatements,\n \"at least one line within the stitch\",\n this.KnotStitchNoContentRecoveryRule\n ) as ParsedObject[];\n\n return new Stitch(decl.name, content, decl.args, decl.isFunction);\n };\n\n public readonly StitchDeclaration = (): FlowDecl | null => {\n this.Whitespace();\n\n // Single \"=\" to define a stitch\n if (this.ParseString(\"=\") === null) {\n return null;\n }\n\n // If there's more than one \"=\", that's actually a knot definition (or divert), so this rule should fail\n if (this.ParseString(\"=\") !== null) {\n return null;\n }\n\n this.Whitespace();\n\n // Stitches aren't allowed to be functions, but we parse it anyway and report the error later\n const isFunc: boolean = this.ParseString(\"function\") !== null;\n if (isFunc) {\n this.Whitespace();\n }\n\n const stitchName: Identifier = this.Parse(\n this.IdentifierWithMetadata\n ) as Identifier;\n if (stitchName === null) {\n return null;\n }\n\n this.Whitespace();\n\n const flowArgs: Argument[] = this.Parse(\n this.BracketedKnotDeclArguments\n ) as Argument[];\n\n this.Whitespace();\n\n return new FlowDecl(stitchName, flowArgs, isFunc);\n };\n\n public readonly KnotStitchNoContentRecoveryRule = (): ParseRuleReturn => {\n // Jump ahead to the next knot or the end of the file\n this.ParseUntil(this.KnotDeclaration, new CharacterSet(\"=\"), null);\n\n const recoveredFlowContent: ParsedObject[] = [new Text(\"<ERROR IN FLOW>\")];\n\n return recoveredFlowContent;\n };\n\n public readonly BracketedKnotDeclArguments = (): Argument[] | null => {\n if (this.ParseString(\"(\") === null) {\n return null;\n }\n\n let flowArguments = this.Interleave<Argument>(\n this.Spaced(this.FlowDeclArgument),\n this.Exclude(this.String(\",\"))\n );\n\n this.Expect(this.String(\")\"), \"closing ')' for parameter list\");\n\n // If no parameters, create an empty list so that this method is type safe and\n // doesn't attempt to return the ParseSuccess object\n if (flowArguments === null) {\n flowArguments = [];\n }\n\n return flowArguments;\n };\n\n public readonly FlowDeclArgument = (): Argument | null => {\n // Possible forms:\n // name\n // -> name (variable divert target argument\n // ref name\n // ref -> name (variable divert target by reference)\n const firstIden = this.Parse(this.IdentifierWithMetadata) as Identifier;\n this.Whitespace();\n\n const divertArrow = this.ParseDivertArrow();\n\n this.Whitespace();\n\n const secondIden = this.Parse(this.IdentifierWithMetadata) as Identifier;\n\n if (firstIden == null && secondIden === null) {\n return null;\n }\n\n const flowArg = new Argument();\n if (divertArrow !== null) {\n flowArg.isDivertTarget = true;\n }\n\n // Passing by reference\n if (firstIden !== null && firstIden.name === \"ref\") {\n if (secondIden === null) {\n this.Error(\"Expected an parameter name after 'ref'\");\n }\n\n flowArg.identifier = secondIden;\n flowArg.isByReference = true;\n } else {\n // Simple argument name\n if (flowArg.isDivertTarget) {\n flowArg.identifier = secondIden;\n } else {\n flowArg.identifier = firstIden;\n }\n\n if (flowArg.identifier === null) {\n this.Error(\"Expected an parameter name\");\n }\n\n flowArg.isByReference = false;\n }\n\n return flowArg;\n };\n\n public readonly ExternalDeclaration = (): ExternalDeclaration | null => {\n this.Whitespace();\n\n const external = this.Parse(\n this.IdentifierWithMetadata\n ) as Identifier | null;\n if (external === null || external.name != \"EXTERNAL\") {\n return null;\n }\n\n this.Whitespace();\n\n const funcIdentifier: Identifier =\n (this.Expect(\n this.IdentifierWithMetadata,\n \"name of external function\"\n ) as Identifier | null) || new Identifier(\"\");\n\n this.Whitespace();\n\n let parameterNames = this.Expect(\n this.BracketedKnotDeclArguments,\n `declaration of arguments for EXTERNAL, even if empty, i.e. 'EXTERNAL ${funcIdentifier}()'`\n ) as Argument[];\n\n if (parameterNames === null) {\n parameterNames = [];\n }\n\n const argNames = parameterNames\n .map((arg) => arg.identifier?.name)\n .filter(filterUndef);\n\n return new ExternalDeclaration(funcIdentifier, argNames);\n };\n\n /**\n * End Knot section.\n */\n\n /**\n * Start Logic section.\n */\n\n private _identifierCharSet: CharacterSet | null = null;\n\n get identifierCharSet(): CharacterSet {\n if (this._identifierCharSet === null) {\n (this._identifierCharSet = new CharacterSet())\n .AddRange(\"A\", \"Z\")\n .AddRange(\"a\", \"z\")\n .AddRange(\"0\", \"9\")\n .Add(\"_\");\n\n // Enable non-ASCII characters for story identifiers.\n this.ExtendIdentifierCharacterRanges(this._identifierCharSet);\n }\n\n return this._identifierCharSet;\n }\n\n public readonly LogicLine = (): ParsedObject | null => {\n this.Whitespace();\n\n if (this.ParseString(\"~\") === null) {\n return null;\n }\n\n this.Whitespace();\n\n // Some example lines we need to be able to distinguish between:\n // ~ temp x = 5 -- var decl + assign\n // ~ temp x -- var decl\n // ~ x = 5 -- var assign\n // ~ x -- expr (not var decl or assign)\n // ~ f() -- expr\n // We don't treat variable decl/assign as an expression since we don't want an assignment\n // to have a return value, or to be used in compound expressions.\n const afterTilde: ParseRule = () =>\n this.OneOf([\n this.ReturnStatement,\n this.TempDeclarationOrAssignment,\n this.Expression,\n ]);\n\n let result = this.Expect(\n afterTilde,\n \"expression after '~'\",\n this.SkipToNextLine\n ) as ParsedObject;\n\n // Prevent further errors, already reported expected expression and have skipped to next line.\n if (result === null) {\n return new ContentList();\n }\n\n // Parse all expressions, but tell the writer off if they did something useless like:\n // ~ 5 + 4\n // And even:\n // ~ false && myFunction()\n // ...since it's bad practice, and won't do what they expect if\n // they're expecting C's lazy evaluation.\n if (\n result instanceof Expression &&\n !(result instanceof FunctionCall || result instanceof IncDecExpression)\n ) {\n this.Error(\n \"Logic following a '~' can't be that type of expression. It can only be something like:\\n\\t~ return\\n\\t~ var x = blah\\n\\t~ x++\\n\\t~ myFunction()\"\n );\n }\n\n // Line is pure function call? e.g.\n // ~ f()\n // Add extra pop to make sure we tidy up after ourselves.\n // We no longer need anything on the evaluation stack.\n const funCall = asOrNull(result, FunctionCall);\n if (funCall) {\n funCall.shouldPopReturnedValue = true;\n }\n\n // If the expression contains a function call, then it could produce a text side effect,\n // in which case it needs a newline on the end. e.g.\n // ~ printMyName()\n // ~ x = 1 + returnAValueAndAlsoPrintStuff()\n // If no text gets printed, then the extra newline will have to be culled later.\n // Multiple newlines on the output will be removed, so there will be no \"leak\" for\n // long running calculations. It's disappointingly messy though :-/\n if (result.Find(FunctionCall)() !== null) {\n result = new ContentList(result as any, new Text(\"\\n\"));\n }\n\n this.Expect(this.EndOfLine, \"end of line\", this.SkipToNextLine);\n\n return result as ParsedObject;\n };\n\n public readonly VariableDeclaration = (): ParsedObject | null => {\n this.Whitespace();\n\n const id = this.Parse(this.Identifier);\n if (id !== \"VAR\") {\n return null;\n }\n\n this.Whitespace();\n\n const varName = this.Expect(\n this.IdentifierWithMetadata,\n \"variable name\"\n ) as Identifier;\n\n this.Whitespace();\n\n this.Expect(\n this.String(\"=\"),\n \"the '=' for an assignment of a value, e.g. '= 5' (initial values are mandatory)\"\n );\n\n this.Whitespace();\n\n const definition = this.Expect(this.Expression, \"initial value for \");\n\n const expr = definition as Expression;\n\n if (expr) {\n const check =\n expr instanceof NumberExpression ||\n expr instanceof StringExpression ||\n expr instanceof DivertTarget ||\n expr instanceof VariableReference ||\n expr instanceof List;\n\n if (!check) {\n this.Error(\n \"initial value for a variable must be a number, constant, list or divert target\"\n );\n }\n\n if (this.Parse(this.ListElementDefinitionSeparator) !== null) {\n this.Error(\n \"Unexpected ','. If you're trying to declare a new list, use the LIST keyword, not VAR\"\n );\n } else if (expr instanceof StringExpression) {\n // Ensure string expressions are simple\n const strExpr = expr as StringExpression;\n if (!strExpr.isSingleString) {\n this.Error(\"Constant strings cannot contain any logic.\");\n }\n }\n\n const result = new VariableAssignment({\n assignedExpression: expr,\n isGlobalDeclaration: true,\n variableIdentifier: varName,\n });\n\n return result;\n }\n\n return null;\n };\n\n public readonly ListDeclaration = (): VariableAssignment | null => {\n this.Whitespace();\n\n const id = this.Parse(this.Identifier);\n if (id != \"LIST\") {\n return null;\n }\n\n this.Whitespace();\n\n const varName = this.Expect(\n this.IdentifierWithMetadata,\n \"list name\"\n ) as Identifier;\n\n this.Whitespace();\n\n this.Expect(\n this.String(\"=\"),\n \"the '=' for an assignment of the list definition\"\n );\n\n this.Whitespace();\n\n const definition = this.Expect(\n this.ListDefinition,\n \"list item names\"\n ) as ListDefinition;\n\n if (definition) {\n definition.identifier = new Identifier(varName.name);\n return new VariableAssignment({\n variableIdentifier: varName,\n listDef: definition,\n });\n }\n\n return null;\n };\n\n public readonly ListDefinition = (): ListDefinition | null => {\n this.AnyWhitespace();\n\n const allElements = this.SeparatedList(\n this.ListElementDefinition,\n this.ListElementDefinitionSeparator\n ) as ListElementDefinition[];\n\n if (allElements === null) {\n return null;\n }\n\n return new ListDefinition(allElements);\n };\n\n public readonly ListElementDefinitionSeparator = (): string | null => {\n this.AnyWhitespace();\n\n if (this.ParseString(\",\") === null) {\n return null;\n }\n\n this.AnyWhitespace();\n\n return \",\";\n };\n\n public readonly ListElementDefinition = () => {\n const inInitialList = this.ParseString(\"(\") !== null;\n let needsToCloseParen = inInitialList;\n\n this.Whitespace();\n\n const name = this.Parse(this.IdentifierWithMetadata) as Identifier | null;\n if (name === null) {\n return null;\n }\n\n this.Whitespace();\n\n if (inInitialList) {\n if (this.ParseString(\")\") != null) {\n needsToCloseParen = false;\n this.Whitespace();\n }\n }\n\n let elementValue: number | null = null;\n if (this.ParseString(\"=\") !== null) {\n this.Whitespace();\n\n const elementValueNum = this.Expect(\n this.ExpressionInt,\n \"value to be assigned to list item\"\n ) as NumberExpression;\n\n if (elementValueNum !== null) {\n elementValue = elementValueNum.value as number;\n }\n\n if (needsToCloseParen) {\n this.Whitespace();\n\n if (this.ParseString(\")\") !== null) {\n needsToCloseParen = false;\n }\n }\n }\n\n if (needsToCloseParen) {\n this.Error(\"Expected closing ')'\");\n }\n\n return new ListElementDefinition(name, inInitialList, elementValue);\n };\n\n public readonly ConstDeclaration = (): ParsedObject | null => {\n this.Whitespace();\n\n const id = this.Parse(this.Identifier);\n if (id !== \"CONST\") {\n return null;\n }\n\n this.Whitespace();\n\n const varName = this.Expect(\n this.IdentifierWithMetadata,\n \"constant name\"\n ) as Identifier;\n\n this.Whitespace();\n\n this.Expect(\n this.String(\"=\"),\n \"the '=' for an assignment of a value, e.g. '= 5' (initial values are mandatory)\"\n );\n\n this.Whitespace();\n\n const expr = this.Expect(\n this.Expression,\n \"initial value for \"\n ) as Expression;\n\n const check =\n expr instanceof NumberExpression ||\n expr instanceof DivertTarget ||\n expr instanceof StringExpression;\n\n if (!check) {\n this.Error(\n \"initial value for a constant must be a number or divert target\"\n );\n } else if (expr instanceof StringExpression) {\n // Ensure string expressions are simple\n const strExpr = expr as StringExpression;\n if (!strExpr.isSingleString) {\n this.Error(\"Constant strings cannot contain any logic.\");\n }\n }\n\n const result = new ConstantDeclaration(varName, expr);\n\n return result;\n };\n\n public readonly InlineLogicOrGlueOrStartTag = (): ParsedObject =>\n this.OneOf([this.InlineLogic, this.Glue, this.StartTag]) as ParsedObject;\n\n public readonly Glue = (): Glue | null => {\n // Don't want to parse whitespace, since it might be important\n // surrounding the glue.\n const glueStr = this.ParseString(\"<>\");\n if (glueStr !== null) {\n return new Glue(new RuntimeGlue());\n }\n\n return null;\n };\n\n public readonly InlineLogic = () => {\n if (this.ParseString(\"{\") === null) {\n return null;\n }\n\n let wasParsingString = this.parsingStringExpression;\n let wasTagActive = this.tagActive;\n\n this.Whitespace();\n\n const logic = this.Expect(\n this.InnerLogic,\n \"some kind of logic, conditional or sequence within braces: { ... }\"\n ) as ParsedObject;\n\n if (logic === null) {\n this.parsingStringExpression = wasParsingString;\n return null;\n }\n\n this.DisallowIncrement(logic);\n\n let contentList = asOrNull(logic, ContentList);\n if (!contentList) {\n contentList = new ContentList(logic as any);\n }\n\n this.Whitespace();\n\n this.Expect(this.String(\"}\"), \"closing brace '}' for inline logic\");\n\n // Allow nested strings and logic\n this.parsingStringExpression = wasParsingString;\n\n // Difference between:\n //\n // 1) A thing # {image}.jpg\n // 2) A {red #red|blue #blue} sequence.\n //\n // When logic ends in (1) we still want tag to continue.\n // When logic ends in (2) we want to auto-end the tag.\n // Side note: we simply disallow tags within strings.\n if (!wasTagActive) this.EndTagIfNecessary(contentList);\n\n return contentList;\n };\n\n public readonly InnerLogic = (): ParsedObject | null => {\n this.Whitespace();\n\n // Explicitly try the combinations of inner logic\n // that could potentially have conflicts first.\n\n // Explicit sequence annotation?\n const explicitSeqType: SequenceType = this.ParseObject(\n this.SequenceTypeAnnotation\n ) as SequenceType;\n\n if (explicitSeqType !== null) {\n const contentLists = this.Expect(\n this.InnerSequenceObjects,\n \"sequence elements (for cycle/stoping etc)\"\n ) as ContentList[];\n\n if (contentLists === null) {\n return null;\n }\n\n return new Sequence(contentLists, explicitSeqType);\n }\n\n // Conditional with expression?\n const initialQueryExpression = this.Parse(\n this.ConditionExpression\n ) as Expression;\n if (initialQueryExpression) {\n const conditional = this.Expect(\n () => this.InnerConditionalContent(initialQueryExpression),\n \"conditional content following query\"\n ) as Conditional;\n\n return conditional;\n }\n\n // Now try to evaluate each of the \"full\" rules in turn\n const rules: ParseRule[] = [\n // Conditional still necessary, since you can have a multi-line conditional\n // without an initial query expression:\n // {\n // - true: this is true\n // - false: this is false\n // }\n this.InnerConditionalContent as ParseRule,\n this.InnerSequence,\n this.InnerExpression,\n ];\n\n let wasTagActiveAtStartOfScope = this.tagActive;\n\n // Adapted from \"OneOf\" structuring rule except that in\n // order for the rule to succeed, it has to maximally\n // cover the entire string within the { }. Used to\n // differentiate between:\n // {myVar} -- Expression (try first)\n // {my content is jolly} -- sequence with single element\n for (const rule of rules) {\n const ruleId: number = this.BeginRule();\n\n const result: ParsedObject = this.ParseObject(rule) as ParsedObject;\n if (result) {\n // Not yet at end?\n if (this.Peek(this.Spaced(this.String(\"}\"))) === null) {\n this.FailRule(ruleId);\n } else {\n // Full parse of content within braces\n return this.SucceedRule(ruleId, result) as ParsedObject;\n }\n } else {\n this.FailRule(ruleId);\n }\n }\n\n return null;\n };\n\n public readonly InnerExpression = (): ParsedObject => {\n const expr = this.Parse(this.Expression) as Expression;\n if (expr) {\n expr.outputWhenComplete = true;\n }\n\n return expr;\n };\n\n public readonly IdentifierWithMetadata = (): Identifier | null => {\n const id = this.Identifier();\n if (id === null) {\n return null;\n }\n return new Identifier(id);\n };\n\n // Note: we allow identifiers that start with a number,\n // but not if they *only* comprise numbers\n public readonly Identifier = (): string | null => {\n // Parse remaining characters (if any)\n const name = this.ParseCharactersFromCharSet(this.identifierCharSet);\n if (name === null) {\n return null;\n }\n\n // Reject if it's just a number\n let isNumberCharsOnly: boolean = true;\n for (let c of name) {\n if (!(c >= \"0\" && c <= \"9\")) {\n isNumberCharsOnly = false;\n break;\n }\n }\n\n if (isNumberCharsOnly) {\n return null;\n }\n\n return name;\n };\n\n /**\n * End Logic section.\n */\n\n /**\n * Begin Sequences section.\n */\n\n public _sequenceTypeSymbols: CharacterSet = new CharacterSet(\"!&~$\");\n\n public readonly InnerSequence = (): Sequence | null => {\n this.Whitespace();\n\n // Default sequence type\n let seqType: SequenceType = SequenceType.Stopping;\n\n // Optional explicit sequence type\n const parsedSeqType: SequenceType = this.Parse(\n this.SequenceTypeAnnotation\n ) as SequenceType;\n\n if (parsedSeqType !== null) {\n seqType = parsedSeqType;\n }\n\n const contentLists = this.Parse(this.InnerSequenceObjects) as ContentList[];\n if (contentLists === null || contentLists.length <= 1) {\n return null;\n }\n\n return new Sequence(contentLists, seqType);\n };\n\n public readonly SequenceTypeAnnotation = (): ParseRuleReturn => {\n let annotation = this.Parse(\n this.SequenceTypeSymbolAnnotation\n ) as SequenceType;\n\n if (annotation === null) {\n annotation = this.Parse(this.SequenceTypeWordAnnotation) as SequenceType;\n }\n\n if (annotation === null) {\n return null;\n }\n\n switch (annotation) {\n case SequenceType.Once:\n case SequenceType.Cycle:\n case SequenceType.Stopping:\n case SequenceType.Shuffle:\n case SequenceType.Shuffle | SequenceType.Stopping:\n case SequenceType.Shuffle | SequenceType.Once:\n break;\n default:\n this.Error(`Sequence type combination not supported: ${annotation}`);\n return SequenceType.Stopping;\n }\n\n return annotation;\n };\n\n public readonly SequenceTypeSymbolAnnotation = (): ParseRuleReturn => {\n if (this._sequenceTypeSymbols === null) {\n this._sequenceTypeSymbols = new CharacterSet(\"!&~$ \");\n }\n\n let sequenceType = 0 as SequenceType;\n const sequenceAnnotations = this.ParseCharactersFromCharSet(\n this._sequenceTypeSymbols\n );\n\n if (sequenceAnnotations === null) {\n return null;\n }\n\n for (const symbolChar of sequenceAnnotations) {\n switch (symbolChar) {\n case \"!\":\n sequenceType |= SequenceType.Once;\n break;\n case \"&\":\n sequenceType |= SequenceType.Cycle;\n break;\n case \"~\":\n sequenceType |= SequenceType.Shuffle;\n break;\n case \"$\":\n sequenceType |= SequenceType.Stopping;\n break;\n }\n }\n\n if (sequenceType === (0 as SequenceType)) {\n return null;\n }\n\n return sequenceType;\n };\n\n public readonly SequenceTypeWordAnnotation = (): ParseRuleReturn => {\n const sequenceTypes = this.Interleave<SequenceType | null>(\n this.SequenceTypeSingleWord,\n this.Exclude(this.Whitespace)\n );\n\n if (sequenceTypes === null || sequenceTypes.length === 0) {\n return null;\n }\n\n if (this.ParseString(\":\") === null) {\n return null;\n }\n\n let combinedSequenceType = 0 as SequenceType;\n for (const seqType of sequenceTypes) {\n combinedSequenceType |= seqType!;\n }\n\n return combinedSequenceType;\n };\n\n public readonly SequenceTypeSingleWord = () => {\n let seqType: SequenceType | null = null;\n\n const word = this.Parse(this.IdentifierWithMetadata) as Identifier | null;\n\n if (word !== null) {\n switch (word.name) {\n case \"once\":\n seqType = SequenceType.Once;\n break;\n case \"cycle\":\n seqType = SequenceType.Cycle;\n break;\n case \"shuffle\":\n seqType = SequenceType.Shuffle;\n break;\n case \"stopping\":\n seqType = SequenceType.Stopping;\n break;\n }\n }\n\n if (seqType === null) {\n return null;\n }\n\n return seqType;\n };\n\n public readonly InnerSequenceObjects = (): ContentList[] => {\n const multiline = this.Parse(this.Newline) !== null;\n\n let result: ContentList[] | null = null;\n if (multiline) {\n result = this.Parse(this.InnerMultilineSequenceObjects) as ContentList[];\n } else {\n result = this.Parse(this.InnerInlineSequenceObjects) as ContentList[];\n }\n\n return result;\n };\n\n public readonly InnerInlineSequenceObjects = (): ContentList[] | null => {\n const interleavedContentAndPipes = this.Interleave<ParsedObject>(\n this.Optional(this.MixedTextAndLogic),\n this.String(\"|\"),\n null,\n false\n );\n\n if (interleavedContentAndPipes === null) {\n return null;\n }\n\n const result = [];\n\n // The content and pipes won't necessarily be perfectly interleaved in the sense that\n // the content can be missing, but in that case it's intended that there's blank content.\n let justHadContent: boolean = false;\n for (const contentOrPipe of interleavedContentAndPipes) {\n // Pipe/separator\n if ((contentOrPipe as any) === \"|\") {\n // Expected content, saw pipe - need blank content now\n if (!justHadContent) {\n // Add blank content\n result.push(new ContentList());\n }\n\n justHadContent = false;\n } else {\n // Real content\n const content = contentOrPipe as any;\n if (content === null) {\n this.Error(\n `Expected content, but got ${contentOrPipe} (this is an ink compiler bug!)`\n );\n } else {\n result.push(new ContentList(content));\n }\n\n justHadContent = true;\n }\n }\n\n // Ended in a pipe? Need to insert final blank content\n if (!justHadContent) {\n result.push(new ContentList());\n }\n\n return result;\n };\n\n public readonly InnerMultilineSequenceObjects = (): ContentList[] | null => {\n this.MultilineWhitespace();\n\n const contentLists = this.OneOrMore(\n this.SingleMultilineSequenceElement\n ) as ContentList[];\n if (contentLists === null) {\n return null;\n }\n\n return contentLists;\n };\n\n public readonly SingleMultilineSequenceElement = () => {\n this.Whitespace();\n\n // Make sure we're not accidentally parsing a divert\n if (this.ParseString(\"->\") !== null) {\n return null;\n }\n\n if (this.ParseString(\"-\") === null) {\n return null;\n }\n\n this.Whitespace();\n\n const content: ParsedObject[] = this.StatementsAtLevel(\n StatementLevel.InnerBlock\n );\n\n if (content === null) {\n this.MultilineWhitespace();\n } else {\n // Add newline at the start of each branch\n content.unshift(new Text(\"\\n\"));\n }\n\n return new ContentList(content);\n };\n\n /**\n * End Sequences section.\n */\n\n /**\n * Begin Statements section.\n */\n\n private _statementRulesAtLevel: ParseRule[][] = [];\n private _statementBreakRulesAtLevel: ParseRule[][] = [];\n\n public readonly StatementsAtLevel = (\n level: StatementLevel\n ): ParsedObject[] => {\n // Check for error: Should not be allowed gather dashes within an inner block\n if (level === StatementLevel.InnerBlock) {\n const badGatherDashCount = this.Parse(this.GatherDashes) as ParsedObject;\n if (badGatherDashCount !== null) {\n this.Error(\n \"You can't use a gather (the dashes) within the { curly braces } context. For multi-line sequences and conditions, you should only use one dash.\"\n );\n }\n }\n\n return this.Interleave<ParsedObject>(\n this.Optional(this.MultilineWhitespace),\n () => this.StatementAtLevel(level),\n () => this.StatementsBreakForLevel(level)\n );\n };\n\n public readonly StatementAtLevel = (level: StatementLevel): ParsedObject => {\n const rulesAtLevel: ParseRule[] =\n this._statementRulesAtLevel[level as number];\n const statement = this.OneOf(rulesAtLevel) as ReturnType;\n\n // For some statements, allow them to parse, but create errors, since\n // writers may think they can use the statement, so it's useful to have\n // the error message.\n if (level === StatementLevel.Top) {\n if (statement instanceof ReturnType) {\n this.Error(\"should not have return statement outside of a knot\");\n }\n }\n\n return statement;\n };\n\n public readonly StatementsBreakForLevel = (\n level: StatementLevel\n ): ParseRuleReturn => {\n this.Whitespace();\n\n const breakRules: ParseRule[] =\n this._statementBreakRulesAtLevel[level as number];\n const breakRuleResult = this.OneOf(breakRules);\n if (breakRuleResult === null) {\n return null;\n }\n\n return breakRuleResult;\n };\n\n public readonly GenerateStatementLevelRules = () => {\n const levels = Object.values(StatementLevel);\n\n this._statementRulesAtLevel = \"f\"\n .repeat(levels.length)\n .split(\"f\")\n .map(() => []);\n\n this._statementBreakRulesAtLevel = \"f\"\n .repeat(levels.length)\n .split(\"f\")\n .map(() => []);\n\n for (const level of levels) {\n const rulesAtLevel: ParseRule[] = [];\n const breakingRules: ParseRule[] = [];\n\n // Diverts can go anywhere\n rulesAtLevel.push(this.Line(this.MultiDivert));\n\n // Knots can only be parsed at Top/Global scope\n if (level >= StatementLevel.Top) {\n rulesAtLevel.push(this.KnotDefinition);\n }\n\n rulesAtLevel.push(this.Line(this.Choice));\n\n rulesAtLevel.push(this.Line(this.AuthorWarning));\n\n // Gather lines would be confused with multi-line block separators, like\n // within a multi-line if statement\n if (level > StatementLevel.InnerBlock) {\n rulesAtLevel.push(this.Gather);\n }\n\n // Stitches (and gathers) can (currently) only go in Knots and top level\n if (level >= StatementLevel.Knot) {\n rulesAtLevel.push(this.StitchDefinition);\n }\n\n // Global variable declarations can go anywhere\n rulesAtLevel.push(this.Line(this.ListDeclaration));\n rulesAtLevel.push(this.Line(this.VariableDeclaration));\n rulesAtLevel.push(this.Line(this.ConstDeclaration));\n rulesAtLevel.push(this.Line(this.ExternalDeclaration));\n\n // Global include can go anywhere\n rulesAtLevel.push(this.Line(this.IncludeStatement));\n\n // Normal logic / text can go anywhere\n rulesAtLevel.push(this.LogicLine);\n rulesAtLevel.push(this.LineOfMixedTextAndLogic);\n\n // --------\n // Breaking rules\n\n // Break current knot with a new knot\n if (level <= StatementLevel.Knot) {\n breakingRules.push(this.KnotDeclaration);\n }\n\n // Break current stitch with a new stitch\n if (level <= StatementLevel.Stitch) {\n breakingRules.push(this.StitchDeclaration);\n }\n\n // Breaking an inner block (like a multi-line condition statement)\n if (level <= StatementLevel.InnerBlock) {\n breakingRules.push(this.ParseDashNotArrow);\n breakingRules.push(this.String(\"}\"));\n }\n\n this._statementRulesAtLevel[level as number] = rulesAtLevel;\n this._statementBreakRulesAtLevel[level as number] = breakingRules;\n }\n };\n\n public readonly SkipToNextLine = (): typeof ParseSuccess => {\n this.ParseUntilCharactersFromString(\"\\n\\r\");\n this.ParseNewline();\n\n return ParseSuccess;\n };\n\n // Modifier to turn a rule into one that expects a newline on the end.\n // e.g. anywhere you can use \"MixedTextAndLogic\" as a rule, you can use\n // \"Line(MixedTextAndLogic)\" to specify that it expects a newline afterwards.\n public readonly Line =\n (inlineRule: ParseRule): ParseRule =>\n () => {\n const result = this.ParseObject(inlineRule);\n if (result === null) {\n return null;\n }\n\n this.Expect(this.EndOfLine, \"end of line\", this.SkipToNextLine);\n\n return result;\n };\n\n /**\n * End Statements section.\n */\n\n /**\n * Begin Tags section.\n */\n\n public readonly StartTag = (): ParsedObject | null => {\n this.Whitespace();\n\n if (this.ParseString(\"#\") === null) {\n return null;\n }\n\n if (this.parsingStringExpression) {\n this.Error(\n \"Tags aren't allowed inside of strings. Please use \\\\# if you want a hash symbol.\"\n );\n }\n\n let result: ParsedObject | null = null;\n if (this.tagActive) {\n let contentList = new ContentList();\n contentList.AddContent(new Tag(/*isStart:*/ false));\n contentList.AddContent(new Tag(/*isStart:*/ true));\n result = contentList;\n } else {\n result = new Tag(/*isStart:*/ true);\n }\n this.tagActive = true;\n\n this.Whitespace();\n\n return result;\n };\n\n public EndTagIfNecessary(outputContentList: ParsedObject[] | null): void;\n public EndTagIfNecessary(outputContentList: ContentList | null): void;\n public EndTagIfNecessary(\n outputContentList: ParsedObject[] | ContentList | null\n ): void {\n if (this.tagActive) {\n if (outputContentList != null) {\n if (outputContentList instanceof ContentList) {\n outputContentList.AddContent(new Tag(/*isStart:*/ false));\n } else {\n outputContentList.push(new Tag(/*isStart:*/ false));\n }\n }\n this.tagActive = false;\n }\n }\n\n /**\n * End Tags section.\n */\n\n /**\n * Begin Whitespace section.\n */\n\n private _inlineWhitespaceChars: CharacterSet = new CharacterSet(\" \\t\");\n\n // Handles both newline and endOfFile\n public readonly EndOfLine = () => this.OneOf([this.Newline, this.EndOfFile]);\n\n // Allow whitespace before the actual newline\n public readonly Newline = (): typeof ParseSuccess | null => {\n this.Whitespace();\n\n const gotNewline: boolean = this.ParseNewline() !== null;\n\n // Optional \\r, definite \\n to support Windows (\\r\\n) and Mac/Unix (\\n)\n\n if (!gotNewline) {\n return null;\n }\n\n return ParseSuccess;\n };\n\n public readonly EndOfFile = (): typeof ParseSuccess | null => {\n this.Whitespace();\n\n if (!this.endOfInput) return null;\n\n return ParseSuccess;\n };\n\n // General purpose space, returns N-count newlines (fails if no newlines)\n public readonly MultilineWhitespace = (): typeof ParseSuccess | null => {\n let newlines: ParseRuleReturn[] | null = this.OneOrMore(this.Newline);\n if (newlines === null) {\n return null;\n }\n\n // Use content field of Token to say how many newlines there were\n // (in most circumstances it's unimportant)\n const numNewlines: number = newlines.length;\n if (numNewlines >= 1) {\n return ParseSuccess;\n }\n\n return null;\n };\n\n public readonly Whitespace = (): typeof ParseSuccess | null => {\n const doneParsed = this.ParseCharactersFromCharSet(\n this._inlineWhitespaceChars\n );\n\n if (doneParsed !== null) {\n return ParseSuccess;\n }\n\n return null;\n };\n\n public readonly Spaced =\n (rule: ParseRule): ParseRule =>\n () => {\n this.Whitespace();\n\n const result = this.ParseObject(rule);\n if (result === null) {\n return null;\n }\n\n this.Whitespace();\n\n return result;\n };\n\n public readonly AnyWhitespace = (): typeof ParseSuccess | null => {\n let anyWhitespace: boolean = false;\n\n while (this.OneOf([this.Whitespace, this.MultilineWhitespace]) !== null) {\n anyWhitespace = true;\n }\n\n return anyWhitespace ? ParseSuccess : null;\n };\n\n public readonly MultiSpaced =\n (rule: ParseRule): ParseRuleReturn =>\n () => {\n this.AnyWhitespace();\n\n const result = this.ParseObject(rule);\n if (result === null) {\n return null;\n }\n\n this.AnyWhitespace();\n\n return result;\n };\n\n private _filename: string | null = null;\n private _externalErrorHandler: ErrorHandler | null = null;\n private _fileHandler: IFileHandler | null = null;\n\n /**\n * End Whitespace section.\n */\n}\n","import { IFileHandler } from \"../IFileHandler\";\n\nexport class JsonFileHandler implements IFileHandler {\n constructor(public readonly fileHierarchy: Record<string, string>) {}\n\n readonly ResolveInkFilename = (filename: string): string => {\n if (Object.keys(this.fileHierarchy).includes(filename)) return filename;\n throw new Error(\n `Cannot locate ${filename}. Are you trying a relative import ? This is not yet implemented.`\n );\n };\n\n readonly LoadInkFileContents = (filename: string): string => {\n if (Object.keys(this.fileHierarchy).includes(filename)) {\n return this.fileHierarchy[filename];\n } else {\n throw new Error(`Cannot open ${filename}.`);\n }\n };\n}\n","import { CompilerOptions } from \"./CompilerOptions\";\nimport { DebugSourceRange } from \"./DebugSourceRange\";\nimport { ErrorType } from \"./Parser/ErrorType\";\nimport { InkParser } from \"./Parser/InkParser\";\nimport { Story } from \"../engine/Story\";\nimport { Story as ParsedStory } from \"./Parser/ParsedHierarchy/Story\";\nimport { DebugMetadata } from \"../engine/DebugMetadata\";\nimport { StringValue } from \"../engine/Value\";\nimport { asOrNull } from \"../engine/TypeAssertion\";\n\nexport { CompilerOptions } from \"./CompilerOptions\";\nexport { JsonFileHandler } from \"./FileHandler/JsonFileHandler\";\nexport { InkList, Story } from \"../engine/Story\";\n\nexport class Compiler {\n private _errors: string[] = [];\n get errors(): string[] {\n return this._errors;\n }\n\n private _warnings: string[] = [];\n get warnings(): string[] {\n return this._warnings;\n }\n\n private _authorMessages: string[] = [];\n get authorMessages(): string[] {\n return this._authorMessages;\n }\n\n private _inputString: string;\n get inputString(): string {\n return this._inputString;\n }\n\n private _options: CompilerOptions;\n get options(): CompilerOptions {\n return this._options;\n }\n\n private _parsedStory: ParsedStory | null = null;\n get parsedStory(): ParsedStory {\n if (!this._parsedStory) {\n throw new Error();\n }\n\n return this._parsedStory;\n }\n\n private _runtimeStory: Story | null = null;\n get runtimeStory(): Story {\n if (!this._runtimeStory) {\n throw new Error(\"Compilation failed.\");\n }\n\n return this._runtimeStory;\n }\n\n private _parser: InkParser | null = null;\n get parser(): InkParser {\n if (!this._parser) {\n throw new Error();\n }\n\n return this._parser;\n }\n\n private _debugSourceRanges: DebugSourceRange[] = [];\n get debugSourceRanges(): DebugSourceRange[] {\n return this._debugSourceRanges;\n }\n\n constructor(inkSource: string, options: CompilerOptions | null = null) {\n this._inputString = inkSource;\n this._options = options || new CompilerOptions();\n }\n\n public readonly Compile = (): Story => {\n this._parser = new InkParser(\n this.inputString,\n this.options.sourceFilename || null,\n this.OnError,\n null,\n this.options.fileHandler\n );\n\n this._parsedStory = this.parser.ParseStory();\n\n if (this.errors.length === 0) {\n this.parsedStory.countAllVisits = this.options.countAllVisits;\n this._runtimeStory = this.parsedStory.ExportRuntime(this.OnError);\n } else {\n this._runtimeStory = null;\n }\n\n return this.runtimeStory;\n };\n\n public readonly RetrieveDebugSourceForLatestContent = (): void => {\n for (const outputObj of this.runtimeStory.state.outputStream) {\n const textContent = asOrNull(outputObj, StringValue);\n if (textContent !== null) {\n const range = new DebugSourceRange(\n textContent.value?.length || 0,\n textContent.debugMetadata,\n textContent.value || \"unknown\"\n );\n\n this.debugSourceRanges.push(range);\n }\n }\n };\n\n public readonly DebugMetadataForContentAtOffset = (\n offset: number\n ): DebugMetadata | null => {\n let currOffset = 0;\n\n let lastValidMetadata: DebugMetadata | null = null;\n for (const range of this.debugSourceRanges) {\n if (range.debugMetadata !== null) {\n lastValidMetadata = range.debugMetadata;\n }\n\n if (offset >= currOffset && offset < currOffset + range.length) {\n return lastValidMetadata;\n }\n\n currOffset += range.length;\n }\n\n return null;\n };\n\n public readonly OnError = (message: string, errorType: ErrorType) => {\n switch (errorType) {\n case ErrorType.Author:\n this._authorMessages.push(message);\n break;\n\n case ErrorType.Warning:\n this._warnings.push(message);\n break;\n\n case ErrorType.Error:\n this._errors.push(message);\n break;\n }\n\n if (this.options.errorHandler !== null) {\n this.options.errorHandler(message, errorType);\n }\n };\n}\n"],"names":["CompilerOptions","ErrorType","sourceFilename","pluginNames","countAllVisits","errorHandler","fileHandler","_classCallCheck","this","DebugSourceRange","length","debugMetadata","text","Argument","identifier","isByReference","isDivertTarget","asOrNull","obj","type","unsafeTypeAssertion","asOrThrows","Error","concat","asINamedContentOrNull","hasValidName","name","nullIfUndefined","isEquatable","_typeof","Equals","filterUndef","element","undefined","Debug","ParsedObject","_this","_alreadyHadError","_alreadyHadWarning","_debugMetadata","_runtimeObject","content","parent","GetType","typeName","AddContent","subContent","_step","_iterator","_createForOfIteratorHelper","Array","isArray","s","n","done","ss","value","hasOwnProperty","push","err","e","f","InsertContent","index","splice","Find","queryFunc","tObj","_step2","_iterator2","nestedResult","FindAll","foundSoFar","found","_step3","_iterator3","Warning","message","source","_createClass","key","get","set","Boolean","ancestor","GenerateRuntimeObject","runtimeObject","path","result","reverse","context","_step4","_iterator4","ResolveReferences","_Error","_x","apply","arguments","toString","isWarning","AuthorWarning","_ParsedObject","_inherits","_super","_createSuper","warningMessage","call","Path","_components","_componentsString","_isRelative","componentsString","Component","head","tail","relative","slice","self","lastComponentIdx","i","l","isIndex","pathToAppend","p","upwardMoves","isParent","join","isRelative","substring","split","str","test","parseInt","otherPath","c","_p$_components","_toConsumableArray","parentId","indexOrName","otherComp","Assert","condition","console","warn","trace","AssertType","variable","NullException","_wrapNativeSuper","throwNullException","InkObject","_path","root","rootContentContainer","targetContent","ContentAtPath","dm","startLineNumber","comps","child","container","Container","namedChild","unshift","indexOf","nearestContainer","GetComponent","contentContainer","globalPath","ownPath","minPathLength","Math","min","lastSharedPathCompIndex","ownComp","numUpwardsMoves","componentCount","newPathComps","up","ToParent","down","globalPathStr","relativePathStr","PathByAppendingPath","ConvertPathToRelative","prop","StringBuilder","string","Append","format","_len","args","_key","replace","match","num","InkListItem","originName","itemName","fullName","nameParts","otherItem","JSON","stringify","parse","isLikeInkListItem","Null","inkListItem","item","InkList","_Map","_arguments","origins","_originNames","otherList","otherOriginNames","originNames","singleOriginListName","originStory","SetInitialOriginName","listDefinitions","def","TryListGetDefinition","exists","singleElement","Add","Key","Value","itemOrItemName","AddItem","origin","intVal","TryGetValueForItem","foundListDef","ContainsItemWithName","itemVal","ValueForItem","_slicedToArray","fromSerializedKey","has","serialized","serializedKey","delete","size","maxOriginName","maxItem","every","Count","initialOriginName","initialOriginNames","_step5","max","_iterator5","_step5$value","isNull","_step6","_iterator6","_step6$value","list","_step7","_iterator7","_step8","items","_iterator8","_step8$value","ContainsKey","_step9","_iterator9","_step10","_iterator10","_step10$value","_step11","union","_iterator11","_step11$value","_step12","intersection","_iterator12","_step12$value","_step13","_iterator13","listToRemove","_step14","_iterator14","what","ContainsItemNamed","_step15","_iterator15","minItem","minBound","maxBound","ordered","orderedItems","minValue","maxValue","Number","MAX_SAFE_INTEGER","isInteger","subList","SetInitialOriginNames","_step16","_iterator16","otherInkList","_step17","_iterator17","_step18","_iterator18","_step18$value","sort","x","y","localeCompare","sb","NaN","myListItem","listValue","_a","FindSingleItemListWithName","Map","StoryException","useEndLineNumber","tryGetValueFromMap","map","val","ValueType","_AbstractValue","_super2","_InkObject","AbstractValue","Create","valueObject","targetType","valueType","preferredNumberType","Int","IntValue","Float","isNaN","FloatValue","BoolValue","StringValue","String","DivertTargetValue","ListValue","_Value","_super3","Bool","newType","BadCastException","_Value2","_super4","_Value3","_super5","_Value4","_super6","_this2","_isNewline","_isInlineWhitespace","isNewline","isInlineWhitespace","parsedInt","defaultValue","tryParseInt","parsedFloat","parseFloat","tryParseFloat","_Value5","_super7","targetPath","DivertTarget","VariablePointerValue","_Value6","_super8","variableName","_this3","contextIndex","_contextIndex","VariablePointer","_Value7","_super9","listOrSingleItem","singleValue","_this4","List","oldValue","newValue","oldList","newList","SearchResult","approximate","searchResult","_content","namedContent","visitsShouldBeCounted","turnIndexShouldBeCounted","countingAtStartOnly","_pathToFirstLeafContent","namedOnlyContentDict","_step$value","inkObject","named","existingNamedOnly","namedOnlyContent","AddToNamedContentOnly","flags","CountFlags","Visits","Turns","CountStartOnly","flag","internalPathToFirstLeafContent","components","contentObjOrList","contentObj","TryAddNamedContent","namedContentObj","partialPathStart","partialPathLength","currentContainer","currentObj","comp","foundObj","ContentWithPathComponent","otherContainer","_this$content","component","foundContent","BuildStringOfHierarchy","indentation","pointedObj","appendIndentation","AppendFormat","AppendLine","onlyNamed","_step7$value","ControlCommand","commandType","CommandType","NotSet","_commandType","EvalStart","EvalOutput","EvalEnd","Duplicate","PopEvaluatedValue","PopFunction","PopTunnel","BeginString","EndString","NoOp","ChoiceCount","TurnsSince","ReadCount","Random","SeedRandom","VisitIndex","SequenceShuffleIndex","StartThread","Done","End","ListFromInt","ListRange","ListRandom","BeginTag","EndTag","Expression","_prototypeRuntimeConstantExpression","outputWhenComplete","RuntimeContainer","RuntimeControlCommand","GenerateIntoContainer","GenerateConstantIntoContainer","copy","Copy","Void","NativeFunctionCall","_name","_numberOfParameters","_prototype","_isPrototype","_operationFuncs","GenerateNativeFunctionsIfNecessary","numberOfParameters","_nativeFunctions","parameters","Call","hasList","CallBinaryListOperation","coercedParams","CoerceValuesToSingleType","coercedType","CallType","parametersOfSingleType","param1","valType","val1","paramCount","opForTypeObj","val2","opForType","resultVal","CallListIncrementOperation","v1","v2","op","asBooleanOrThrows","isTruthy","listIntParams","listVal","resultInkList","_step2$value","listItemKey","listItemValue","listItem","intOp","targetInt","itemOrigin","incrementedItem","TryGetItemWithValue","parametersIn","specialCaseList","parametersOut","originOfMaxItem","castedValue","Cast","functionName","t","AddIntBinaryOp","Subtract","Multiply","Divide","floor","Mod","AddIntUnaryOp","Negate","Equal","Greater","Less","GreaterThanOrEquals","LessThanOrEquals","NotEquals","Not","And","Or","Max","Min","Pow","pow","Floor","Identity","Ceiling","AddFloatBinaryOp","AddFloatUnaryOp","ceil","AddStringBinaryOp","Has","includes","Hasnt","AddListBinaryOp","Union","Without","Contains","Intersect","GreaterThan","LessThan","AddListUnaryOp","Invert","inverse","All","all","ListMin","MinAsList","ListMax","MaxAsList","ValueOfList","AddOpToNativeFunc","d1","d2","nativeFunc","AddOpFuncForType","NumberExpression","_Expression","subtype","isInt","isFloat","isBool","numberExpression","UnaryExpression","inner","innerExpression","CallWithName","nativeNameForOp","WithInner","innerNumber","BinaryExpression","left","right","opName","leftExpression","rightExpression","NativeNameForOp","_get","leftUnary","CharacterSet","arg","Set","add","AddRange","start","end","charCodeAt","fromCharCode","AddCharacters","chars","FromRange","CharacterRange","_start","_end","excludes","_correspondingCharSet","_excludes","ToCharacterSet","ii","Define","PushPopType","ChoicePoint","onceOnly","_pathOnChoice","hasCondition","hasStartContent","hasChoiceOnlyContent","isInvisibleDefault","choiceTargetObj","choiceTarget","ResolvePath","pathOnChoice","CompactPathString","SymbolType","Pointer","PathByAppendingComponent","Divert","stackPushType","_targetPath","_targetPointer","variableDivertName","pushesToStack","isExternal","externalArgs","isConditional","targetObj","targetPointer","Resolve","lastComponent","StartOf","otherDivert","hasVariableTarget","targetStr","Function","targetPathString","VariableAssignment","isNewDeclaration","isGlobal","Choice","startContent","choiceOnlyContent","innerContent","_condition","_innerContentContainer","_outerContainer","_runtimeChoice","_returnToR1","_returnToR2","_r1Label","_r2Label","_divertToStartContentOuter","_divertToStartContentInner","_startContentRuntimeContainer","hasWeaveStyleInlineBrackets","varAssign","RuntimeVariableAssignment","RuntimeDivert","varDivert","choiceOnlyRuntimeContent","AddContentsOfContainer","innerChoiceOnlyContent","story","indentationDepth","innerContentContainer","runtimeChoice","_getPrototypeOf","prototype","CheckForNamingCollisions","SubFlowAndWeave","StringParserElement","characterIndex","characterInLineIndex","lineIndex","reportedErrorInScope","uniqueId","customFlags","CopyFrom","fromElement","_uniqueIdCounter","SquashFrom","StringParserState","_stack","_numElements","Push","prevElement","newElement","Pop","expectedRuleId","currentElement","Peek","PeekPenultimate","Squash","penultimateEl","lastEl","NoteErrorReported","ParseSuccess","Symbol","StringParser","ParseRule","hadError","BeginRule","state","FailRule","CancelRule","SucceedRule","stateAtSucceedRule","stateAtBeginRule","RuleDidSucceed","finalResult","Expect","rule","recoveryRule","ParseObject","butSaw","lineRemainder","LineRemainder","ErrorOnLine","ErrorWithParsedObject","lineNumber","errorReportedAlreadyInScope","errorType","ParseUntilCharactersFromString","SetFlag","trueOrFalse","GetFlag","ruleId","stackHeightBefore","stackHeight","Parse","OneOf","array","OneOrMore","results","Optional","Exclude","OptionalExclude","ParseString","TryAddResultToList","flatten","resultCollection","Interleave","ruleA","ruleB","untilTerminator","firstA","lastMainResult","outerResult","remainingLength","cli","li","success","tempIdx","_chars","ParseSingleCharacter","maxCount","ParseCharactersFromString","ParseUntilCharactersFromCharSet","charSet","ParseCharactersFromCharSet","maxCountOrShouldIncludeStrChars","shouldIncludeChars","startIndex","count","lastCharIndex","ParseInt","oldIndex","oldCharacterInLineIndex","negative","parsedString","numbersCharacterSet","MIN_SAFE_INTEGER","ParseFloat","leadingInt","afterDecimalPointStr","ParseNewline","strPreProc","PreProcessInputString","inputString","stopRule","pauseCharacters","endCharacters","pauseAndEnd","values","partialParsedString","endOfInput","pauseCharacter","currentCharacter","FlowLevel","CommentEliminator","_StringParser","_commentOrNewlineStartCharacter","_commentBlockEndCharacter","_newlineCharacters","Process","stringList","CommentsAndNewlines","MainInk","ParseUntil","newLines","ParseSingleComment","EndOfLineComment","BlockComment","startLineIndex","commentResult","repeat","Conditional","initialCondition","branches","_reJoinTarget","branchContainer","ownExpression","isElse","pathToReJoin","branch","returnDivert","Text","ConstantDeclaration","assignedExpression","_expression","constantIdentifier","Var","Gather","_b","argOne","argTwo","_dotSeparatedComponents","baseTargetLevel","WeavePoint","dotSeparatedComponents","ResolveFromContext","baseTargetObject","ResolveBaseTarget","ResolveTailComponents","originalContext","firstComp","firstComponent","ancestorContext","deepSearch","foundBase","GetChildFromContext","rootTarget","foundComponent","compName","minimumExpectedLevel","foundFlow","FlowBase","flowLevel","childName","minimumLevel","forceDeepSearch","ambiguousChildLevel","weaveContext","Weave","WeavePointNamed","flowContext","shouldDeepSearch","Knot","ContentWithNameAtLevel","Object","_baseTargetLevel","baseLevelIsAmbiguous","Story","filter","ReturnType","returnedExpression","ClosestFlowBase","iamFlowbase","Identifier","topLevelObjects","isFunction","isIncludedStory","_rootWeave","_subFlowsByName","_startingSubFlowDivert","_startingSubFlowRuntime","_firstChildFlow","variableDeclarations","SplitWeaveAndSubFlowContent","contentObjs","isRootStory","weaveObjs","subFlowObjs","subFlow","finalContent","ResolveVariableWithName","varName","fromNode","ownerFlow","isArgument","isTemporary","AddNewVariableDeclaration","varDecl","varab","prevDeclError","ResolveWeavePointNaming","foundReturn","CheckForDisallowedFunctionFlowControl","Stitch","GenerateArgumentVariableAssignments","contentIdx","childFlow","childFlowRuntime","hasParameters","existingChild","errorMsg","ValidateTermination","WarningInTermination","paramName","assign","level","_assertThisInitialized","weavePointResult","DeepSearchForAnyLevelContent","weaveResultSelf","deepResult","divert","isFunctionCall","choice","terminatingObject","terminatingDivert","isTunnel","target","PreProcessTopLevelObjects","_","Arg","jj","symbolType","ContentList","objects","dontFlatten","TrimTrailingWhitespace","RegExp","contentObjRuntime","DontFlattenContainer","moreObjects","VariableReference","pathForCount","pathStringForCount","pathIdentifiers","_runtimeVarRef","isConstantReference","isListItemReference","constantValue","constants","RuntimeVariableReference","listItemName","listName","ResolveListItem","id","parsedPath","targetForCount","containerForCounting","runtimePath","targetFlow","FunctionCall","_divertTargetToCount","_variableReferenceToCount","shouldPopReturnedValue","foundList","ResolveList","usingProxyDivert","isChoiceCount","isTurns","isTurnsSince","isReadCount","divertTarget","variableDivertTarget","isRandom","isSeedRandom","isListRange","isListRandom","CallExistsWithName","nativeCall","msg","RuntimeInkList","_proxyDivert","strArgs","runtimeDivert","attemptingTurnCountOfVariableTarget","targetObject","runtimeVarRef","IsBuiltIn","SequenceType","MultipleConditionExpression","conditionExpressions","isFirst","subExpressions","_runtimeDivert","_runtimeDivertTargetValue","runtimeDivertTargetValue","otherDivTarget","isDone","isEnd","usageContext","badUsage","foundUsage","usageParent","binaryExprParent","funcCall","ConditionalSingleBranch","parentFunc","isEmpty","isThread","ResolveTargetContent","CheckArgumentValidity","requiresArgCodeGen","targetArguments","argToPass","argExpected","varRef","varPointer","Tunnel","PathAsVariableName","variableTargetName","flowBaseScope","resolveResult","argument","find","a","numArgs","butClause","flowArg","divArgExpr","knotCountPath","CheckExternalArgumentValidity","externalName","external","externals","externalArgCount","argumentNames","ownArgCount","returnString","targetWasFound","isBuiltIn","numberOfComponents","IsExternal","RuntimePath","GatherPointToResolve","targetRuntimeObj","SequenceDivertToResolve","CustomFlags","Sequence","elementContentLists","sequenceType","_sequenceDivertsToResolve","once","Once","cycle","Cycle","stopping","Stopping","shuffle","Shuffle","seqBranchCount","sequenceElements","postShuffleNoOp","lastIdx","skipShuffleDivert","AddDivertToResolve","elementCountToShuffle","postSequenceNoOp","elIndex","sequenceDivert","contentContainerForSequenceBranch","seqBranchCompleteDivert","elementContentList","seqElObject","toResolve","TunnelOnwards","_overrideDivertTarget","_divertAfter","divertAfter","returnRuntimeObj","returnRuntimeContainer","evalStart","evalEnd","cmd","returnDivertObj","ListDefinition","_items","_itemNameToValues","itemDefinitions","variableAssignment","_elementsByName","ItemNamed","el","initialValues","itemDef","inInitialList","RuntimeInkListItem","seriesValue","currentValue","explicitValue","allItems","RuntimeListDefinition","_ref","isGlobalDeclaration","isTemporaryNewDeclaration","listDef","variableIdentifier","_runtimeAssignment","expression","listDefinition","newDeclScope","isNewTemporaryDeclaration","isDeclaration","Temp","variableReference","resolvedVarAssignment","cont","indentIndex","previousWeavePoint","addContentToPreviousWeavePoint","hasSeenChoiceInSection","_unnamedGatherCount","_choiceCount","_rootContainer","_namedWeavePoints","looseEnds","gatherPointsToResolve","namedWeavePoints","w","weavePoint","existingWeavePoint","existingObj","_c","ConstructWeaveHierarchyFromIndentation","weaveIndentIdx","baseIndentIndex","innerWeaveStartIdx","innerWeaveObj","weaveContentCount","weaveContent","weave","DetermineBaseIndentationFromContent","contentList","AddRuntimeForWeavePoint","_this$gatherPointsToR","AddRuntimeForNestedWeave","AddGeneralRuntimeContent","PassLooseEndsToAncestors","AddRuntimeForGather","gather","autoEnter","gatherContainer","runtimeContainer","rootContainer","looseEnd","looseWeavePoint","WeavePointHasLooseEnd","closestInnerWeaveAncestor","closestOuterWeaveAncestor","nested","weaveAncestor","received","ReceiveLooseEnd","receivingWeave","childWeaveLooseEnd","IsGlobalDeclaration","varAss","ContentThatFollowsWeavePoint","returned","parentWeave","laterObj","badTerminationHandler","lastParsedSignificantObject","looseEndFlow","ValidateFlowOfObjectsTerminates","BadNestedTerminationHandler","terminatingObj","conditional","toLowerCase","objFlow","defaultObj","terminated","flowObj","d","innerDivert","CheckForWeavePointNamingCollisions","ancestorFlows","ancestry","flow","weavePointName","otherContentWithName","lastObject","lastText","lastWeave","isNestedWeave","gatherPoint","_contentContainer","_conditionalDivert","_ownExpression","_innerWeave","isTrueBranch","matchingEquality","isInline","startsWith","duplicatesStackValue","needsEval","GenerateRuntimeForContent","StatementLevel","DebugMetadata","endLineNumber","startCharacterNumber","endCharacterNumber","fileName","sourceName","newDebugMetadata","ExternalDeclaration","AddExternal","FlowDecl","Glue","_Wrap","glue","Wrap","_objToWrap","IncDecExpression","varIdentifier","isIncOrExpression","isInc","varResolveResult","incrementDecrementWord","IncludedFile","includedStory","InfixOperator","precedence","requireWhitespace","_FlowBase","parentStory","stitchName","subFlowsByName","knotWithStitchName","stitch","itemIdentifierList","runtimeRawList","itemIdentifier","ListElementDefinition","indentifier","_thisSuper","parentList","ListItem","Tag","tagText","threadAtGeneration","sourcePath","tags","originalThreadIndex","ListDefinitionsOrigin","lists","_lists","_allUnambiguousListValueCache","listOfLists","definition","JsonSerialisation","jArray","skipLast","jTok","runtimeObj","JTokenToRuntimeObject","writer","dictionary","WriteObjectStart","WritePropertyStart","WriteRuntimeObject","WritePropertyEnd","WriteObjectEnd","WriteArrayStart","WriteArrayEnd","dict","_step3$value","WriteIntProperty","WriteRuntimeContainer","divTypeKey","WriteProperty","choicePoint","pathStringOnChoice","boolVal","WriteBool","WriteInt","floatVal","WriteFloat","strVal","Write","WriteStringStart","WriteStringInner","WriteStringEnd","WriteInkList","divTargetVal","varPtrVal","controlCmd","_controlCommandNames","readCountPath","tag","WriteChoice","jObject","token","firstChar","propValue","varPtr","isDivert","divPushType","readCountVarRef","isVarAss","isGlobalVar","isNewDecl","listContent","rawList","namesAsObjs","nameToVal","JObjectToChoice","JArrayToContainer","toJson","me","removes","space","k","v","some","r","withoutName","countFlags","hasNameProperty","hasTerminator","namedContainer","WriteNull","JArrayToRuntimeObjList","namedContentItem","namedSubContainer","jObj","WritePropertyNameStart","WritePropertyNameInner","WritePropertyNameEnd","listDefJson","_step9$value","defsObj","allDefs","nameValueKey","nameValue","TOTAL_VALUES","CallStack","_threadCounter","_startOfRoot","storyContext","Reset","toCopy","_threads","otherThread","callStack","elements","cs","callstack","Thread","Element","jThreadObj","thread","WriteObject","WriteJson","newThread","currentThread","threadIndex","forkedThread","canPopThread","elementIsEvaluateFromGame","FunctionEvaluationFromGame","externalEvaluationStackHeight","outputStreamLengthWithPushed","currentPointer","evaluationStackHeightWhenPushed","functionStartInOutputStream","canPop","CanPop","pop","currentElementIndex","contextElement","varValue","temporaryVariables","declareNew","RetainListOriginsForAssignment","filtered","isCurrent","pointer","inExpressionEvaluation","previousPointer","jThreadCallstack","jElTok","jElementObj","pushPopType","currentContainerPathStr","currentContainerPathStrToken","threadPointerResult","temps","JObjectToDictionaryRuntimeObjs","clear","prevContentObjPath","prevPath","PointerAtPath","WriteDictionaryRuntimeObjs","resolvedPointer","VariablesState","_VariablesStateAccess","listDefsOrigin","variableChangedEventCallbacks","patch","_batchObservingVariableChanges","_defaultGlobalVariables","_changedVariablesForBatchObs","_globalVariables","_callStack","_listDefsOrigin","_possibleConstructorReturn","Proxy","$","callback","variableChangedEvent","varContents","TryGetGlobal","SetGlobal","globals","namedVarKey","namedVarValue","changedVariables","jToken","varValKey","varValValue","loadedToken","tokenInkObject","keyValKey","keyValValue","dontSaveDefaultValues","defaultVal","RuntimeObjectsEqual","obj1","obj2","constructor","GetRawVariableWithName","ValueAtVariablePointer","variableValue","GetTemporaryVariableWithName","GetVariableWithName","setGlobal","GlobalVariableExistsWithName","ResolveVariablePointer","existingPointer","SetTemporaryVariable","batchObservingVariableChanges","AddChangedVariable","GetContextIndexOfVariableNamed","doubleRedirectionPointer","_class","PRNG","seed","next","StatePatch","_changedVariables","_visitCounts","_turnIndices","_globals","SimpleJson","Reader","ToDictionary","ToArray","_rootObject","Writer","_currentPropertyName","_currentString","_stateStack","_collectionStack","_propertyNameStack","_jsonObject","StartNewObject","newObject","State","Property","currentCollection","currentPropertyName","propertyName","None","StateElement","innerOrContent","IncrementChildCount","childCount","PropertyName","_addToCurrentObject","error","POSITIVE_INFINITY","NEGATIVE_INFINITY","currEl","Flow","SetJsonToken","outputStream","currentChoices","jChoiceThreadsObj","LoadFlowChoiceThreads","WriteListRuntimeObjs","hasChoiceThreads","ThreadWithIndex","jChoiceThreads","foundActiveThread","jSavedChoiceThread","StoryState","kInkSaveStateVersion","kMinCompatibleLoadVersion","onDidLoadState","_currentErrors","_currentWarnings","divertedPointer","_currentTurnIndex","storySeed","previousRandom","didSafeExit","_currentText","_currentTags","_outputStreamTextDirty","_outputStreamTagsDirty","_patch","_aliveFlowNames","_namedFlows","kDefaultFlowName","_aliveFlowNamesDirty","_currentFlow","OutputStreamDirty","_evaluationStack","_variablesState","currentTurnIndex","timeSeed","Date","getTime","GoToStart","indented","ToJson","json","TextToDictionary","LoadJsonObj","pathString","visitCountOut","TryGetVisitCount","containerPathStr","count2","currCount","VisitCountForContainer","SetVisitCount","SetTurnIndex","TryGetTurnIndex","index2","depth","canContinue","hasError","currentErrors","currentWarnings","inTag","outputObj","textContent","controlCommand","CleanOutputWhitespace","currentWhitespaceStart","startOfLine","charAt","Length","txt","Clear","keys","flowName","mainContentContainer","variablesState","SwitchFlow_Internal","SwitchToDefaultFlow_Internal","_copy$_currentFlow$cu","_copy$_currentFlow$ou","_copy$evaluationStack","_copy$_currentErrors","_copy$_currentWarning","_step4$value","namedFlowKey","namedFlowValue","hasWarning","evaluationStack","ApplyPatch","visitCounts","ApplyCountChanges","turnIndices","newCount","isVisit","_loop","WriteIntDictionary","inkVersionCurrent","jSaveVersion","flowsObj","flowsObjDict","_i","_flowsObjDictEntries","entries","_flowsObjDictEntries$","currFlowName","currentDivertTargetPath","divertPath","JObjectToIntDictionary","_this$outputStream","objs","listText","TrySplittingHeadTailWhitespace","textObj","PushToOutputStreamIndividual","single","headFirstNewlineIdx","headLastNewlineIdx","tailLastNewlineIdx","tailFirstNewlineIdx","listTexts","innerStrStart","innerStrEnd","leadingSpaces","innerStrText","numSpaces","trailingSpaces","includeInOutput","TrimNewlinesFromOutputStream","functionTrimIndex","glueTrimIndex","o","isNonWhitespace","RemoveExistingGlue","callStackElements","outputStreamEndsInNewline","outputStreamContainsContent","removeWhitespaceFrom","numberOfObjects","functionStartPoint","popType","TrimWhitespaceFromFunctionEnd","incrementingTurnIndex","newPointer","funcContainer","PassArgumentsToEvaluationStack","PushEvaluationStack","callStackTrace","originalEvaluationStackHeight","returnedObj","poppedObj","PopEvaluationStack","PopCallStack","returnVal","Stopwatch","startTime","nVal","isFinite","exports","inkVersionMinimumCompatible","onError","onDidContinue","onMakeChoice","onEvaluateFunction","onCompleteEvaluateFunction","onChoosePathString","_prevContainers","allowExternalFunctionFallbacks","_listDefinitions","_variableObservers","_hasValidatedExternals","_temporaryEvaluationContainer","_asyncContinueActive","_stateSnapshotAtLastNewline","_sawLookaheadUnsafeFunctionAfterNewline","_recursiveContinueCount","_asyncSaving","_profiler","_mainContentContainer","jsonString","_externals","rootObject","versionObj","formatFromFile","listDefsObj","rootToken","JTokenToListDefinitions","ResetState","choices","_state","IfAsyncWeCant","currentText","currentTags","currentFlowName","currentFlowIsDefaultFlow","aliveFlowNames","shouldReturn","ObserveVariableChange","VariableStateDidChangeEvent","bind","ResetGlobals","ResetErrors","ForceEnd","originalPointer","ChoosePath","ContinueInternal","SnapshotDefaultGlobals","RemoveFlow_Internal","ContinueAsync","millisecsLimitAsync","ValidateExternalBindings","PreContinue","isAsyncTimeLimited","ResetOutput","durationStopwatch","Start","ContinueSingleStep","AddError","ElapsedMilliseconds","Stop","RestoreStateSnapshot","generatedChoices","PostContinue","PreStep","Step","PostStep","TryFollowDefaultInvisibleChoice","PreSnapshot","inStringEvaluation","change","CalculateNewlineOutputStateChange","OutputStateChange","ExtendedBeyondNewline","NewlineRemoved","DiscardSnapshot","StateSnapshot","PostSnapshot","prevText","currText","prevTagCount","currTagCount","newlineStillExists","NoChange","Continue","pathLengthToUse","CopyAndStartPatching","RestoreAfterPatch","ApplyAnyPatch","stateToSave","shouldAddToStream","containerToEnter","VisitContainer","currentContentObj","isLogicOrFlowControl","PerformLogicAndFlowControl","ProcessChoice","contextIdx","ContextForVariableNamed","PushToOutputStream","NextContent","PushThread","atStart","IncrementVisitCountForContainer","RecordTurnIndexVisitToContainer","prevAncestor","currentChildOfContainer","currentContainerAncestor","allChildrenEnteredAtStart","enteringAtStart","choiceOnlyStrVal","PeekEvaluationStack","showChoice","conditionValue","IsTruthy","startText","choiceOnlyText","PopChoiceStringAndTags","ForkThread","divTarget","currentDivert","intContent","errorMessage","CallExternalFunction","evalCommand","output","overrideTunnelReturnTarget","popped","TryExitFunctionEvaluationFromGame","names","expected","contentStackForTag","outputCountConsumed","command","PopFromOutputStream","_contentStackForTag","choiceTag","contentStackForString","contentToRetain","_i3","_contentToRetain","rescuedTag","choiceCount","extraNote","eitherCount","correctObj","TurnsSinceForContainer","maxInt","minInt","randomRange","resultSeed","nextRandom","chosenValue","shuffleIndex","NextSequenceShuffleIndex","PopThread","listNameVal","generatedListValue","foundItem","targetList","ListWithSubRange","listItemIndex","listEnumerator","randomItem","assignedVal","Assign","foundValue","containerForCount","func","funcParams","resetCallstack","ResetCallstack","funcDetail","activityStr","SetChosenPath","VisitChangedContainersDueToDivert","choiceIdx","choiceToChoose","KnotContainerWithName","returnTextOutput","trim","outputStreamBefore","StartFunctionEvaluationFromGame","stringOutput","textOutput","CompleteFunctionEvaluationFromGame","exprContainer","startCallStackHeight","evalStackHeight","funcName","numberOfArguments","funcDef","fallbackFunctionContainer","foundExternal","lookAheadSafe","valueObj","funcResult","function","returnObj","lookaheadSafe","BindExternalFunctionGeneral","coercedArgs","TryCoerce","missingExternals","from","fallbackFound","observer","variableNames","observers","ObserveVariable","specificVariableName","variableObservers","newValueObj","TagsAtStartOfFlowContainerWithPathString","flowContainer","firstContent","IncrementContentPointer","didPop","successfulIncrement","nextAncestor","indexInAncestor","allChoices","invisibleChoices","numElementsIntVal","seqContainer","numElements","seqCount","loopIndex","iterationIndex","seqPathStr","sequenceHash","randomSeed","random","unpickedIndices","chosen","chosenIndex","currentDebugMetadata","errorTypeStr","lineNum","toplevelObjects","isInclude","_errorHandler","_hadError","_hadWarning","_dontFlattenContainers","_listDefs","ExportRuntime","constDecl","existingDefinition","constantName","variableInitialisation","runtimeLists","runtimeListDefinition","runtimeVarAss","runtimeStory","RuntimeStory","FlattenContainersIn","originalFoundList","itemInThisList","innerContainers","innerContainer","namedInnerContainer","TryFlattenContainer","parentContainer","ownDebugMetadata","Author","ResetError","namedFuncTarget","decl","NameConflictError","typeNameToPrint","typeNameOverride","IsReservedKeyword","maybeKnotOrFunction","knotOrFunction","topLevelContent","flowsFromOtherFiles","file","posOfObj","nonFlowContent","subStory","subStoryObj","StringExpression","otherStr","isSingleString","isStart","inChoice","DefaultFileHandler","rootPath","ResolveInkFilename","LoadInkFileContents","InkParser","filename","externalErrorHandler","rootParser","ParseStory","StatementsAtLevel","Top","_rootParser","SeparatedList","mainRule","separatorRule","firstElement","allElements","nextElementRuleId","nextElement","CreateDebugMetadata","stateAtStart","stateAtEnd","md","_filename","parsedObj","parsedListObjs","parsedListObj","hasOwnDebugMetadata","OnStringParserError","warningType","fullMessage","_externalErrorHandler","Whitespace","IdentifierWithMetadata","ExtendIdentifierCharacterRanges","identifierCharSet","ListAllCharacterRanges","charRange","_parsingChoice","onceOnlyChoice","bullets","optionalName","BracketedName","conditionExpr","ChoiceCondition","startTextAndLogic","MixedTextAndLogic","optionOnlyContent","EndTagIfNecessary","optionOnlyTextAndLogic","innerTextAndLogic","diverts","MultiDivert","emptyContent","divObj","div","conditions","ChoiceSingleCondition","ChoiceConditionsSpace","Newline","condExpr","DisallowIncrement","gatherDashCountObj","GatherDashes","gatherDashCount","ParseDashNotArrow","InnerConditionalContent","initialQueryExpression","ConditionExpression","alternatives","canBeInline","InlineConditionalBranches","MultilineConditionalBranches","soleContent","InnerBlock","elseBranch","SingleMultilineCondition","emptyTrueBranch","earlierBranchesHaveOwnExpression","isLast","alt","finalClause","trueBranch","MultilineWhitespace","multipleConditions","expr","ElseExpression","_nonTextPauseCharacters","_nonTextEndCharacters","_notTextEndCharactersChoice","_notTextEndCharactersString","TrimEndWhitespace","mixedTextAndLogicResults","terminateWithSpace","lastObjIdx","lastObj","LineOfMixedTextAndLogic","firstText","EndOfLine","SkipToNextLine","Spaced","ContentText","InlineLogicOrGlueOrStartTag","_results","ContentTextAllowingEscapeChar","ContentTextNoEscape","gotEscapeChar","endChars","parsingStringExpression","pureTextContent","ParseDivertArrow","ParseThreadArrow","threadDivert","arrowsAndDiverts","ParseDivertArrowOrTunnelOnwards","DivertIdentifierWithArguments","tunnelOnwards","tunnelOnwardDivert","gatherDivert","targetComponents","DotSeparatedDivertPathComponents","optionalArguments","ExpressionFunctionCallArguments","SingleDivert","numArrows","_binaryOperators","_maxBinaryOpLength","TempDeclarationOrAssignment","ParseTempKeyword","isIncrement","isDecrement","ReturnStatement","minimumPrecedence","ExpressionUnary","infixOp","ParseInfixOperator","expectationMessage","multiaryExpr","ExpressionInfixRight","_ret","ExpressionDivertTarget","prefixOp","ExpressionNot","ExpressionList","ExpressionParen","ExpressionFunctionCall","ExpressionVariableName","ExpressionLiteral","postfixOp","ExpressionFloat","ExpressionInt","ExpressionBool","ExpressionString","intOrNull","floatOrNull","textAndLogic","iden","commas","innerExpr","memberNames","ListMember","identifier2","RegisterExpressionOperators","RegisterBinaryOperator","infix","_openFilenames","IncludeStatement","fullFilename","FilenameIsAlreadyOpen","AddOpenFilename","includedString","RemoveOpenFilename","KnotDefinition","knotDecl","KnotDeclaration","KnotStitchNoContentRecoveryRule","KnotTitleEquals","knotName","isFunc","parameterNames","BracketedKnotDeclArguments","multiEquals","StitchDefinition","StitchDeclaration","flowArgs","flowArguments","FlowDeclArgument","firstIden","divertArrow","secondIden","funcIdentifier","argNames","_identifierCharSet","LogicLine","funCall","VariableDeclaration","ListElementDefinitionSeparator","ListDeclaration","AnyWhitespace","needsToCloseParen","elementValue","elementValueNum","ConstDeclaration","InlineLogic","StartTag","RuntimeGlue","wasParsingString","wasTagActive","tagActive","logic","InnerLogic","explicitSeqType","SequenceTypeAnnotation","contentLists","InnerSequenceObjects","rules","InnerSequence","InnerExpression","_rules","isNumberCharsOnly","_sequenceTypeSymbols","seqType","parsedSeqType","annotation","SequenceTypeSymbolAnnotation","SequenceTypeWordAnnotation","sequenceAnnotations","sequenceTypes","SequenceTypeSingleWord","combinedSequenceType","word","InnerMultilineSequenceObjects","InnerInlineSequenceObjects","interleavedContentAndPipes","justHadContent","contentOrPipe","SingleMultilineSequenceElement","_statementRulesAtLevel","_statementBreakRulesAtLevel","StatementAtLevel","StatementsBreakForLevel","rulesAtLevel","statement","breakRules","breakRuleResult","GenerateStatementLevelRules","levels","_i2","_levels","breakingRules","Line","inlineRule","_inlineWhitespaceChars","EndOfFile","newlines","anyWhitespace","MultiSpaced","_fileHandler","fullRootInkPath","ParsingString","TagActive","outputContentList","LatinBasic","LatinExtendedA","LatinExtendedB","Greek","Cyrillic","Armenian","Hebrew","Arabic","Korean","JsonFileHandler","fileHierarchy","Compiler","inkSource","options","_errors","_warnings","_authorMessages","_parsedStory","_runtimeStory","_parser","_debugSourceRanges","Compile","OnError","parser","errors","parsedStory","RetrieveDebugSourceForLatestContent","range","debugSourceRanges","DebugMetadataForContentAtOffset","offset","currOffset","lastValidMetadata","_inputString","_options"],"mappings":"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"} |