public static void WriteRuntimeContainer(SimpleJson.Writer writer, Container container, bool withoutName = false) { writer.WriteArrayStart(); foreach (var c in container.content) { WriteRuntimeObject(writer, c); } // Container is always an array [...] // But the final element is always either: // - a dictionary containing the named content, as well as possibly // the key "#" with the count flags // - null, if neither of the above var namedOnlyContent = container.namedOnlyContent; var countFlags = container.countFlags; var hasNameProperty = container.name != null && !withoutName; bool hasTerminator = namedOnlyContent != null || countFlags > 0 || hasNameProperty; if (hasTerminator) { writer.WriteObjectStart(); } if (namedOnlyContent != null) { foreach (var namedContent in namedOnlyContent) { var name = namedContent.Key; var namedContainer = namedContent.Value as Container; writer.WritePropertyStart(name); WriteRuntimeContainer(writer, namedContainer, withoutName: true); writer.WritePropertyEnd(); } } if (countFlags > 0) { writer.WriteProperty("#f", countFlags); } if (hasNameProperty) { writer.WriteProperty("#n", container.name); } if (hasTerminator) { writer.WriteObjectEnd(); } else { writer.WriteNull(); } writer.WriteArrayEnd(); }
public static void WriteListRuntimeObjs(SimpleJson.Writer writer, List <Runtime.Object> list) { writer.WriteArrayStart(); foreach (var val in list) { WriteRuntimeObject(writer, val); } writer.WriteArrayEnd(); }
static void WriteInkList(SimpleJson.Writer writer, ListValue listVal) { var rawList = listVal.value; writer.WriteObjectStart(); writer.WritePropertyStart("list"); writer.WriteObjectStart(); foreach (var itemAndValue in rawList) { var item = itemAndValue.Key; int itemVal = itemAndValue.Value; writer.WritePropertyNameStart(); writer.WritePropertyNameInner(item.originName ?? "?"); writer.WritePropertyNameInner("."); writer.WritePropertyNameInner(item.itemName); writer.WritePropertyNameEnd(); writer.Write(itemVal); writer.WritePropertyEnd(); } writer.WriteObjectEnd(); writer.WritePropertyEnd(); if (rawList.Count == 0 && rawList.originNames != null && rawList.originNames.Count > 0) { writer.WritePropertyStart("origins"); writer.WriteArrayStart(); foreach (var name in rawList.originNames) { writer.Write(name); } writer.WriteArrayEnd(); writer.WritePropertyEnd(); } writer.WriteObjectEnd(); }
public void WriteJson(SimpleJson.Writer writer) { writer.WriteObjectStart(); // callstack writer.WritePropertyStart("callstack"); writer.WriteArrayStart(); foreach (CallStack.Element el in callstack) { writer.WriteObjectStart(); if (!el.currentPointer.isNull) { writer.WriteProperty("cPath", el.currentPointer.container.path.componentsString); writer.WriteProperty("idx", el.currentPointer.index); } writer.WriteProperty("exp", el.inExpressionEvaluation); writer.WriteProperty("type", (int)el.type); if (el.temporaryVariables.Count > 0) { writer.WritePropertyStart("temp"); Json.WriteDictionaryRuntimeObjs(writer, el.temporaryVariables); writer.WritePropertyEnd(); } writer.WriteObjectEnd(); } writer.WriteArrayEnd(); writer.WritePropertyEnd(); // threadIndex writer.WriteProperty("threadIndex", threadIndex); if (!previousPointer.isNull) { writer.WriteProperty("previousContentObject", previousPointer.Resolve().path.ToString()); } writer.WriteObjectEnd(); }
void EvaluateStory() { while (story.canContinue) { story.Continue(); if (_compiler != null) { _compiler.RetrieveDebugSourceForLatestContent(); } if (_jsonOutput) { var writer = new Runtime.SimpleJson.Writer(); writer.WriteObjectStart(); writer.WriteProperty("text", story.currentText); writer.WriteObjectEnd(); Console.WriteLine(writer.ToString()); } else { Console.Write(story.currentText); } var tags = story.currentTags; if (tags.Count > 0) { if (_jsonOutput) { var writer = new Runtime.SimpleJson.Writer(); writer.WriteObjectStart(); writer.WritePropertyStart("tags"); writer.WriteArrayStart(); foreach (var tag in tags) { writer.Write(tag); } writer.WriteArrayEnd(); writer.WritePropertyEnd(); writer.WriteObjectEnd(); Console.WriteLine(writer.ToString()); } else { Console.WriteLine("# tags: " + string.Join(", ", tags)); } } Runtime.SimpleJson.Writer issueWriter = null; if (_jsonOutput && (_errors.Count > 0 || _warnings.Count > 0)) { issueWriter = new Runtime.SimpleJson.Writer(); issueWriter.WriteObjectStart(); issueWriter.WritePropertyStart("issues"); issueWriter.WriteArrayStart(); if (_errors.Count > 0) { foreach (var errorMsg in _errors) { issueWriter.Write(errorMsg); } } if (_warnings.Count > 0) { foreach (var warningMsg in _warnings) { issueWriter.Write(warningMsg); } } issueWriter.WriteArrayEnd(); issueWriter.WritePropertyEnd(); issueWriter.WriteObjectEnd(); Console.WriteLine(issueWriter.ToString()); } if (_errors.Count > 0 && !_jsonOutput) { foreach (var errorMsg in _errors) { Console.WriteLine(errorMsg, ConsoleColor.Red); } } if (_warnings.Count > 0 && !_jsonOutput) { foreach (var warningMsg in _warnings) { Console.WriteLine(warningMsg, ConsoleColor.Blue); } } _errors.Clear(); _warnings.Clear(); } if (story.currentChoices.Count == 0 && keepOpenAfterStoryFinish) { if (_jsonOutput) { Console.WriteLine("{\"end\": true}"); } else { Console.WriteLine("--- End of story ---"); } } }
public string RequestExternalFunctionResult(string functionName, object[] args) { var arguments = ""; for (var i = 0; i < args.Length; i++) { if (args[i] is string) { args[i] = "\"" + args[i] + "\""; } arguments += args[i]; if (i + 1 < args.Length) { arguments += ", "; } } if (!_jsonOutput) { Console.ForegroundColor = ConsoleColor.Blue; Console.Write("Enter result for " + functionName + "(" + arguments + ") > "); Console.ResetColor(); } else { var writer = new Runtime.SimpleJson.Writer(); writer.WriteObjectStart(); writer.WriteProperty("external-function", functionName); if (arguments != "") { writer.WritePropertyStart("arguments"); writer.WriteArrayStart(); writer.Write(arguments); writer.WriteArrayEnd(); writer.WritePropertyEnd(); } writer.WriteObjectEnd(); Console.WriteLine(writer.ToString()); } string userInput = Console.ReadLine(); // If we have null user input, it means that we're // "at the end of the stream", or in other words, the input // stream has closed, so there's nothing more we can do. // We return immediately, since otherwise we get into a busy // loop waiting for user input. if (userInput == null) { if (_jsonOutput) { Console.WriteLine("{\"close\": true}"); } else { Console.WriteLine("<User input stream closed.>"); } } return(userInput); }
public void Begin() { EvaluateStory(); var rand = new Random(); while (story.currentChoices.Count > 0 || this.keepOpenAfterStoryFinish) { var choices = story.currentChoices; var choiceIdx = 0; bool choiceIsValid = false; string userDivertedPath = null; // autoPlay: Pick random choice if (autoPlay) { choiceIdx = rand.Next() % choices.Count; } // Normal: Ask user for choice number else { if (!_jsonOutput) { Console.ForegroundColor = ConsoleColor.Blue; // Add extra newline to ensure that the choice is // on a separate line. Console.WriteLine(); int i = 1; foreach (Choice choice in choices) { Console.WriteLine("{0}: {1}", i, choice.text); i++; } } else { var writer = new Runtime.SimpleJson.Writer(); writer.WriteObjectStart(); writer.WritePropertyStart("choices"); writer.WriteArrayStart(); foreach (var choice in choices) { writer.Write(choice.text); } writer.WriteArrayEnd(); writer.WritePropertyEnd(); writer.WriteObjectEnd(); Console.WriteLine(writer.ToString()); } do { if (!_jsonOutput) { // Prompt Console.Write("?> "); } else { // Johnny Five, he's alive! Console.Write("{\"needInput\": true}"); } string userInput = Console.ReadLine(); // If we have null user input, it means that we're // "at the end of the stream", or in other words, the input // stream has closed, so there's nothing more we can do. // We return immediately, since otherwise we get into a busy // loop waiting for user input. if (userInput == null) { if (_jsonOutput) { Console.WriteLine("{\"close\": true}"); } else { Console.WriteLine("<User input stream closed.>"); } return; } var result = ReadCommandLineInput(userInput); if (result.output != null) { if (_jsonOutput) { var writer = new Runtime.SimpleJson.Writer(); writer.WriteObjectStart(); writer.WriteProperty("cmdOutput", result.output); writer.WriteObjectEnd(); Console.WriteLine(writer.ToString()); } else { Console.WriteLine(result.output); } } if (result.requestsExit) { return; } if (result.divertedPath != null) { userDivertedPath = result.divertedPath; } if (result.choiceIdx >= 0) { if (result.choiceIdx >= choices.Count) { if (!_jsonOutput) // fail silently in json mode { Console.WriteLine("Choice out of range"); } } else { choiceIdx = result.choiceIdx; choiceIsValid = true; } } } while(!choiceIsValid && userDivertedPath == null); } Console.ResetColor(); if (choiceIsValid) { story.ChooseChoiceIndex(choiceIdx); } else if (userDivertedPath != null) { story.ChoosePathString(userDivertedPath); userDivertedPath = null; } EvaluateStory(); } }