mirror of
https://github.com/Ratstail91/Mementos.git
synced 2025-11-29 02:24:28 +11:00
Committed everything
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user