Пример #1
0
        public void extractCfgBin(BinaryReaderX br, string prefix = "")
        {
            long bk;

            //Header
            Header cfgHeader = br.ReadStruct <Header>();

            headerList.Add(cfgHeader);

            List <EditorStruct> editorEntriesLocal = new List <EditorStruct>();

            editorEntriesLocal.Add(br.ReadStruct <EditorStruct>());

            //getting Editor's notes entries
            while (true)
            {
                Label label = new Label();

                EditorStruct entryE = br.ReadStruct <EditorStruct>();
                editorEntriesLocal.Add(entryE);

                label.Name       = prefix + "editor" + (editorEntriesLocal.Count - 1).ToString();
                label.TextID     = entryE.ID;
                label.TextOffset = cfgHeader.dataOffset + entryE.entryOffset;

                bk = br.BaseStream.Position;
                br.BaseStream.Position = label.TextOffset;
                string text = ""; byte part = br.ReadByte();
                while (part != 0)
                {
                    text += Encoding.GetEncoding("ascii").GetString(new byte[] { part });
                    part  = br.ReadByte();
                }
                br.BaseStream.Position = label.TextOffset;
                label.Text             = text;
                br.BaseStream.Position = bk;

                Labels.Add(label);

                if (entryE.endingFlag == 0x0101)
                {
                    break;
                }
            }
            editorEntries.Add(editorEntriesLocal);

            bool found = false;

            bk = br.BaseStream.Position;
            while (br.BaseStream.Position < cfgHeader.dataOffset && found == false)
            {
                if (br.ReadInt32() == (int)(editorEntries[editorEntries.Count - 1][editorEntries[editorEntries.Count - 1].Count - 1].entryOffset + Labels[Labels.Count - 1].Text.Length + 1))
                {
                    found = true;
                }
            }

            br.BaseStream.Position = bk;
            if (found == false)
            {
                editorRest.Add(br.ReadBytes((int)(cfgHeader.dataOffset - br.BaseStream.Position)));
                textRest.Add(null);
                textEntries.Add(null);
            }
            else
            {
                editorRest.Add(null);

                List <TextStruct> textEntriesLocal = new List <TextStruct>();

                textEntriesLocal.Add(br.ReadStruct <TextStruct>());

                //getting text entries
                TextStruct entryT;
                TextStruct entryT2;
                int        entryCount = 1;
                do
                {
                    Label label = new Label();

                    entryT = br.ReadStruct <TextStruct>();
                    textEntriesLocal.Add(entryT);

                    entryT2 = br.ReadStruct <TextStruct>();
                    br.BaseStream.Position -= 0x14;

                    if (entryT.entryOffset != 0xFFFFFFFF)
                    {
                        label.Name       = prefix + "text" + entryCount.ToString(); entryCount++;
                        label.TextID     = entryT.ID;
                        label.TextOffset = cfgHeader.dataOffset + entryT.entryOffset;

                        bk = br.BaseStream.Position;
                        br.BaseStream.Position = label.TextOffset;
                        int count = 0; byte part = br.ReadByte();
                        while (part != 0)
                        {
                            count++;
                            part = br.ReadByte();
                        }
                        count++;
                        br.BaseStream.Position = label.TextOffset;
                        label.Text             = getUnicodeString(new BinaryReaderX(new MemoryStream(br.ReadBytes(count))));
                        br.BaseStream.Position = bk;

                        Labels.Add(label);
                    }
                } while (entryT.unk3 != 0xffffff00 && (entryT2.entryOffset <= br.BaseStream.Length || entryT2.entryOffset == 0xFFFFFFFF));
                textEntries.Add(textEntriesLocal);

                if (br.BaseStream.Position < cfgHeader.dataOffset)
                {
                    textRest.Add(br.ReadBytes((int)cfgHeader.dataOffset - (int)br.BaseStream.Position));
                }
            }
        }
