예제 #1
0
파일: Call.cs 프로젝트: Norbyte/lslib
        public void Read(OsiReader reader)
        {
            Name = reader.ReadString();
            if (Name.Length > 0)
            {
                var hasParams = reader.ReadByte();
                if (hasParams > 0)
                {
                    Parameters = new List<TypedValue>();
                    var numParams = reader.ReadByte();
                    while (numParams-- > 0)
                    {
                        TypedValue param;
                        var type = reader.ReadByte();
                        if (type == 1)
                            param = new Variable();
                        else
                            param = new TypedValue();
                        param.Read(reader);
                        Parameters.Add(param);
                    }
                }

                Negate = reader.ReadBoolean();
            }

            GoalIdOrDebugHook = reader.ReadInt32();
        }
예제 #2
0
파일: Rule.cs 프로젝트: Norbyte/lslib
        public override void Read(OsiReader reader)
        {
            base.Read(reader);
            Calls = reader.ReadList<Call>();

            Variables = new List<Variable>();
            var variables = reader.ReadByte();
            while (variables-- > 0)
            {
                var type = reader.ReadByte();
                if (type != 1) throw new InvalidDataException("Illegal value type in rule variable list");
                var variable = new Variable();
                variable.Read(reader);
                if (variable.Adapted)
                {
                    variable.VariableName = String.Format("_Var{0}", Variables.Count + 1);
                }

                Variables.Add(variable);
            }

            Line = reader.ReadUInt32();

            if (reader.MajorVersion > 1 || (reader.MajorVersion == 1 && reader.MinorVersion >= 6))
                IsQuery = reader.ReadBoolean();
            else
                IsQuery = false;
        }
예제 #3
0
파일: Goal.cs 프로젝트: Norbyte/lslib
        public void Read(OsiReader reader)
        {
            Index = reader.ReadUInt32();
            Name = reader.ReadString();
            SubGoalCombination = reader.ReadByte();

            ParentGoals = new List<uint>();
            var numItems = reader.ReadUInt32();
            while (numItems-- > 0)
            {
                ParentGoals.Add(reader.ReadUInt32());
            }

            SubGoals = new List<uint>();
            numItems = reader.ReadUInt32();
            while (numItems-- > 0)
            {
                SubGoals.Add(reader.ReadUInt32());
            }

            Unknown = reader.ReadByte();

            if (reader.MajorVersion > 1 || (reader.MajorVersion == 1 && reader.MinorVersion >= 1))
            {
                InitCalls = reader.ReadList<Call>();
                ExitCalls = reader.ReadList<Call>();
            }
            else
            {
                InitCalls = new List<Call>();
                ExitCalls = new List<Call>();
            }
        }
예제 #4
0
파일: Function.cs 프로젝트: Norbyte/lslib
 public void Read(OsiReader reader)
 {
     Types = new List<UInt32>();
     var count = reader.ReadByte();
     while (count-- > 0)
     {
         Types.Add(reader.ReadUInt32());
     }
 }
예제 #5
0
파일: Node.cs 프로젝트: Norbyte/lslib
 public virtual void Read(OsiReader reader)
 {
     DatabaseRef = reader.ReadDatabaseRef();
     Name = reader.ReadString();
     if (Name.Length > 0)
     {
         NameIndex = reader.ReadByte();
     }
 }
예제 #6
0
파일: Rel.cs 프로젝트: Norbyte/lslib
        public override void Read(OsiReader reader)
        {
            base.Read(reader);
            ParentRef = reader.ReadNodeRef();
            AdapterRef = reader.ReadAdapterRef();

            RelDatabaseRef = reader.ReadDatabaseRef();
            RelDatabase = new NodeEntryItem();
            RelDatabase.Read(reader);
            RelDatabaseFlag = reader.ReadByte();
        }
예제 #7
0
파일: Function.cs 프로젝트: Norbyte/lslib
        public void Read(OsiReader reader)
        {
            Name = reader.ReadString();
            OutParamMask = new List<byte>();
            var outParamBytes = reader.ReadUInt32();
            while (outParamBytes-- > 0)
            {
                OutParamMask.Add(reader.ReadByte());
            }

            Parameters = new ParameterList();
            Parameters.Read(reader);
        }
