Files
Mementos/Unity/Alternate Genre Jam/Assets/Ink/InkLibs/InkRuntime/Flow.cs
2021-06-30 21:39:19 +10:00

93 lines
3.4 KiB
C#

using System.Collections.Generic;
namespace Ink.Runtime
{
public class Flow {
public string name;
public CallStack callStack;
public List<Runtime.Object> outputStream;
public List<Choice> currentChoices;
public Flow(string name, Story story) {
this.name = name;
this.callStack = new CallStack(story);
this.outputStream = new List<Object>();
this.currentChoices = new List<Choice>();
}
public Flow(string name, Story story, Dictionary<string, object> jObject) {
this.name = name;
this.callStack = new CallStack(story);
this.callStack.SetJsonToken ((Dictionary < string, object > )jObject ["callstack"], story);
this.outputStream = Json.JArrayToRuntimeObjList ((List<object>)jObject ["outputStream"]);
this.currentChoices = Json.JArrayToRuntimeObjList<Choice>((List<object>)jObject ["currentChoices"]);
// choiceThreads is optional
object jChoiceThreadsObj;
jObject.TryGetValue("choiceThreads", out jChoiceThreadsObj);
LoadFlowChoiceThreads((Dictionary<string, object>)jChoiceThreadsObj, story);
}
public void WriteJson(SimpleJson.Writer writer)
{
writer.WriteObjectStart();
writer.WriteProperty("callstack", callStack.WriteJson);
writer.WriteProperty("outputStream", w => Json.WriteListRuntimeObjs(w, outputStream));
// choiceThreads: optional
// Has to come BEFORE the choices themselves are written out
// since the originalThreadIndex of each choice needs to be set
bool hasChoiceThreads = false;
foreach (Choice c in currentChoices)
{
c.originalThreadIndex = c.threadAtGeneration.threadIndex;
if (callStack.ThreadWithIndex(c.originalThreadIndex) == null)
{
if (!hasChoiceThreads)
{
hasChoiceThreads = true;
writer.WritePropertyStart("choiceThreads");
writer.WriteObjectStart();
}
writer.WritePropertyStart(c.originalThreadIndex);
c.threadAtGeneration.WriteJson(writer);
writer.WritePropertyEnd();
}
}
if (hasChoiceThreads)
{
writer.WriteObjectEnd();
writer.WritePropertyEnd();
}
writer.WriteProperty("currentChoices", w => {
w.WriteArrayStart();
foreach (var c in currentChoices)
Json.WriteChoice(w, c);
w.WriteArrayEnd();
});
writer.WriteObjectEnd();
}
// Used both to load old format and current
public void LoadFlowChoiceThreads(Dictionary<string, object> jChoiceThreads, Story story)
{
foreach (var choice in currentChoices) {
var foundActiveThread = callStack.ThreadWithIndex(choice.originalThreadIndex);
if( foundActiveThread != null ) {
choice.threadAtGeneration = foundActiveThread.Copy ();
} else {
var jSavedChoiceThread = (Dictionary <string, object>) jChoiceThreads[choice.originalThreadIndex.ToString()];
choice.threadAtGeneration = new CallStack.Thread(jSavedChoiceThread, story);
}
}
}
}
}