Example #1
0
        private byte[] GetOld()
        {
            using (MemoryStream MS = new MemoryStream())
            {
                BinaryWriter writer = IOTools.OpenWriteFile(MS, IsLittleEndian);

                foreach (var a in SubFiles)
                {
                    byte[] name = new byte[0x100 - 4];
                    Encoding.ASCII.GetBytes(a.Name, 0, a.Name.Length, name, 0);
                    writer.Write(name);
                    byte[] data = a.GameData.GetData();
                    int    size = a.GameData.GetSize();
                    if (data.Length != size)
                    {
                    }
                    writer.Write(size);
                    writer.Write(data);
                    writer.Write(new byte[IOTools.Alignment(MS.Position, 0x40)]);
                }

                writer.Write(new byte[0x100]);

                return(MS.ToArray());
            }
        }
Example #2
0
        public int GetSize()
        {
            int returned = 0x10;

            returned += Entries.Count * 4;
            returned += IOTools.Alignment(returned, 0x10);

            int entryoffset = 0;

            if (type == 0)
            {
                entryoffset = 0x10;
            }
            else if (type == 1)
            {
                entryoffset = 4;
            }

            foreach (var a in Entries)
            {
                returned += entryoffset;
                returned += a.Sum(x => x.Length);
                returned += IOTools.Alignment(returned, 0x10);
            }

            return(returned);
        }
Example #3
0
        public byte[] GetData()
        {
            byte[] returned;

            using (MemoryStream MS = new MemoryStream())
                using (BinaryWriter writer = IOTools.OpenWriteFile(MS, IsLittleEndian))
                {
                    writer.Write(HeaderNumber);
                    writer.Write(MagicNumber);
                    writer.Write(GetSize());
                    writer.Write((uint)((type << 16) + Entries.Count));
                    writer.BaseStream.Position += Entries.Count * 4;
                    writer.BaseStream.Position += IOTools.Alignment(writer.BaseStream.Position, 0x10);

                    if (type == 0)
                    {
                        GetT0(writer);
                    }
                    else if (type == 1)
                    {
                        GetT1(writer);
                    }

                    returned = MS.ToArray();
                }

            return(returned);
        }
Example #4
0
        public int GetSize()
        {
            int returned = 0;

            if (Old)
            {
                foreach (var a in SubFiles)
                {
                    returned += 0x100;
                    returned += a.GameData.GetSize();
                    returned += IOTools.Alignment(returned, 0x40);
                }

                returned += 0x100;
            }
            else
            {
                returned += 4;
                foreach (var a in SubFiles)
                {
                    returned += 0x20 + 4;
                    int size  = a.GameData.GetSize();
                    int align = IOTools.Alignment(size, 0x20);
                    returned += size + align;
                }
            }

            return(returned);
        }
Example #5
0
        private void WriteUnnamed(Dictionary <int, byte[][]> data)
        {
            var unnamedFiles = SubFiles.FindAll(x => !MainFileList.Contains((int)(x.Tag as object[])[0]));

            foreach (var a in unnamedFiles)
            {
                byte[][] type = new byte[1][];
                var      temp = a.GameData.GetData();

                int    align    = IOTools.Alignment(temp.Length, 16);
                byte[] tempType = null;
                if (align == 0)
                {
                    tempType = temp;
                }
                else
                {
                    tempType = new byte[temp.Length + align];
                    Buffer.BlockCopy(temp, 0, tempType, 0, temp.Length);
                }

                type[0] = tempType;
                data.Add((int)(a.Tag as object[])[0], type);
            }
        }