예제 #8
0
파일: RelOp.cs 프로젝트: Norbyte/lslib
        public override void Read(OsiReader reader)
        {
            base.Read(reader);
            Value1Index = reader.ReadSByte();
            Value2Index = reader.ReadSByte();

            Value1 = new Value();
            Value1.Read(reader);

            Value2 = new Value();
            Value2.Read(reader);

            RelOp = (RelOpType)reader.ReadInt32();
        }
예제 #9
0
파일: Join.cs 프로젝트: Norbyte/lslib
        public override void Read(OsiReader reader)
        {
            base.Read(reader);
            LeftParentRef = reader.ReadNodeRef();
            RightParentRef = reader.ReadNodeRef();
            Adapter1Ref = reader.ReadAdapterRef();
            Adapter2Ref = reader.ReadAdapterRef();

            Database1Ref = reader.ReadDatabaseRef();
            Database1 = new NodeEntryItem();
            Database1.Read(reader);
            Database1Flag = reader.ReadByte();

            Database2Ref = reader.ReadDatabaseRef();
            Database2 = new NodeEntryItem();
            Database2.Read(reader);
            Database2Flag = reader.ReadByte();
        }
예제 #10
0
파일: Value.cs 프로젝트: Norbyte/lslib
        public virtual void Read(OsiReader reader)
        {
            var wtf = reader.ReadByte();
            if (wtf == 49)
            {
                TypeId = reader.ReadUInt32();
                IntValue = reader.ReadInt32();
            }
            else if (wtf == 48)
            {
                TypeId = reader.ReadUInt32();
                switch ((Type)TypeId)
                {
                    case Type.Unknown:
                        break;

                    case Type.Integer:
                        IntValue = reader.ReadInt32();
                        break;

                    case Type.Float:
                        FloatValue = reader.ReadSingle();
                        break;

                    case Type.String:
                        if (reader.ReadByte() > 0)
                        {
                            StringValue = reader.ReadString();
                        }
                        break;

                    default:
                        StringValue = reader.ReadString();
                        break;
                }
            }
            else
            {
                throw new InvalidDataException("Unrecognized value type");
            }
        }
예제 #11
0
파일: Adapter.cs 프로젝트: Norbyte/lslib
        public void Read(OsiReader reader)
        {
            Constants = new Tuple();
            Constants.Read(reader);

            LogicalIndices = new List<sbyte>();
            var count = reader.ReadByte();
            while (count-- > 0)
            {
                LogicalIndices.Add(reader.ReadSByte());
            }

            LogicalToPhysicalMap = new Dictionary<byte, byte>();
            count = reader.ReadByte();
            while (count-- > 0)
            {
                var key = reader.ReadByte();
                var value = reader.ReadByte();
                LogicalToPhysicalMap.Add(key, value);
            }
        }
예제 #12
0
파일: DataNode.cs 프로젝트: Norbyte/lslib
 public override void Read(OsiReader reader)
 {
     base.Read(reader);
     ReferencedBy = reader.ReadList<NodeEntryItem>();
 }
예제 #13
0
파일: Function.cs 프로젝트: Norbyte/lslib
 public void Read(OsiReader reader)
 {
     Line = reader.ReadUInt32();
     Unknown1 = reader.ReadUInt32();
     Unknown2 = reader.ReadUInt32();
     NodeRef = reader.ReadNodeRef();
     Type = (FunctionType)reader.ReadByte();
     GUID = reader.ReadGuid();
     Name = new FunctionSignature();
     Name.Read(reader);
 }
예제 #14
0
파일: Reference.cs 프로젝트: Norbyte/lslib
 public void Read(OsiReader reader)
 {
     DatabaseIndex = reader.ReadUInt32();
 }
예제 #15
0
파일: Node.cs 프로젝트: Norbyte/lslib
 public override void Read(OsiReader reader)
 {
     base.Read(reader);
     NextNode = new NodeEntryItem();
     NextNode.Read(reader);
 }
예제 #16
0
파일: Reference.cs 프로젝트: Norbyte/lslib
 public void Read(OsiReader reader)
 {
     NodeIndex = reader.ReadUInt32();
 }
예제 #17
0
파일: Reference.cs 프로젝트: Norbyte/lslib
 public void Read(OsiReader reader)
 {
     AdapterIndex = reader.ReadUInt32();
 }