Пример #2
0
        public BinaryReaderX createCfg(int part)
        {
            long bk;

            BinaryWriterX br = new BinaryWriterX(new MemoryStream());

            br.WriteStruct <Header>(headerList[part]);

            for (int j = 0; j < editorEntries[part].Count; j++)
            {
                if (j > 0)
                {
                    EditorStruct bk2 = editorEntries[part][j];

                    var success1 = (headerList[part].dataOffset > br.BaseStream.Length) ? bk2.entryOffset = 0 : bk2.entryOffset = (uint)br.BaseStream.Length - headerList[part].dataOffset;

                    bk = br.BaseStream.Position;
                    var success2 = (headerList[part].dataOffset > br.BaseStream.Length) ? br.BaseStream.Position = headerList[part].dataOffset : br.BaseStream.Position = br.BaseStream.Length;
                    br.Write(Encoding.GetEncoding("shift-jis").GetBytes(Labels[labelCount++].Text));
                    br.Write((byte)0x00);
                    br.BaseStream.Position = bk;

                    editorEntries[part][j] = bk2;
                }

                br.WriteStruct <EditorStruct>(editorEntries[part][j]);
            }

            if (editorRest[part] != null)
            {
                br.Write(editorRest[part]);
            }
            else
            {
                for (int j = 0; j < textEntries[part].Count; j++)
                {
                    if (j > 0 && textEntries[part][j].entryOffset != 0xFFFFFFFF)
                    {
                        TextStruct bk2 = textEntries[part][j];

                        var success1 = (headerList[part].dataOffset > br.BaseStream.Length) ? bk2.entryOffset = 0 : bk2.entryOffset = (uint)br.BaseStream.Length - headerList[part].dataOffset;

                        bk = br.BaseStream.Position;
                        var success2 = (headerList[part].dataOffset > br.BaseStream.Length) ? br.BaseStream.Position = headerList[part].dataOffset : br.BaseStream.Position = br.BaseStream.Length;
                        br.Write(Encoding.GetEncoding("shift-jis").GetBytes(Labels[labelCount++].Text));
                        br.Write((byte)0x00);
                        br.BaseStream.Position = bk;

                        textEntries[part][j] = bk2;
                    }

                    br.WriteStruct <TextStruct>(textEntries[part][j]);
                }
                if (textRest[part] != null)
                {
                    br.Write(textRest[part]);
                }
            }

            br.BaseStream.Position = 0x8;
            br.Write((int)(br.BaseStream.Length - headerList[part].dataOffset));

            br.BaseStream.Position = br.BaseStream.Length;
            while (br.BaseStream.Position % 16 != 0)
            {
                br.Write((byte)0xFF);
            }

            return(new BinaryReaderX(br.BaseStream));
        }
Пример #3
0
        public void Save(string filename)
        {
            long bk;

            using (var bw = new BinaryWriterX(File.Create(filename)))
            {
                bw.WriteStruct(cfgHeader);

                for (int j = 0; j < editorEntries.Count; j++)
                {
                    if (j > 0)
                    {
                        EditorStruct bk2 = editorEntries[j];

                        var success1 = (cfgHeader.dataOffset > bw.BaseStream.Length) ? bk2.entryOffset = 0 : bk2.entryOffset = (uint)bw.BaseStream.Length - cfgHeader.dataOffset;

                        bk = bw.BaseStream.Position;
                        var success2 = (cfgHeader.dataOffset > bw.BaseStream.Length) ? bw.BaseStream.Position = cfgHeader.dataOffset : bw.BaseStream.Position = bw.BaseStream.Length;
                        bw.Write(Encoding.GetEncoding("shift-jis").GetBytes(Labels[labelCount++].Text));
                        bw.Write((byte)0x00);
                        bw.BaseStream.Position = bk;

                        editorEntries[j] = bk2;
                    }

                    bw.WriteStruct <EditorStruct>(editorEntries[j]);
                }

                if (editorRest != null)
                {
                    bw.Write(editorRest);
                }
                else
                {
                    for (int j = 0; j < textEntries.Count; j++)
                    {
                        if (j > 0 && textEntries[j].entryOffset != 0xFFFFFFFF)
                        {
                            TextStruct bk2 = textEntries[j];

                            var success1 = (cfgHeader.dataOffset > bw.BaseStream.Length) ? bk2.entryOffset = 0 : bk2.entryOffset = (uint)bw.BaseStream.Length - cfgHeader.dataOffset;

                            bk = bw.BaseStream.Position;
                            var success2 = (cfgHeader.dataOffset > bw.BaseStream.Length) ? bw.BaseStream.Position = cfgHeader.dataOffset : bw.BaseStream.Position = bw.BaseStream.Length;
                            bw.Write(Encoding.GetEncoding("shift-jis").GetBytes(Labels[labelCount++].Text));
                            bw.Write((byte)0x00);
                            bw.BaseStream.Position = bk;

                            textEntries[j] = bk2;
                        }

                        bw.WriteStruct(textEntries[j]);
                    }
                    if (textRest != null)
                    {
                        bw.Write(textRest);
                    }
                }

                bw.BaseStream.Position = 0x8;
                bw.Write((int)(bw.BaseStream.Length - cfgHeader.dataOffset));

                bw.BaseStream.Position = bw.BaseStream.Length;
                bw.WriteAlignment(0x10, 0xff);
            }
        }