Example #6
0
        private void Read(StreamPart streamFile, string name)
        {
            GetType(streamFile);

            int index = 0;

            streamFile.Stream.Position = streamFile.Position;
            using (BinaryReader reader = IOTools.OpenReadFile(streamFile.Stream, IsLittleEndian))
                do
                {
                    int Size = reader.ReadInt32();

                    if (streamFile.Position + streamFile.Size < Size + streamFile.Stream.Position)
                    {
                        throw new Exception("TBL error");
                    }

                    byte[]     tempdata = reader.ReadBytes(Size);
                    FormatEnum fileType = GameFormatHelper.GetFormat(tempdata);
                    string     ext      = Path.GetExtension(name);
                    string     tempName = name.Substring(0, name.Length - ext.Length) + "(" + index++.ToString().PadLeft(2, '0') + ")";
                    if (fileType == FormatEnum.Unknown)
                    {
                        tempName += ".DAT";
                    }
                    else
                    {
                        tempName += "." + fileType.ToString();
                    }

                    SubFiles.Add(GameFormatHelper.OpenFile(tempName, tempdata, fileType == FormatEnum.Unknown ? FormatEnum.DAT : fileType));
                    reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position - streamFile.Position, 16);
                } while (streamFile.Stream.Position < streamFile.Position + streamFile.Size);
        }
Example #7
0
        public byte[] GetData()
        {
            using (MemoryStream MS = new MemoryStream())
                using (BinaryWriter writer = IOTools.OpenWriteFile(MS, IsLittleEndian))
                {
                    writer.BaseStream.Position = (SubFiles.Count + 1) * 12;

                    List <int[]> Entry = new List <int[]>();

                    for (int i = 0; i < SubFiles.Count; i++)
                    {
                        Entry.Add(new int[] { FlagList[i], (int)writer.BaseStream.Position, SubFiles[i].GameData.GetSize() });

                        writer.Write(SubFiles[i].GameData.GetData());
                        writer.Write(new byte[IOTools.Alignment(writer.BaseStream.Position, 16)]);
                    }

                    writer.BaseStream.Position = 0;

                    foreach (var a in Entry)
                    {
                        writer.WriteInt32Array(a);
                    }

                    return(MS.ToArray());
                }
        }
Example #8
0
        private void CreateCache(string path)
        {
            using (BinaryWriter writer = new BinaryWriter(File.Create(path)))
            {
                writer.Write(Width);
                writer.Write(Height);
                writer.Write(Palette.Length);
                writer.Write(DataList.Count);
                writer.Write(CutList.Count);

                writer.BaseStream.Position += IOTools.Alignment(writer.BaseStream.Position, 0x10);
                foreach (var a in Palette)
                {
                    writer.Write(a.R);
                    writer.Write(a.G);
                    writer.Write(a.B);
                    writer.Write(a.A);
                }

                writer.BaseStream.Position += IOTools.Alignment(writer.BaseStream.Position, 0x10);
                foreach (var a in DataList)
                {
                    writer.Write(a.Value);
                }

                writer.BaseStream.Position += IOTools.Alignment(writer.BaseStream.Position, 0x10);
                foreach (var a in CutList)
                {
                    writer.Write(a.Value.Left);
                    writer.Write(a.Value.Right);
                }

                writer.BaseStream.Position += IOTools.Alignment(writer.BaseStream.Position, 0x10);
            }
        }
Example #9
0
        private void OpenPTP0(BinaryReader reader)
        {
            reader.ReadInt32();
            int MSGPos     = reader.ReadInt32();
            int MSGCount   = reader.ReadInt32();
            int NamesPos   = reader.ReadInt32();
            int NamesCount = reader.ReadInt32();

            reader.BaseStream.Position = NamesPos;
            for (int i = 0; i < NamesCount; i++)
            {
                int    size    = reader.ReadInt32();
                byte[] OldName = reader.ReadBytes(size);
                reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position, 4);

                size = reader.ReadInt32();
                string NewName = Encoding.UTF8.GetString(reader.ReadBytes(size));
                reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position, 4);

                Names.Add(new PTPName(i, OldName, NewName));
            }

            reader.BaseStream.Position = MSGPos;
            for (int i = 0; i < MSGCount; i++)
            {
                int    type           = reader.ReadInt32();
                byte[] buffer         = reader.ReadBytes(24);
                string Name           = Encoding.ASCII.GetString(buffer.Where(x => x != 0).ToArray());
                int    StringCount    = reader.ReadInt16();
                int    CharacterIndex = reader.ReadInt16();
                PTPMSG mSG            = new PTPMSG(i, type, Name, CharacterIndex);

                for (int k = 0; k < StringCount; k++)
                {
                    int    size   = reader.ReadInt32();
                    byte[] Prefix = reader.ReadBytes(size);
                    reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position, 4);

                    size = reader.ReadInt32();
                    byte[] OldString = reader.ReadBytes(size);
                    reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position, 4);

                    size = reader.ReadInt32();
                    byte[] Postfix = reader.ReadBytes(size);
                    reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position, 4);

                    size = reader.ReadInt32();
                    string NewString = Encoding.UTF8.GetString(reader.ReadBytes(size));
                    reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position, 16);

                    mSG.Strings.Add(new PTPMSGstr(k, NewString, Prefix, OldString, Postfix)
                    {
                        CharacterIndex = CharacterIndex
                    });
                }

                Msg.Add(mSG);
            }
        }