예제 #18
0
파일: Value.cs 프로젝트: Norbyte/lslib
        public void Read(OsiReader reader)
        {
            Physical.Clear();
            Logical.Clear();

            var count = reader.ReadByte();
            while (count-- > 0)
            {
                var index = reader.ReadByte();
                var value = new Value();
                value.Read(reader);

                Physical.Add(value);
                Logical.Add(index, value);
            }
        }
예제 #19
0
파일: Story.cs 프로젝트: Norbyte/lslib
        private Dictionary<uint, Node> ReadNodes(OsiReader reader)
        {
            var nodes = new Dictionary<uint, Node>();
            var count = reader.ReadUInt32();
            while (count-- > 0)
            {
                Node node = null;
                var type = reader.ReadByte();
                var nodeId = reader.ReadUInt32();
                switch ((Node.Type)type)
                {
                    case Node.Type.Database:
                        node = new DatabaseNode();
                        break;

                    case Node.Type.Proc:
                        node = new ProcNode();
                        break;

                    case Node.Type.DivQuery:
                        node = new DivQueryNode();
                        break;

                    case Node.Type.InternalQuery:
                        node = new InternalQueryNode();
                        break;

                    case Node.Type.And:
                        node = new AndNode();
                        break;

                    case Node.Type.NotAnd:
                        node = new NotAndNode();
                        break;

                    case Node.Type.RelOp:
                        node = new RelOpNode();
                        break;

                    case Node.Type.Rule:
                        node = new RuleNode();
                        break;

                    case Node.Type.UserQuery:
                        node = new UserQueryNode();
                        break;

                    default:
                        throw new NotImplementedException("No serializer found for this node type");
                }

                node.Read(reader);
                nodes.Add(nodeId, node);
            }

            return nodes;
        }
예제 #20
0
파일: Value.cs 프로젝트: Norbyte/lslib
 public override void Read(OsiReader reader)
 {
     base.Read(reader);
     IsValid = reader.ReadBoolean();
     OutParam = reader.ReadBoolean();
     IsAType = reader.ReadBoolean();
 }
예제 #21
0
파일: Value.cs 프로젝트: Norbyte/lslib
 public override void Read(OsiReader reader)
 {
     base.Read(reader);
     Index = reader.ReadSByte();
     Unused = reader.ReadBoolean();
     Adapted = reader.ReadBoolean();
 }
예제 #22
0
파일: Story.cs 프로젝트: Norbyte/lslib
        private Dictionary<uint, Adapter> ReadAdapters(OsiReader reader)
        {
            var adapters = new Dictionary<uint, Adapter>();
            var count = reader.ReadUInt32();
            while (count-- > 0)
            {
                var adapterId = reader.ReadUInt32();
                var adapter = new Adapter();
                adapter.Read(reader);
                adapters.Add(adapterId, adapter);
            }

            return adapters;
        }
예제 #23
0
파일: Story.cs 프로젝트: Norbyte/lslib
        private Dictionary<uint, Database> ReadDatabases(OsiReader reader)
        {
            var databases = new Dictionary<uint, Database>();
            var count = reader.ReadUInt32();
            while (count-- > 0)
            {
                var databaseId = reader.ReadUInt32();
                var database = new Database();
                database.Read(reader);
                databases.Add(databaseId, database);
            }

            return databases;
        }
예제 #24
0
파일: Story.cs 프로젝트: Norbyte/lslib
        private Dictionary<uint, Goal> ReadGoals(OsiReader reader)
        {
            var goals = new Dictionary<uint, Goal>();
            var count = reader.ReadUInt32();
            while (count-- > 0)
            {
                var goal = new Goal();
                goal.Read(reader);
                goals.Add(goal.Index, goal);
            }

            return goals;
        }
예제 #25
0
파일: Story.cs 프로젝트: Norbyte/lslib
        private Dictionary<uint, OsirisType> ReadTypes(OsiReader reader)
        {
            var types = new Dictionary<uint, OsirisType>();
            var count = reader.ReadUInt32();
            while (count-- > 0)
            {
                var type = new OsirisType();
                type.Read(reader);
                types.Add(type.Index, type);
            }

            return types;
        }
예제 #26
0
파일: Story.cs 프로젝트: Norbyte/lslib
        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;
            }
        }