public void DebugDump(TextWriter writer, Story story) { if (Name.Length > 0) { if (Negate) writer.Write("!"); writer.Write("{0}(", Name); if (Parameters != null) { for (var i = 0; i < Parameters.Count; i++) { Parameters[i].DebugDump(writer, story); if (i < Parameters.Count - 1) writer.Write(", "); } } writer.Write(") "); } if (GoalIdOrDebugHook != 0) { if (GoalIdOrDebugHook < 0) { writer.Write("<Debug hook #{0}>", -GoalIdOrDebugHook); } else { var goal = story.Goals[(uint)GoalIdOrDebugHook]; writer.Write("<Complete goal #{0} {1}>", GoalIdOrDebugHook, goal.Name); } } }
public override void DebugDump(TextWriter writer, Story story) { base.DebugDump(writer, story); writer.Write(" "); if (ParentRef.IsValid()) { writer.Write(" Parent "); ParentRef.DebugDump(writer, story); } if (AdapterRef.IsValid()) { writer.Write(" Adapter "); AdapterRef.DebugDump(writer, story); } if (RelDatabaseRef.IsValid()) { writer.Write(" Database "); RelDatabaseRef.DebugDump(writer, story); writer.Write(" Flag {0}", RelDatabaseFlag); writer.Write(" Entry "); RelDatabase.DebugDump(writer, story); } writer.WriteLine(""); }
public override void MakeScript(TextWriter writer, Story story, Tuple tuple) { var adaptedTuple = story.Adapters[AdapterRef.AdapterIndex].Adapt(tuple); story.Nodes[ParentRef.NodeIndex].MakeScript(writer, story, adaptedTuple); writer.WriteLine("AND"); if (Value1Index != -1) adaptedTuple.Logical[Value1Index].MakeScript(writer, story, tuple); else Value1.MakeScript(writer, story, tuple); switch (RelOp) { case RelOpType.Less: writer.Write(" < "); break; case RelOpType.LessOrEqual: writer.Write(" <= "); break; case RelOpType.Greater: writer.Write(" > "); break; case RelOpType.GreaterOrEqual: writer.Write(" >= "); break; case RelOpType.Equal: writer.Write(" == "); break; case RelOpType.NotEqual: writer.Write(" != "); break; } if (Value2Index != -1) adaptedTuple.Logical[Value2Index].MakeScript(writer, story, tuple); else Value2.MakeScript(writer, story, tuple); writer.WriteLine(); }
public void DebugDump(TextWriter writer, Story story) { for (var i = 0; i < Types.Count; i++) { writer.Write(story.Types[Types[i]].Name); if (i < Types.Count - 1) writer.Write(", "); } }
public void DebugDump(TextWriter writer, Story story) { if (!IsValid()) { writer.Write("(None)"); } else { writer.Write("#{0}", AdapterIndex); } }
public override void DebugDump(TextWriter writer, Story story) { base.DebugDump(writer, story); writer.Write(" Left:"); if (LeftParentRef.IsValid()) { writer.Write(" Parent "); LeftParentRef.DebugDump(writer, story); } if (Adapter1Ref.IsValid()) { writer.Write(" Adapter "); Adapter1Ref.DebugDump(writer, story); } if (Database1Ref.IsValid()) { writer.Write(" Database "); Database1Ref.DebugDump(writer, story); writer.Write(" Flag {0}", Database1Flag); writer.Write(" Entry "); Database1.DebugDump(writer, story); } writer.WriteLine(""); writer.Write(" Right:"); if (RightParentRef.IsValid()) { writer.Write(" Parent "); RightParentRef.DebugDump(writer, story); } if (Adapter2Ref.IsValid()) { writer.Write(" Adapter "); Adapter2Ref.DebugDump(writer, story); } if (Database2Ref.IsValid()) { writer.Write(" Database "); Database2Ref.DebugDump(writer, story); writer.Write(" Flag {0}", Database2Flag); writer.Write(" Entry "); Database2.DebugDump(writer, story); } writer.WriteLine(""); }
public void DebugDump(TextWriter writer, Story story) { writer.Write(Name); writer.Write("("); for (var i = 0; i < Parameters.Types.Count; i++) { var type = story.Types[Parameters.Types[i]]; var isOutParam = ((OutParamMask[i >> 3] << (i & 7)) & 0x80) == 0x80; if (isOutParam) writer.Write("out "); writer.Write(type.Name); if (i < Parameters.Types.Count - 1) writer.Write(", "); } writer.Write(")"); }
public override void DebugDump(TextWriter writer, Story story) { base.DebugDump(writer, story); if (ReferencedBy.Count > 0) { writer.WriteLine(" Referenced By:"); foreach (var entry in ReferencedBy) { writer.Write(" "); entry.DebugDump(writer, story); writer.WriteLine(""); } } }
public void DebugDump(TextWriter writer, Story story) { writer.WriteLine("{0}: SGC {1}, Unknown {2}", Name, SubGoalCombination, Unknown); if (ParentGoals.Count > 0) { writer.Write(" Parent goals: "); foreach (var goalId in ParentGoals) { var goal = story.Goals[goalId]; writer.Write("#{0} {1}, ", goalId, goal.Name); } writer.WriteLine(); } if (SubGoals.Count > 0) { writer.Write(" Subgoals: "); foreach (var goalId in SubGoals) { var goal = story.Goals[goalId]; writer.Write("#{0} {1}, ", goalId, goal.Name); } writer.WriteLine(); } if (InitCalls.Count > 0) { writer.WriteLine(" Init Calls: "); foreach (var call in InitCalls) { writer.Write(" "); call.DebugDump(writer, story); writer.WriteLine(); } } if (ExitCalls.Count > 0) { writer.WriteLine(" Exit Calls: "); foreach (var call in ExitCalls) { writer.Write(" "); call.DebugDump(writer, story); writer.WriteLine(); } } }
public virtual void DebugDump(TextWriter writer, Story story) { if (Name.Length > 0) { writer.Write("{0}/{1}: ", Name, NameIndex); } writer.Write("<{0}>", TypeName()); if (DatabaseRef.IsValid()) { writer.Write(", Database "); DatabaseRef.DebugDump(writer, story); } writer.WriteLine(); }
public override void DebugDump(TextWriter writer, Story story) { base.DebugDump(writer, story); writer.Write(" Left Value: "); if (Value1Index != -1) writer.Write("[Source Column {0}]", Value1Index); else Value1.DebugDump(writer, story); writer.WriteLine(); writer.Write(" Right Value: "); if (Value2Index != -1) writer.Write("[Source Column {0}]", Value2Index); else Value2.DebugDump(writer, story); writer.WriteLine(); }
public void DebugDump(TextWriter writer, Story story) { if (!IsValid()) { writer.Write("(None)"); } else { var node = story.Nodes[NodeIndex]; if (node.Name.Length > 0) { writer.Write("#{0} <{1}/{2} {3}>", NodeIndex, node.Name, node.NameIndex, node.TypeName()); } else { writer.Write("#{0} <{1}>", NodeIndex, node.TypeName()); } } }
public override void DebugDump(TextWriter writer, Story story) { base.DebugDump(writer, story); writer.WriteLine(" Variables: "); foreach (var v in Variables) { writer.Write(" "); v.DebugDump(writer, story); writer.WriteLine(""); } writer.WriteLine(" Calls: "); foreach (var call in Calls) { writer.Write(" "); call.DebugDump(writer, story); writer.WriteLine(""); } }
public virtual void PostSave(Story story) { }
public virtual void MakeScript(TextWriter writer, Story story, Tuple tuple, bool printTypes = false) { switch ((Type)TypeId) { case Type.Unknown: throw new InvalidDataException("Script cannot contain unknown values"); case Type.Integer: writer.Write(IntValue); break; case Type.Float: writer.Write(FloatValue); break; case Type.String: writer.Write("\"{0}\"", StringValue); break; default: writer.Write(StringValue); break; } }
public Goal(Story story) { Story = story; }
public void MakeScript(TextWriter writer, Story story, Tuple tuple) { if (Name.Length > 0) { if (Negate) writer.Write("NOT "); writer.Write("{0}(", Name); if (Parameters != null) { for (var i = 0; i < Parameters.Count; i++) { var param = Parameters[i]; param.MakeScript(writer, story, tuple); if (i < Parameters.Count - 1) writer.Write(", "); } } writer.Write(")"); } if (GoalIdOrDebugHook > 0) { writer.Write("GoalCompleted;"); } }
public void MakeScript(TextWriter writer, Story story, bool printTypes = false) { for (var i = 0; i < Physical.Count; i++) { var value = Physical[i]; value.MakeScript(writer, story, null, printTypes); if (i < Physical.Count - 1) writer.Write(", "); } }
public void Visit(Story story) { using (var streamWriter = new StreamWriter(stream)) using (this.writer = new JsonTextWriter(streamWriter)) { writer.IndentChar = '\t'; writer.Indentation = 1; writer.Formatting = Newtonsoft.Json.Formatting.Indented; writer.WriteStartObject(); writer.WritePropertyName("types"); writer.WriteStartObject(); foreach (var type in story.Types) { writer.WritePropertyName(type.Key.ToString()); Visit(type.Value); } writer.WriteEndObject(); writer.WritePropertyName("objects"); writer.WriteStartObject(); foreach (var obj in story.DivObjects) { writer.WritePropertyName(obj.Name); Visit(obj); } writer.WriteEndObject(); writer.WritePropertyName("functions"); writer.WriteStartObject(); Int32 funcId = 1; foreach (var fun in story.Functions) { writer.WritePropertyName(funcId.ToString()); funcId++; Visit(fun); } writer.WriteEndObject(); writer.WritePropertyName("nodes"); writer.WriteStartObject(); foreach (var node in story.Nodes) { writer.WritePropertyName(node.Key.ToString()); writer.WriteStartObject(); VisitNode(node.Value); writer.WriteEndObject(); } writer.WriteEndObject(); writer.WritePropertyName("adapters"); writer.WriteStartObject(); foreach (var adapter in story.Adapters) { writer.WritePropertyName(adapter.Key.ToString()); Visit(adapter.Value); } writer.WriteEndObject(); writer.WritePropertyName("databases"); writer.WriteStartObject(); foreach (var database in story.Databases) { writer.WritePropertyName(database.Key.ToString()); Visit(database.Value); } writer.WriteEndObject(); writer.WritePropertyName("goals"); writer.WriteStartObject(); foreach (var goal in story.Goals) { writer.WritePropertyName(goal.Key.ToString()); Visit(goal.Value); } writer.WriteEndObject(); writer.WriteEndObject(); } }
public void DebugDump(TextWriter writer, Story story) { writer.Write("Adapter - "); if (OwnerNode != null && OwnerNode.Name.Length > 0) { writer.WriteLine("Node {0}/{1}", OwnerNode.Name, OwnerNode.NameIndex); } else if (OwnerNode != null) { writer.WriteLine("Node <{0}>", OwnerNode.TypeName()); } else { writer.WriteLine("(Not owned)"); } if (Constants.Logical.Count > 0) { writer.Write(" Constants: "); Constants.DebugDump(writer, story); writer.WriteLine(""); } if (LogicalIndices.Count > 0) { writer.Write(" Logical indices: "); foreach (var index in LogicalIndices) { writer.Write("{0}, ", index); } writer.WriteLine(""); } if (LogicalToPhysicalMap.Count > 0) { writer.Write(" Logical to physical mappings: "); foreach (var pair in LogicalToPhysicalMap) { writer.Write("{0} -> {1}, ", pair.Key, pair.Value); } writer.WriteLine(""); } }
public override void MakeScript(TextWriter writer, Story story, Tuple tuple, bool printTypes = false) { if (Unused) { writer.Write("_"); } else if (Adapted) { if (VariableName != null && VariableName.Length > 0) { if (printTypes) { writer.Write("({0})", story.Types[TypeId].Name); } writer.Write(VariableName); } else { tuple.Logical[Index].MakeScript(writer, story, null); } } else { base.MakeScript(writer, story, tuple); } }
public RuleType GetRuleType(Story story) { var root = GetRoot(story); if (root is ProcNode) { if (IsQuery) return RuleType.Query; else return RuleType.Proc; } else return RuleType.Rule; }
public override void MakeScript(TextWriter writer, Story story, Tuple tuple) { switch (GetRuleType(story)) { case RuleType.Proc: writer.WriteLine("PROC"); break; case RuleType.Query: writer.WriteLine("QRY"); break; case RuleType.Rule: writer.WriteLine("IF"); break; } var initialTuple = MakeInitialTuple(); story.Nodes[ParentRef.NodeIndex].MakeScript(writer, story, initialTuple); writer.WriteLine("THEN"); foreach (var call in Calls) { call.MakeScript(writer, story, initialTuple); writer.WriteLine(); } }
public Node GetRoot(Story story) { Node parent = this; for (;;) { if (parent is RelNode) { var rel = parent as RelNode; parent = story.Nodes[rel.ParentRef.NodeIndex]; } else if (parent is JoinNode) { var join = parent as JoinNode; parent = story.Nodes[join.LeftParentRef.NodeIndex]; } else { return parent; } } }
public void Write(Stream stream, Story story) { using (Writer = new OsiWriter(stream)) { foreach (var node in story.Nodes) { node.Value.PreSave(story); } Writer.MajorVersion = story.MajorVersion; Writer.MinorVersion = story.MinorVersion; var header = new SaveFileHeader(); if (Writer.Ver >= OsiVersion.VerExternalStringTable) { header.Version = "Osiris save file dd. 03/30/17 07:28:20. Version 1.8."; } else { header.Version = "Osiris save file dd. 02/10/15 12:44:13. Version 1.5."; } header.MajorVersion = story.MajorVersion; header.MinorVersion = story.MinorVersion; header.BigEndian = false; header.Unused = 0; // Debug flags used in D:OS EE and D:OS 2 header.DebugFlags = 0x000C10A0; header.Write(Writer); if (Writer.Ver > OsiVersion.VerLastSupported) { var msg = String.Format( "Osiris version v{0}.{1} unsupported; this tool supports saving up to version 1.11.", Writer.MajorVersion, Writer.MinorVersion ); throw new InvalidDataException(msg); } if (Writer.Ver >= OsiVersion.VerScramble) { Writer.Scramble = 0xAD; } if (Writer.Ver >= OsiVersion.VerAddTypeMap) { // Don't export builtin types, only externally declared ones var types = story.Types.Values.Where(t => !t.IsBuiltin).ToList(); WriteTypes(types); } // TODO: regenerate string table? if (Writer.Ver >= OsiVersion.VerExternalStringTable && Writer.Ver < OsiVersion.VerRemoveExternalStringTable) { WriteStrings(story.ExternalStringTable); } Writer.WriteList(story.DivObjects); Writer.WriteList(story.Functions); WriteNodes(story.Nodes); WriteAdapters(story.Adapters); WriteDatabases(story.Databases); WriteGoals(story.Goals); Writer.WriteList(story.GlobalActions); foreach (var node in story.Nodes) { node.Value.PostSave(story); } } }
public abstract void MakeScript(TextWriter writer, Story story, Tuple tuple, bool printTypes = false);
public override void DebugDump(TextWriter writer, Story story) { if (IsValid) writer.Write("valid "); if (OutParam) writer.Write("out "); if (IsAType) writer.Write("type "); if (IsValid) { base.DebugDump(writer, story); } else { writer.Write("<{0}>", story.Types[TypeId].Name); } }
public Story Read(Stream stream) { var story = new Story(); using (var reader = new OsiReader(stream, story)) { var header = new SaveFileHeader(); header.Read(reader); reader.MinorVersion = header.MinorVersion; reader.MajorVersion = header.MajorVersion; story.MinorVersion = header.MinorVersion; story.MajorVersion = header.MajorVersion; if (reader.Ver > OsiVersion.VerLastSupported) { var msg = String.Format( "Osiris version v{0}.{1} unsupported; this tool supports loading up to version 1.12.", reader.MajorVersion, reader.MinorVersion ); throw new InvalidDataException(msg); } if (reader.Ver >= OsiVersion.VerScramble) { reader.Scramble = 0xAD; } if (reader.Ver >= OsiVersion.VerAddTypeMap) { story.Types = ReadTypes(reader); foreach (var type in story.Types) { if (type.Value.Alias != 0) { reader.TypeAliases.Add(type.Key, type.Value.Alias); } } } else { story.Types = new Dictionary <uint, OsirisType>(); } if (reader.Ver >= OsiVersion.VerExternalStringTable && reader.Ver < OsiVersion.VerRemoveExternalStringTable) { story.ExternalStringTable = ReadStrings(reader); } else { story.ExternalStringTable = new List <string>(); } story.Types[0] = OsirisType.MakeBuiltin(0, "UNKNOWN"); story.Types[1] = OsirisType.MakeBuiltin(1, "INTEGER"); if (reader.Ver >= OsiVersion.VerEnhancedTypes) { story.Types[2] = OsirisType.MakeBuiltin(2, "INTEGER64"); story.Types[3] = OsirisType.MakeBuiltin(3, "REAL"); story.Types[4] = OsirisType.MakeBuiltin(4, "STRING"); story.Types[5] = OsirisType.MakeBuiltin(5, "GUIDSTRING"); } else { story.Types[2] = OsirisType.MakeBuiltin(2, "FLOAT"); story.Types[3] = OsirisType.MakeBuiltin(3, "STRING"); // Populate custom type IDs for versions that had no type alias map if (reader.Ver < OsiVersion.VerAddTypeMap) { for (byte typeId = 4; typeId <= 17; typeId++) { story.Types[typeId] = OsirisType.MakeBuiltin(typeId, $"TYPE{typeId}"); story.Types[typeId].Alias = 3; reader.TypeAliases.Add(typeId, 3); } } } story.DivObjects = reader.ReadList <OsirisDivObject>(); story.Functions = reader.ReadList <Function>(); story.Nodes = ReadNodes(reader); story.Adapters = ReadAdapters(reader); story.Databases = ReadDatabases(reader); story.Goals = ReadGoals(reader, story); story.GlobalActions = reader.ReadList <Call>(); story.FunctionSignatureMap = new Dictionary <string, Function>(); foreach (var func in story.Functions) { story.FunctionSignatureMap.Add(func.Name.Name + "/" + func.Name.Parameters.Types.Count.ToString(), func); } foreach (var node in story.Nodes) { node.Value.PostLoad(story); } return(story); } }
public override void DebugDump(TextWriter writer, Story story) { writer.Write("#{0} ", Index); if (VariableName != null && VariableName.Length > 0) writer.Write("'{0}' ", VariableName); if (Unused) writer.Write("unused "); if (Adapted) writer.Write("adapted "); base.DebugDump(writer, story); }
public void Write(Stream stream, Story story) { using (Writer = new OsiWriter(stream)) { Writer.MajorVersion = story.MajorVersion; Writer.MinorVersion = story.MinorVersion; var header = new OsirisHeader(); header.Version = "Osiris save file dd. 02/10/15 12:44:13. Version 1.5."; header.MajorVersion = story.MajorVersion; header.MinorVersion = story.MinorVersion; header.BigEndian = false; header.Unused = 0; // Debug flags used in D:OS EE header.DebugFlags = 0x000CA010; header.Write(Writer); if (Writer.MajorVersion > 1 || (Writer.MajorVersion == 1 && Writer.MinorVersion > 7)) { var msg = String.Format( "Osiris version v{0}.{1} unsupported; this tool supports versions up to v1.7.", Writer.MajorVersion, Writer.MinorVersion ); throw new InvalidDataException(msg); } if (Writer.MajorVersion > 1 || (Writer.MajorVersion == 1 && Writer.MinorVersion >= 4)) Writer.Scramble = 0xAD; if (Writer.MajorVersion > 1 || (Writer.MajorVersion == 1 && Writer.MinorVersion >= 5)) WriteTypes(story.Types); Writer.WriteList(story.DivObjects); Writer.WriteList(story.Functions); WriteNodes(story.Nodes); WriteAdapters(story.Adapters); WriteDatabases(story.Databases); WriteGoals(story.Goals); Writer.WriteList(story.GlobalActions); } }
public void DebugDump(TextWriter writer, Story story) { writer.Write("("); var keys = Logical.Keys.ToArray(); for (var i = 0; i < Logical.Count; i++) { writer.Write("{0}: ", keys[i]); Logical[keys[i]].DebugDump(writer, story); if (i < Logical.Count - 1) writer.Write(", "); } writer.Write(")"); }
public void DebugDump(TextWriter writer, Story story) { writer.Write("{0} ", Type.ToString()); Name.DebugDump(writer, story); if (NodeRef.IsValid()) { var node = story.Nodes[NodeRef.NodeIndex]; writer.Write(" @ {0}/{1}", node.Name, node.NameIndex); } writer.WriteLine(" [{0}, {1}]", Unknown1, Unknown2); }
public OsiReader(Stream stream, Story story) : base(stream) { Story = story; }
public FactCollection(Database database, Story story) : base() { Database = database; Story = story; }
public override void DebugDump(TextWriter writer, Story story) { base.DebugDump(writer, story); writer.Write(" Next: "); NextNode.DebugDump(writer, story); writer.WriteLine(""); }
public override void MakeScript(TextWriter writer, Story story, Tuple tuple) { writer.Write("{0}(", Name); tuple.MakeScript(writer, story); writer.WriteLine(")"); }
public override void PostSave(Story story) { base.PostSave(story); RemoveQueryPostfix(story); }
public virtual void DebugDump(TextWriter writer, Story story) { switch ((Type)TypeId) { case Type.Unknown: writer.Write("<unknown>"); break; case Type.Integer: writer.Write(IntValue); break; case Type.Float: writer.Write(FloatValue); break; case Type.String: writer.Write("'{0}'", StringValue); break; default: writer.Write(StringValue); break; } }
public override void MakeScript(TextWriter writer, Story story, Tuple tuple, bool printTypes) { writer.Write("{0}(", Name); tuple.MakeScript(writer, story, true); writer.WriteLine(")"); }
public virtual void PreSave(Story story) { }
public Story Read(Stream stream) { using (var reader = new OsiReader(stream)) { var story = new Story(); var header = new OsirisHeader(); header.Read(reader); reader.MinorVersion = header.MinorVersion; reader.MajorVersion = header.MajorVersion; story.MinorVersion = header.MinorVersion; story.MajorVersion = header.MajorVersion; if (reader.MajorVersion > 1 || (reader.MajorVersion == 1 && reader.MinorVersion > 7)) { var msg = String.Format( "Osiris version v{0}.{1} unsupported; this tool supports versions up to v1.7.", reader.MajorVersion, reader.MinorVersion ); throw new InvalidDataException(msg); } if (reader.MajorVersion > 1 || (reader.MajorVersion == 1 && reader.MinorVersion >= 4)) reader.Scramble = 0xAD; if (reader.MajorVersion > 1 || (reader.MajorVersion == 1 && reader.MinorVersion >= 5)) story.Types = ReadTypes(reader); else story.Types = new Dictionary<uint, OsirisType>(); story.Types[0] = new OsirisType(); story.Types[0].Index = 0; story.Types[0].Name = "UNKNOWN"; story.Types[1] = new OsirisType(); story.Types[1].Index = 1; story.Types[1].Name = "INTEGER"; story.Types[2] = new OsirisType(); story.Types[2].Index = 2; story.Types[2].Name = "FLOAT"; story.Types[3] = new OsirisType(); story.Types[3].Index = 3; story.Types[3].Name = "STRING"; story.DivObjects = reader.ReadList<OsirisDivObject>(); story.Functions = reader.ReadList<Function>(); story.Nodes = ReadNodes(reader); story.Adapters = ReadAdapters(reader); story.Databases = ReadDatabases(reader); story.Goals = ReadGoals(reader); story.GlobalActions = reader.ReadList<Call>(); foreach (var node in story.Nodes) { if (node.Value.DatabaseRef.IsValid()) { var database = story.Databases[node.Value.DatabaseRef.DatabaseIndex]; if (database.OwnerNode != null) { throw new InvalidDataException("A database cannot be assigned to multiple database nodes!"); } database.OwnerNode = node.Value; } if (node.Value is RuleNode) { // Remove the __DEF__ postfix that is added to the end of Query nodes var rule = node.Value as RuleNode; if (rule.IsQuery) { var ruleRoot = rule.GetRoot(story); if (ruleRoot.Name != null && ruleRoot.Name.Length > 7 && ruleRoot.Name.Substring(ruleRoot.Name.Length - 7) == "__DEF__") { ruleRoot.Name = ruleRoot.Name.Substring(0, ruleRoot.Name.Length - 7); } } } if (node.Value is DataNode) { var data = node.Value as DataNode; foreach (var reference in data.ReferencedBy) { if (reference.NodeRef.IsValid()) { var ruleNode = story.Nodes[reference.NodeRef.NodeIndex]; if (reference.GoalId > 0 && ruleNode is RuleNode) { (ruleNode as RuleNode).DerivedGoalId = reference.GoalId; } } } } if (node.Value is TreeNode) { var tree = node.Value as TreeNode; if (tree.NextNode.NodeRef.IsValid()) { var nextNode = story.Nodes[tree.NextNode.NodeRef.NodeIndex]; if (nextNode is RuleNode) { (nextNode as RuleNode).DerivedGoalId = tree.NextNode.GoalId; } } } if (node.Value is RelNode) { var rel = node.Value as RelNode; if (rel.AdapterRef.IsValid()) { var adapter = story.Adapters[rel.AdapterRef.AdapterIndex]; if (adapter.OwnerNode != null) { throw new InvalidDataException("An adapter cannot be assigned to multiple join/rel nodes!"); } adapter.OwnerNode = node.Value; } } else if (node.Value is JoinNode) { var join = node.Value as JoinNode; if (join.Adapter1Ref.IsValid()) { var adapter = story.Adapters[join.Adapter1Ref.AdapterIndex]; if (adapter.OwnerNode != null) { throw new InvalidDataException("An adapter cannot be assigned to multiple join/rel nodes!"); } adapter.OwnerNode = node.Value; } if (join.Adapter2Ref.IsValid()) { var adapter = story.Adapters[join.Adapter2Ref.AdapterIndex]; if (adapter.OwnerNode != null) { throw new InvalidDataException("An adapter cannot be assigned to multiple join/rel nodes!"); } adapter.OwnerNode = node.Value; } } } return story; } }