Example #10
0
        public void Write(BinaryWriter writer, int offset, List <int> pointers)
        {
            int size = 28;

            writer.WriteString(Name, Encoding.ASCII, 24);

            if (Type == 0)
            {
                writer.Write((ushort)MsgStrings.Length);

                if (NameIndex == -1)
                {
                    writer.Write((ushort)0xFFFF);
                }
                else
                {
                    writer.Write((ushort)NameIndex);
                }
            }
            else if (Type == 1)
            {
                writer.Write((ushort)0);
                writer.Write((ushort)MsgStrings.Length);
                writer.Write(SEL_UNKNOWN);

                size += 4;
            }
            else
            {
                throw new Exception("BMD Write Error: Unknown type");
            }

            if (MsgStrings.Length > 0)
            {
                size += 4 + 4 * MsgStrings.Length;

                int sum = 0;
                foreach (var a in MsgStrings)
                {
                    pointers.Add((int)writer.BaseStream.Position);
                    writer.Write(offset + size + sum);
                    sum += a.Length;
                }

                writer.Write(sum);

                foreach (var a in MsgStrings)
                {
                    writer.Write(a);
                }

                writer.Write(new byte[IOTools.Alignment(size + sum, 4)]);
            }
        }
Example #11
0
        public int Get(BinaryWriter writer)
        {
            writer.Write(new byte[IOTools.Alignment(writer.BaseStream.Length, 16)]);
            long returned = writer.BaseStream.Position;

            foreach (var a in List)
            {
                writer.Write(a);
            }

            return(Convert.ToInt32(returned));
        }
Example #12
0
        private void UpdateOffsets(List <int> list, int start)
        {
            list[0] = start;

            for (int i = 1; i < SubFiles.Count; i++)
            {
                start += SubFiles[i - 1].GameData.GetSize();
                int temp = IOTools.Alignment(start, 16);
                start  += temp == 0 ? 16 : temp;
                list[i] = start;
            }
        }
Example #13
0
 public byte[] GetData()
 {
     using (MemoryStream MS = new MemoryStream())
         using (BinaryWriter writer = IOTools.OpenWriteFile(MS, IsLittleEndian))
         {
             foreach (var element in SubFiles)
             {
                 writer.Write(element.GameData.GetSize());
                 writer.Write(element.GameData.GetData());
                 writer.Write(new byte[IOTools.Alignment(writer.BaseStream.Position, 16)]);
             }
             return(MS.ToArray());
         }
 }
Example #14
0
        public int GetSize()
        {
            int returned = 28;

            if (Type == 1)
            {
                returned += 4;
            }
            if (MsgStrings.Length > 0)
            {
                returned += 4 + 4 * MsgStrings.Length;
            }
            returned += MsgStrings.Sum(x => x.Length);
            returned += IOTools.Alignment(returned, 4);
            return(returned);
        }
Example #15
0
        public byte[] GetData()
        {
            byte[] returned;

            using (MemoryStream MS = new MemoryStream())
            {
                BinaryWriter writer = IOTools.OpenWriteFile(MS, IsLittleEndian);

                Header.Get(writer);
                foreach (var a in TextureOffsetList)
                {
                    writer.Write((int)0);
                    writer.Write(a);
                }
                foreach (var a in KeyOffsetList)
                {
                    writer.Write((int)0);
                    writer.Write(a);
                }
                KeyList.Get(writer);

                int temp = IOTools.Alignment(writer.BaseStream.Position, 16);
                writer.Write(new byte[temp == 0 ? 16 : temp]);

                UpdateOffsets(TextureOffsetList, (int)writer.BaseStream.Position);

                writer.Write(SubFiles[0].GameData.GetData());
                for (int i = 1; i < SubFiles.Count; i++)
                {
                    int temp2 = IOTools.Alignment(writer.BaseStream.Length, 16);
                    writer.Write(new byte[temp2 == 0 ? 16 : temp2]);
                    writer.Write(SubFiles[i].GameData.GetData());
                }

                writer.BaseStream.Position = Header.Size;
                foreach (var a in TextureOffsetList)
                {
                    writer.Write((int)0);
                    writer.Write(a);
                }

                returned = MS.ToArray();
            }

            return(returned);
        }
Example #16
0
        private void GetType(StreamPart streamFile)
        {
            try
            {
                streamFile.Stream.Position = streamFile.Position;
                using (BinaryReader reader = IOTools.OpenReadFile(streamFile.Stream, true))
                    do
                    {
                        int Size = reader.ReadInt32();

                        if (streamFile.Position + streamFile.Size < Size + streamFile.Stream.Position)
                        {
                            throw new Exception("TBL error");
                        }

                        reader.BaseStream.Position += Size;
                        reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position - streamFile.Position, 16);
                    } while (streamFile.Stream.Position < streamFile.Position + streamFile.Size);
                IsLittleEndian = true;
            }
            catch
            {
                try
                {
                    streamFile.Stream.Position = streamFile.Position;
                    using (BinaryReader reader = IOTools.OpenReadFile(streamFile.Stream, false))
                        do
                        {
                            int Size = reader.ReadInt32();

                            if (streamFile.Position + streamFile.Size < Size + streamFile.Stream.Position)
                            {
                                throw new Exception("TBL error");
                            }

                            reader.BaseStream.Position += Size;
                            reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position - streamFile.Position, 16);
                        } while (streamFile.Stream.Position < streamFile.Position + streamFile.Size);
                    IsLittleEndian = false;
                }
                catch
                {
                    throw new Exception("TBL error");
                }
            }
        }
Example #17
0
        private void GetT1(BinaryWriter writer)
        {
            List <int> newPos = new List <int>();

            foreach (var entry in Entries)
            {
                newPos.Add((int)writer.BaseStream.Position);
                writer.Write((byte)entry.Sum(x => x.Length));
                writer.Write((byte)entry.Length);
                writer.BaseStream.Position += 2;
                foreach (var part in entry)
                {
                    writer.Write(part);
                }
                writer.BaseStream.Position += IOTools.Alignment(writer.BaseStream.Position, 0x10);
            }

            writer.Write(new byte[IOTools.Alignment(writer.BaseStream.Position, 0x10)]);
            writer.BaseStream.Position = 0x10;
            newPos.ForEach(x => writer.Write(x));
        }
Example #18
0
        private byte[] GetNew()
        {
            using (MemoryStream MS = new MemoryStream())
            {
                BinaryWriter writer = IOTools.OpenWriteFile(MS, IsLittleEndian);

                writer.Write((int)SubFiles.Count);
                foreach (var a in SubFiles)
                {
                    writer.Write(Encoding.ASCII.GetBytes(a.Name));
                    writer.Write(new byte[IOTools.Alignment(a.Name.Length, 0x20)]);
                    int size  = a.GameData.GetSize();
                    int align = IOTools.Alignment(size, 0x20);
                    writer.Write(size + align);
                    writer.Write(a.GameData.GetData());
                    writer.Write(new byte[align]);
                }

                return(MS.ToArray());
            }
        }
Example #19
0
        private void OpenCache(string path)
        {
            using (BinaryReader reader = new BinaryReader(File.OpenRead(path)))
            {
                Width  = reader.ReadInt32();
                Height = reader.ReadInt32();
                int colorcount = reader.ReadInt32();
                int datacount  = reader.ReadInt32();
                int cutcount   = reader.ReadInt32();

                if (colorcount == 16)
                {
                    PixelFormat = PixelFormats.Indexed4;
                }
                else if (colorcount == 256)
                {
                    PixelFormat = PixelFormats.Indexed8;
                }
                else
                {
                }

                reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position, 0x10);
                Palette = ReadPalette(reader, colorcount).ToArray();

                int glyphsize = (PixelFormat.BitsPerPixel * Width * Height) / 8;
                reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position, 0x10);
                for (int i = 32; i < 32 + datacount; i++)
                {
                    DataList.Add(i, reader.ReadBytes(glyphsize));
                }

                reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position, 0x10);
                for (int i = 32; i < 32 + cutcount; i++)
                {
                    CutList.Add(i, new VerticalCut(reader.ReadBytes(2)));
                }
            }
        }
Example #20
0
        public int GetSize()
        {
            int returned = 0;

            returned += Header.Size;
            returned += TextureOffsetList.Count * 8;
            returned += KeyOffsetList.Count * 8;
            returned += KeyList.Size;

            int temp = IOTools.Alignment(returned, 16);

            returned += temp == 0 ? 16 : temp;

            returned += (SubFiles[0].GameData as IGameData).GetSize();
            for (int i = 1; i < SubFiles.Count; i++)
            {
                temp      = IOTools.Alignment(returned, 16);
                returned += temp == 0 ? 16 : temp;
                returned += SubFiles[i].GameData.GetSize();
            }

            return(returned);
        }
Example #21
0
        private void OpenOld(byte[] data)
        {
            IsLittleEndian = true;
            if (data.Length < 0x100)
            {
                throw new System.Exception("BIN: data length unacceptable");
            }
            using (BinaryReader reader = IOTools.OpenReadFile(new MemoryStream(data), IsLittleEndian, false))
                while (reader.BaseStream.Position < reader.BaseStream.Length - 0x100)
                {
                    string Name = Encoding.ASCII.GetString(reader.ReadBytes(0x100 - 4)).Trim('\0');
                    int    Size = reader.ReadInt32();
                    byte[] Data = reader.ReadBytes(Size);
                    reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position, 0x40);

                    GameFile objectFile = GameFormatHelper.OpenFile(Name, Data, GameFormatHelper.GetFormat(Name));
                    if (objectFile == null)
                    {
                        objectFile = GameFormatHelper.OpenFile(Name, Data, FormatEnum.DAT);
                    }
                    SubFiles.Add(objectFile);
                }
        }
Example #22
0
        private bool Open(Stream stream)
        {
            try
            {
                BinaryReader reader = new BinaryReader(stream);
                stream.Position = 0;
                if (Encoding.ASCII.GetString(reader.ReadBytes(4)) == "PTP0")
                {
                    Names.Clear();
                    Msg.Clear();

                    int MSGPos     = reader.ReadInt32();
                    int MSGCount   = reader.ReadInt32();
                    int NamesPos   = reader.ReadInt32();
                    int NamesCount = reader.ReadInt32();

                    stream.Position = NamesPos;
                    for (int i = 0; i < NamesCount; i++)
                    {
                        int    size    = reader.ReadInt32();
                        byte[] OldName = reader.ReadBytes(size);
                        stream.Position += IOTools.Alignment(stream.Position, 4);

                        size = reader.ReadInt32();
                        string NewName = Encoding.UTF8.GetString(reader.ReadBytes(size));
                        stream.Position += IOTools.Alignment(stream.Position, 4);

                        Names.Add(new PTPName(i, OldName, NewName));
                    }

                    stream.Position = MSGPos;
                    for (int i = 0; i < MSGCount; i++)
                    {
                        int    type           = reader.ReadInt32();
                        byte[] buffer         = reader.ReadBytes(24);
                        string Name           = Encoding.ASCII.GetString(buffer.Where(x => x != 0).ToArray());
                        int    StringCount    = reader.ReadInt16();
                        int    CharacterIndex = reader.ReadInt16();
                        PTPMSG mSG            = new PTPMSG(i, type, Name, CharacterIndex);

                        for (int k = 0; k < StringCount; k++)
                        {
                            int    size   = reader.ReadInt32();
                            byte[] Prefix = reader.ReadBytes(size);
                            stream.Position += IOTools.Alignment(stream.Position, 4);

                            size = reader.ReadInt32();
                            byte[] OldString = reader.ReadBytes(size);
                            stream.Position += IOTools.Alignment(stream.Position, 4);

                            size = reader.ReadInt32();
                            byte[] Postfix = reader.ReadBytes(size);
                            stream.Position += IOTools.Alignment(stream.Position, 4);

                            size = reader.ReadInt32();
                            string NewString = Encoding.UTF8.GetString(reader.ReadBytes(size));
                            stream.Position += IOTools.Alignment(stream.Position, 16);

                            mSG.Strings.Add(new PTPMSGstr(k, NewString, Prefix, OldString, Postfix)
                            {
                                CharacterIndex = CharacterIndex
                            });
                        }

                        Msg.Add(mSG);
                    }

                    return(true);
                }

                return(false);
            }
            catch (Exception e)
            {
                Names.Clear();
                Msg.Clear();
                //  Logging.Write("PTPfactory", e.ToString());
                return(false);
            }
        }
Example #23
0
        private void WriteNamed(Dictionary <int, byte[][]> data)
        {
            void WriteSingleFile(TypeMap typeMap)
            {
                var TYPE = SubFiles.Find(x => (int)(x.Tag as object[])[0] == (int)typeMap);

                if (TYPE != null)
                {
                    byte[][] type = new byte[1][];
                    var      temp = TYPE.GameData.GetData();

                    int    align    = IOTools.Alignment(temp.Length, 16);
                    byte[] tempType = null;
                    if (align == 0)
                    {
                        tempType = temp;
                    }
                    else
                    {
                        tempType = new byte[temp.Length + align];
                        Buffer.BlockCopy(temp, 0, tempType, 0, temp.Length);
                    }

                    type[0] = tempType;
                    data.Add((int)typeMap, type);
                }
            }

            // Write T3
            WriteSingleFile(TypeMap.T3);

            // Write RMD
            var RMD = SubFiles.FindAll(x => (int)(x.Tag as object[])[0] == (int)TypeMap.RMD);

            if (RMD.Count != 0)
            {
                byte[][] rmdHeader = new byte[RMD.Count][];
                byte[][] rmd       = new byte[1][];

                int offset = 0;

                using (MemoryStream MS = new MemoryStream())
                {
                    for (int i = 0; i < RMD.Count; i++)
                    {
                        byte[] temp    = RMD[i].GameData.GetData();
                        byte[] tempRMD = new byte[temp.Length + IOTools.Alignment(temp.Length, 16)];
                        Buffer.BlockCopy(temp, 0, tempRMD, 0, temp.Length);
                        MS.Write(tempRMD, 0, tempRMD.Length);

                        var tempHeader = (RMD[i].Tag as object[])[1] as int[];
                        tempHeader[4] = offset;
                        tempHeader[5] = temp.Length;

                        using (MemoryStream headerMS = new MemoryStream())
                            using (BinaryWriter writer = IOTools.OpenWriteFile(headerMS, IsLittleEndian))
                            {
                                writer.WriteInt32Array(tempHeader);
                                rmdHeader[i] = headerMS.ToArray();
                            }

                        offset += tempRMD.Length;
                    }

                    rmd[0] = MS.ToArray();
                }

                data.Add((int)TypeMap.RMD, rmd);
                data.Add((int)TypeMap.RMDHead, rmdHeader);
            }

            // Write BMD
            WriteSingleFile(TypeMap.BMD);

            // Write EPL
            var EPL = SubFiles.FindAll(x => (int)(x.Tag as object[])[0] == (int)TypeMap.EPL);

            if (EPL.Count != 0)
            {
                byte[][] eplHeader = new byte[EPL.Count][];
                byte[][] epl       = new byte[1][];

                int offset = 0;

                using (MemoryStream MS = new MemoryStream())
                {
                    for (int i = 0; i < EPL.Count; i++)
                    {
                        byte[] temp    = EPL[i].GameData.GetData();
                        byte[] tempEPL = new byte[temp.Length + IOTools.Alignment(temp.Length, 16)];
                        Buffer.BlockCopy(temp, 0, tempEPL, 0, temp.Length);
                        MS.Write(tempEPL, 0, tempEPL.Length);

                        var tempHeader = (EPL[i].Tag as object[])[1] as int[];
                        tempHeader[1] = offset;

                        using (MemoryStream headerMS = new MemoryStream())
                            using (BinaryWriter writer = IOTools.OpenWriteFile(headerMS, IsLittleEndian))
                            {
                                writer.WriteInt32Array(tempHeader);
                                eplHeader[i] = headerMS.ToArray();
                            }

                        offset += tempEPL.Length;
                    }

                    epl[0] = MS.ToArray();
                }

                data.Add((int)TypeMap.EPL, epl);
                data.Add((int)TypeMap.EPLHead, eplHeader);
            }

            // Write TMX
            var TMX = SubFiles.FindAll(x => (int)(x.Tag as object[])[0] == (int)TypeMap.TMX);

            if (TMX.Count != 0)
            {
                byte[][] tmxHeader = new byte[TMX.Count][];
                byte[][] tmx       = new byte[1][];

                int offset = 0;

                using (MemoryStream MS = new MemoryStream())
                {
                    for (int i = 0; i < TMX.Count; i++)
                    {
                        byte[] temp    = TMX[i].GameData.GetData();
                        byte[] tempTMX = new byte[temp.Length + IOTools.Alignment(temp.Length, 16)];
                        Buffer.BlockCopy(temp, 0, tempTMX, 0, temp.Length);
                        MS.Write(tempTMX, 0, tempTMX.Length);

                        var tempHeader = (TMX[i].Tag as object[])[1] as int[];
                        tempHeader[1] = offset;

                        using (MemoryStream headerMS = new MemoryStream())
                            using (BinaryWriter writer = IOTools.OpenWriteFile(headerMS, IsLittleEndian))
                            {
                                writer.WriteInt32Array(tempHeader);
                                tmxHeader[i] = headerMS.ToArray();
                            }

                        offset += tempTMX.Length;
                    }

                    tmx[0] = MS.ToArray();
                }

                data.Add((int)TypeMap.TMX, tmx);
                data.Add((int)TypeMap.TMXHead, tmxHeader);
            }

            // Write CTable
            WriteSingleFile(TypeMap.CTable);
        }
Example #24
0
        public byte[] GetData()
        {
            using (MemoryStream MS = new MemoryStream())
            {
                using (BinaryWriter writer = new BinaryWriter(MS))
                {
                    byte[] buffer;
                    writer.Write(Encoding.ASCII.GetBytes("PTP0"));
                    long MSGLinkPos = MS.Position;
                    writer.Write(0);
                    writer.Write(Msg.Count);
                    long NamesLinkPos = MS.Position;
                    writer.Write(0);
                    writer.Write(Names.Count);
                    writer.Write(new byte[IOTools.Alignment(MS.Position, 0x10)]);

                    long MSGPos = MS.Position;
                    foreach (var a in Msg)
                    {
                        writer.Write(a.Type);
                        buffer = new byte[24];
                        Encoding.ASCII.GetBytes(a.Name, 0, a.Name.Length, buffer, 0);
                        writer.Write(buffer);
                        writer.Write((ushort)a.Strings.Count);
                        writer.Write((ushort)a.CharacterIndex);

                        foreach (var b in a.Strings)
                        {
                            buffer = b.Prefix.GetByteArray();
                            writer.Write(buffer.Length);
                            writer.Write(buffer);
                            writer.Write(new byte[IOTools.Alignment(MS.Position, 4)]);

                            buffer = b.OldString.GetByteArray();
                            writer.Write(buffer.Length);
                            writer.Write(buffer);
                            writer.Write(new byte[IOTools.Alignment(MS.Position, 4)]);

                            buffer = b.Postfix.GetByteArray();
                            writer.Write(buffer.Length);
                            writer.Write(buffer);
                            writer.Write(new byte[IOTools.Alignment(MS.Position, 4)]);

                            buffer = Encoding.UTF8.GetBytes(b.NewString);
                            writer.Write(buffer.Length);
                            writer.Write(buffer);
                            writer.Write(new byte[IOTools.Alignment(MS.Position, 16)]);
                        }

                        writer.Write(new byte[IOTools.Alignment(MS.Position, 0x10)]);
                    }

                    long NamesPos = MS.Position;
                    foreach (var a in Names)
                    {
                        buffer = a.OldName;
                        writer.Write(buffer.Length);
                        writer.Write(buffer);
                        writer.Write(new byte[IOTools.Alignment(MS.Position, 4)]);

                        buffer = Encoding.UTF8.GetBytes(a.NewName);
                        writer.Write(buffer.Length);
                        writer.Write(buffer);
                        writer.Write(new byte[IOTools.Alignment(MS.Position, 4)]);
                    }

                    MS.Position = MSGLinkPos;
                    writer.Write((int)MSGPos);
                    MS.Position = NamesLinkPos;
                    writer.Write((int)NamesPos);
                }
                return(MS.ToArray());
            }
        }
Example #25
0
        public byte[] GetData()
        {
            using (MemoryStream MS = new MemoryStream())
                using (BinaryWriter writer = IOTools.OpenWriteFile(MS, IsLittleEndian))
                {
                    byte[] buffer;

                    List <int> LastBlock = new List <int>();

                    #region Header

                    buffer = new byte[4] {
                        7, 0, 0, 0
                    };
                    writer.Write(buffer);
                    writer.Write((int)0x0);
                    buffer = Encoding.ASCII.GetBytes("MSG1");
                    writer.Write(BitConverter.ToInt32(buffer, 0));
                    writer.Write((int)0x0);
                    writer.Write((int)0x0);
                    writer.Write((int)0x0);
                    writer.Write(Msg.Count);
                    writer.Write((ushort)0);
                    writer.Write((ushort)0x2);

                    #endregion

                    #region MSG Pointer

                    int MSG_offset = Msg.Count * 8 + 16;

                    foreach (var MSG in Msg)
                    {
                        writer.Write(MSG.Type);
                        LastBlock.Add((int)MS.Position);
                        writer.Write(MSG_offset);
                        MSG_offset += MSG.GetSize();
                    }
                    LastBlock.Add((int)MS.Position);
                    writer.Write(MSG_offset);
                    writer.Write(Name.Count);
                    writer.Write((int)0x0);
                    writer.Write((int)0x0);

                    #endregion

                    #region MSG

                    MSG_offset = Msg.Count * 8 + 16;

                    foreach (var MSG in Msg)
                    {
                        MSG.Write(writer, MSG_offset, LastBlock);
                        MSG_offset += MSG.GetSize();
                    }

                    #endregion

                    #region Name Pointer

                    MSG_offset += Name.Count * 4;

                    foreach (var name in Name)
                    {
                        LastBlock.Add((int)MS.Position);
                        writer.Write(MSG_offset);
                        if (name.NameBytes.Length == 0)
                        {
                            MSG_offset += 2;
                        }
                        else
                        {
                            MSG_offset += name.NameBytes.Length + 1;
                        }
                    }

                    #endregion

                    #region Name

                    foreach (var name in Name)
                    {
                        if (name.NameBytes.Length == 0)
                        {
                            writer.Write((byte)0x20);
                        }
                        else
                        {
                            writer.Write(name.NameBytes);
                        }
                        writer.Write((byte)0);
                    }
                    writer.Write(new byte[IOTools.Alignment(MS.Position, 4)]);

                    #endregion

                    #region Pointers

                    int    LastBlockPos   = (int)MS.Position;
                    byte[] ptrDiffSection = CreatePointersDiffSection(LastBlock);
                    writer.Write(ptrDiffSection);

                    MS.Position = 0x10;
                    writer.Write(LastBlockPos);
                    writer.Write(ptrDiffSection.Length);

                    MS.Position = 0x4;
                    writer.Write((int)MS.Length);

                    #endregion



                    return(MS.ToArray());
                }
        }