예제 #1
0
        public unsafe void Read(byte[] data, bool shiftX)
        {
            Value Val = 0;

            Offsets = KKdList <long> .New;
            fixed(byte *ptr = data)
            {
                int  i = 0, offset = 0, v = 0;
                byte bitShift = (byte)(shiftX ? 3 : 2);

                int   length   = *(int *)ptr - 4;
                byte *localPtr = ptr + 4;

                while (length > i)
                {
                    v   = *ptr & 0x3F;
                    Val = (Value)(*ptr & 0xC0);
                    localPtr++; i++;
                    if (Val == Value.Int32)
                    {
                        v = (v << 24) | (ptr[0] << 16) | (ptr[1] << 8) | ptr[2]; localPtr += 3; i += 3;
                    }
                    else if (Val == Value.Int16)
                    {
                        v = (v << 8) | ptr[0];                                 localPtr += 1; i += 3;
                    }
                    else if (Val == Value.Invalid)
                    {
                        break;
                    }
                    offset += v;
                    Offsets.Add(offset << bitShift);
                }
            }
        }
예제 #2
0
        public unsafe void Read(byte[] data, bool shiftX)
        {
            Offsets = KKdList <long> .New;
            fixed(byte *ptr = data)
            {
                long offset = 0;
                int  i = 0, j = 0, v = 0;
                byte bitShift = (byte)(shiftX ? 3 : 2);

                int   length = *(int *)ptr - 4;
                byte *l      = ptr + 4;

                Offsets.Capacity = length;
                while (length > i)
                {
                    if (ReadPOFValue(ref l, out v))
                    {
                        break;
                    }
                    j++;
                    offset += v;
                    Offsets.Add(offset << bitShift);
                }
                Offsets.Capacity = j;
            }
        }
예제 #3
0
        public unsafe static POF Read(byte[] data, bool shiftX)
        {
            Value          Val = 0;
            KKdList <long> offsets = KKdList <long> .New;
            byte *         ptr = data.GetPtr();
            int            i = 0, offset = 0, v = 0;
            byte           bitShift = (byte)(shiftX ? 3 : 2);

            int length = *(int *)ptr - 4; ptr += 4;

            while (length > i)
            {
                v   = *ptr & 0x3F;
                Val = (Value)(*ptr & 0xC0);
                ptr++; i++;
                if (Val == Value.Int32)
                {
                    v = (v << 24) | (ptr[0] << 16) | (ptr[1] << 8) | ptr[2]; ptr += 3; i += 3;
                }
                else if (Val == Value.Int16)
                {
                    v = (v << 8) | ptr[0];                                 ptr += 1; i += 3;
                }
                else if (Val == Value.Invalid)
                {
                    break;
                }
                offset += v;
                offsets.Add(offset << bitShift);
            }
            return(new POF {
                Offsets = offsets
            });
        }
예제 #4
0
        public static byte[] NT(this Stream stream, byte end = 0)
        {
            KKdList <byte> s = KKdList <byte> .New;

            while (stream.PI64 < stream.LI64)
            {
                byte a = stream.RU8();
                if (a == end)
                {
                    break;
                }
                else
                {
                    s.Add(a);
                }
            }
            return(s.ToArray());
        }
예제 #5
0
        public static byte[] NullTerminated(this Stream stream, byte End = 0)
        {
            KKdList <byte> s = KKdList <byte> .New;

            while (stream.LongPosition < stream.LongLength)
            {
                byte a = stream.ReadByte();
                if (a == End)
                {
                    break;
                }
                else
                {
                    s.Add(a);
                }
            }
            return(s.ToArray());
        }
예제 #6
0
        public void STRWriter(string filepath)
        {
            if (STRs == null || STRs.Length == 0 || header.Format > Format.F2BE)
            {
                return;
            }
            uint offset        = 0;
            uint currentOffset = 0;

            _IO = File.OpenWriter(filepath + (header.Format > Format.AFT &&
                                              header.Format < Format.FT ? ".str" : ".bin"), true);
            _IO.Format  = header.Format;
            pof.Offsets = KKdList <long> .New;

            long count = STRs.LongLength;

            if (_IO.Format > Format.AFT && _IO.Format < Format.FT)
            {
                _IO.P = 0x40;
                _IO.WX(count, ref pof);
                _IO.WX(0x80);
                _IO.P = 0x80;
                for (int i = 0; i < count; i++)
                {
                    _IO.W(0x00L);
                }
                _IO.A(0x10);
            }
            else
            {
                for (int i = 0; i < count; i++)
                {
                    _IO.W(0x00);
                }
                _IO.A(0x20);
            }

            KKdList <string> usedSTR    = KKdList <string> .New;
            KKdList <int>    usedSTRPos = KKdList <int> .New;

            int[] STRPos = new int[count];

            usedSTRPos.Add(_IO.P);
            usedSTR.Add("");
            _IO.W(0);
            for (int i = 0; i < count; i++)
            {
                if (!usedSTR.Contains(STRs[i].Str.V))
                {
                    STRPos[i] = _IO.P;
                    usedSTRPos.Add(STRPos[i]);
                    usedSTR.Add(STRs[i].Str.V);
                    _IO.W(STRs[i].Str.V);
                    _IO.W(0);
                }
                else
                {
                    for (int i2 = 0; i2 < count; i2++)
                    {
                        if (usedSTR[i2] == STRs[i].Str.V)
                        {
                            STRPos[i] = usedSTRPos[i2]; break;
                        }
                    }
                }
            }

            if (_IO.Format > Format.AFT)
            {
                _IO.A(0x10);
                offset = _IO.U32P;
                _IO.P  = 0x80;
                for (int i = 0; i < count; i++)
                {
                    pof.Offsets.Add(_IO.P);
                    _IO.WE(STRPos[i]);
                    _IO.WE(STRs[i].ID);
                }

                _IO.U32P = offset;
                _IO.W(pof, false, 1);
                currentOffset = _IO.U32P;
                _IO.WEOFC();
                header.DataSize    = (int)(currentOffset - 0x40);
                header.Signature   = 0x41525453;
                header.SectionSize = (int)(offset - 0x40);
                _IO.P = 0;
                _IO.W(header, true);
            }
            else
            {
                _IO.P = 0;
                for (int i = 0; i < count; i++)
                {
                    _IO.W(STRPos[i]);
                }
            }
            _IO.C();
        }
예제 #7
0
        private static void FARCProcessor(KKdFARC farc, string choose, Format format, bool a3dcOpt)
        {
            if (!farc.HeaderReader() || !farc.HasFiles)
            {
                return;
            }

            KKdList <string> list = KKdList <string> .New;

            for (int i = 0; i < farc.Files.Count; i++)
            {
                string file = farc.Files[i].Name.ToLower();
                if (!file.Contains("_div_") && file.EndsWith(".a3da"))
                {
                    list.Add(file);
                }
            }

            KKdList <string> A3DAlist = KKdList <string> .New;

            for (int i = 0; i < farc.Files.Count; i++)
            {
                if (farc.Files[i].Name.ToLower().EndsWith(".a3da"))
                {
                    A3DAlist.Add(farc.Files[i].Name);
                }
            }

            byte[] data = null;
            if (list.Count == A3DAlist.Count)
            {
                KKdA3DA a3da;
                for (int i = 0; i < A3DAlist.Count; i++)
                {
                    using (a3da = new KKdA3DA(a3dcOpt))
                    {
                        data = farc.FileReader(A3DAlist[i]);
                        int state = a3da.A3DAReader(data);
                        if (state == 1)
                        {
                            KKdFARC.FARCFile file = farc.Files[i];
                            a3da.Head.Format = format;
                            file.Data        = (choose == "1" || choose == "4")
                                ? a3da.A3DAWriter() : a3da.A3DCWriter();
                            farc.Files[i] = file;
                        }
                    }
                }
                farc.Save();
                return;
            }

            KKdA3DA[] a3daArray;
            using (KKdList <KKdA3DA> a3daList = KKdList <KKdA3DA> .NewReserve(list.Count))
            {
                for (int i = 0; i < list.Count; i++)
                {
                    KKdA3DA a3da;
                    using (a3da = new KKdA3DA(a3dcOpt))
                    {
                        data = farc.FileReader(list[i]);
                        int state = a3da.A3DAReader(data);
                        if (state == 1)
                        {
                            a3daList.Add(a3da);
                        }
                    }
                }
                a3daArray = a3daList.ToArray();
            }

            for (int i = 0; i < list.Count; i++)
            {
                if (a3daArray[i].Data.PlayControl.Div == null)
                {
                    continue;
                }
                int     div      = a3daArray[i].Data.PlayControl.Div.Value;
                string  filename = Path.RemoveExtension(list[i]);
                string  ext      = Path.GetExtension(list[i]).ToLower();
                KKdA3DA a3da;
                for (int i1 = 1; i1 < div; i1++)
                {
                    using (a3da = new KKdA3DA(a3dcOpt))
                    {
                        string file = filename + "_div_" + i1 + ext;
                        data = farc.FileReader(file);
                        int state = a3da.A3DAReader(data);
                        if (state == 1)
                        {
                            a3daArray[i].A3DAMerger(ref a3da.Data);
                        }
                    }
                }
                a3daArray[i].Data.PlayControl.Div = null;
            }

            farc.Files.Capacity = 0;
            farc.Files.Capacity = list.Count;
            for (int i = 0; i < list.Count; i++)
            {
                KKdFARC.FARCFile file = default;
                file.Name = list[i];
                a3daArray[i].Head.Format = format;
                file.Data = (choose == "1" || choose == "4")
                    ? a3daArray[i].A3DAWriter() : a3daArray[i].A3DCWriter();
                farc.Files.Add(file);
            }
            farc.Save();
            return;
        }
예제 #8
0
        private static void FARCProcessor(KKdFARC farc, string choose, Format format)
        {
            if (!farc.HeaderReader())
            {
                return;
            }
            if (!farc.HasFiles)
            {
                return;
            }

            KKdList <string> list = KKdList <string> .New;

            for (int i = 0; i < farc.Files.Length; i++)
            {
                if (!farc.Files[i].Name.Contains("div") && farc.Files[i].Name.EndsWith(".a3da"))
                {
                    list.Add(farc.Files[i].Name);
                }
            }

            KKdList <string> A3DAlist = KKdList <string> .New;

            for (int i = 0; i < farc.Files.Length; i++)
            {
                if (farc.Files[i].Name.EndsWith(".a3da"))
                {
                    A3DAlist.Add(farc.Files[i].Name);
                }
            }

            byte[] data = null;
            if (list.Count == A3DAlist.Count || (format > Format.AFT && format < Format.FT))
            {
                KKdA3DA a3da;
                for (int i = 0; i < A3DAlist.Count; i++)
                {
                    using (a3da = new KKdA3DA(true))
                    {
                        data = farc.FileReader(A3DAlist[i]);
                        int state = a3da.A3DAReader(data);
                        if (state == 1)
                        {
                            a3da.Data._.CompressF16 = format > Format.AFT && format <
                                                      Format.FT ? format == Format.MGF ? 2 : 1 : 0;
                            a3da.Head.Format   = format;
                            farc.Files[i].Data = (choose != "1" && choose != "3") ? a3da.A3DCWriter() : a3da.A3DAWriter();
                        }
                    }
                }
                farc.Save();
                return;
            }

            KKdA3DA[] a3daArray;
            using (KKdList <KKdA3DA> a3daList = KKdList <KKdA3DA> .New)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    KKdA3DA a3da;
                    using (a3da = new KKdA3DA(true))
                    {
                        data = farc.FileReader(list[i]);
                        int state = a3da.A3DAReader(data);
                        if (state == 1)
                        {
                            a3daList.Add(a3da);
                        }
                    }
                }
                a3daArray = a3daList.ToArray();
            }

            for (int i = 0; i < list.Count; i++)
            {
                if (a3daArray[i].Data.PlayControl.Div == null)
                {
                    continue;
                }
                float   Div = a3daArray[i].Data.PlayControl.Div.Value;
                KKdA3DA a3da;
                for (int i1 = 1; i1 < Div; i1++)
                {
                    using (a3da = new KKdA3DA(true))
                    {
                        string file = Path.GetFileNameWithoutExtension(list[i]) +
                                      "_div_" + i1 + Path.GetExtension(list[i]);
                        data = farc.FileReader(file);
                        int state = a3da.A3DAReader(data);
                        if (state == 1)
                        {
                            a3daArray[i].A3DAMerger(ref a3da.Data);
                        }
                    }
                }
                a3daArray[i].Data.PlayControl.Div = null;
            }

            farc.Files = new KKdFARC.FARCFile[list.Count];
            for (int i = 0; i < list.Count; i++)
            {
                farc.Files[i].Name = list[i];
                a3daArray[i].Data._.CompressF16 = format > Format.AFT && format <
                                                  Format.FT ? format == Format.MGF ? 2 : 1 : 0;
                a3daArray[i].Head.Format = format;
                farc.Files[i].Data       = (choose != "1" && choose != "3") ? a3daArray[i].A3DCWriter() : a3daArray[i].A3DAWriter();
            }
            farc.Save();
            return;
        }
예제 #9
0
        public void STRWriter(string filepath)
        {
            if (STRs == null || STRs.Length == 0 || Header.Format > Main.Format.F2BE)
            {
                return;
            }
            uint Offset        = 0;
            uint CurrentOffset = 0;

            IO        = File.OpenWriter(filepath + (Header.Format > Main.Format.FT ? ".str" : ".bin"), true);
            IO.Format = Header.Format;
            POF       = new POF();
            IO.IsBE   = IO.Format == Main.Format.F2BE;

            long Count = STRs.LongLength;

            if (IO.Format > Main.Format.FT)
            {
                IO.Position = 0x40;
                IO.WriteX(Count);
                IO.GetOffset(ref POF);
                IO.WriteX(0x80);
                IO.Position = 0x80;
                for (int i = 0; i < Count; i++)
                {
                    IO.Write(0x00L);
                }
                IO.Align(0x10);
            }
            else
            {
                for (int i = 0; i < Count; i++)
                {
                    IO.Write(0x00);
                }
                IO.Align(0x20);
            }

            KKdList <string> UsedSTR    = KKdList <string> .New;
            KKdList <int>    UsedSTRPos = KKdList <int> .New;

            int[] STRPos = new int[Count];
            for (int i = 0; i < Count; i++)
            {
                if (!UsedSTR.Contains(STRs[i].Str.Value))
                {
                    STRPos[i] = IO.Position;
                    UsedSTRPos.Add(STRPos[i]);
                    UsedSTR.Add(STRs[i].Str.Value);
                    IO.Write(STRs[i].Str.Value + "\0");
                }
                else
                {
                    for (int i2 = 0; i2 < Count; i2++)
                    {
                        if (UsedSTR[i2] == STRs[i].Str.Value)
                        {
                            STRPos[i] = UsedSTRPos[i2]; break;
                        }
                    }
                }
            }

            if (IO.Format > Main.Format.FT)
            {
                IO.Align(0x10);
                Offset      = IO.UIntPosition;
                IO.Position = 0x80;
                for (int i = 0; i < Count; i++)
                {
                    IO.GetOffset(ref POF);
                    IO.WriteEndian(STRPos[i]);
                    IO.WriteEndian(STRs[i].ID);
                }

                IO.UIntPosition = Offset;
                IO.Write(ref POF, 1);
                CurrentOffset = IO.UIntPosition;
                IO.WriteEOFC(0);
                Header.DataSize    = (int)(CurrentOffset - 0x40);
                Header.Signature   = 0x41525453;
                Header.SectionSize = (int)(Offset - 0x40);
                IO.Position        = 0;
                IO.Write(Header);
            }
            else
            {
                IO.Position = 0;
                for (int i = 0; i < Count; i++)
                {
                    IO.Write(STRPos[i]);
                }
            }
            IO.Close();
        }
예제 #10
0
        public void STRWriter(string filepath)
        {
            uint   Offset        = 0;
            uint   CurrentOffset = 0;
            Stream writer        = File.OpenWriter(filepath + (Header.
                                                               Format > Main.Format.FT ? ".str" : ".bin"), true);

            writer.Format = Header.Format;
            POF           = new POF();
            writer.IsBE   = writer.Format == Main.Format.F2BE;

            long Count = STRs.LongLength;

            if (writer.Format > Main.Format.FT)
            {
                writer.Position = 0x40;
                writer.WriteEndian(Count);
                writer.GetOffset(ref POF).WriteEndian(0x80);
                writer.Position = 0x80;
                for (int i = 0; i < Count; i++)
                {
                    writer.GetOffset(ref POF).Write(0x00);
                    writer.WriteEndian(STRs[i].ID);
                }
                writer.Align(0x10);
            }
            else
            {
                for (int i = 0; i < Count; i++)
                {
                    writer.Write(0x00);
                }
                writer.Align(0x20);
            }

            KKdList <string> UsedSTR    = KKdList <string> .New;
            KKdList <int>    UsedSTRPos = KKdList <int> .New;

            int[] STRPos = new int[Count];
            for (int i1 = 0; i1 < Count; i1++)
            {
                if (UsedSTR.Contains(STRs[i1].Str))
                {
                    for (int i2 = 0; i2 < Count; i2++)
                    {
                        if (UsedSTR[i2] == STRs[i1].Str)
                        {
                            STRPos[i1] = UsedSTRPos[i2]; break;
                        }
                    }
                }
                else
                {
                    STRPos[i1] = writer.Position;
                    UsedSTRPos.Add(STRPos[i1]);
                    UsedSTR.Add(STRs[i1].Str);
                    writer.Write(STRs[i1].Str);
                    writer.WriteByte(0);
                }
            }
            if (writer.Format > Main.Format.FT)
            {
                writer.Align(0x10);
                Offset          = writer.UIntPosition;
                writer.Position = 0x80;
            }
            else
            {
                writer.Position = 0;
            }
            for (int i1 = 0; i1 < Count; i1++)
            {
                writer.WriteEndian(STRPos[i1]);
                if (writer.Format > Main.Format.FT)
                {
                    writer.Position += 4;
                }
            }

            if (writer.Format > Main.Format.FT)
            {
                writer.UIntPosition = Offset;
                writer.Write(ref POF, 1);
                CurrentOffset = writer.UIntPosition;
                writer.WriteEOFC(0);
                Header.Lenght      = 0x40;
                Header.DataSize    = (int)(CurrentOffset - Header.Lenght);
                Header.Signature   = 0x41525453;
                Header.SectionSize = (int)(Offset - Header.Lenght);
                writer.Position    = 0;
                writer.Write(Header);
            }
            writer.Close();
        }
예제 #11
0
파일: Aet.cs 프로젝트: korenkonder/PD_Tool
        public void BINWriter(string file)
        {
            if (AetSets == null)
            {
                return;
            }
            if (AetSets.Length == 0)
            {
                return;
            }

            KKdList <string> setName     = KKdList <string> .New;
            KKdList <string> setFileName = KKdList <string> .New;

            KKdList <int> ids    = KKdList <int> .New;
            KKdList <int> setIds = KKdList <int> .New;

            KKdList <int> notAdd = KKdList <int> .New;
            AET           temp;
            AetSet        set;

            for (i = 0; i < AetSets.Length; i++)
            {
                set = AetSets[i];
                if (set.Name != null)
                {
                    if (setName.Contains(set.Name))
                    {
                        notAdd.Add(i); continue;
                    }
                    else
                    {
                        setName.Add(set.Name);
                    }
                }
                if (set.FileName != null)
                {
                    if (setFileName.Contains(set.FileName))
                    {
                        notAdd.Add(i); continue;
                    }
                    else
                    {
                        setFileName.Add(set.FileName);
                    }
                }

                if (set.NewId)
                {
                    AetSets[i].Id = null;
                    for (i0 = 0; i0 < set.Aets.Length; i0++)
                    {
                        AetSets[i].Aets[i0].Id = null;
                    }
                    continue;
                }

                if (set.Id != null)
                {
                    if (setIds.Contains((int)set.Id))
                    {
                        notAdd.Add(i); continue;
                    }
                    else
                    {
                        setIds.Add((int)set.Id);
                    }
                }

                for (i0 = 0; i0 < set.Aets.Length; i0++)
                {
                    temp = set.Aets[i0];
                    if (temp.Id != null)
                    {
                        if (ids.Contains((int)temp.Id))
                        {
                            notAdd.Add(i); break;
                        }
                        else
                        {
                            ids.Add((int)temp.Id);
                        }
                    }
                }
            }
            setName.Dispose();
            setFileName.Dispose();

            for (i = 0; i < AetSets.Length; i++)
            {
                set = AetSets[i];
                if (notAdd.Contains(i))
                {
                    continue;
                }
                if (!set.NewId)
                {
                    continue;
                }

                i1 = 0;
                if (set.Id == null)
                {
                    while (true)
                    {
                        if (!setIds.Contains(i1))
                        {
                            AetSets[i].Id = i1; setIds.Add(i1); break;
                        }
                        i1++;
                    }
                }

                for (i0 = 0, i1 = 0; i0 < set.Aets.Length; i0++)
                {
                    if (set.Aets[i0].Id == null)
                    {
                        while (true)
                        {
                            if (!ids.Contains(i1))
                            {
                                AetSets[i].Aets[i0].Id = i1; ids.Add(i1); break;
                            }
                            i1++;
                        }
                    }
                }
            }
            ids.Dispose();
            setIds.Dispose();

            for (i = 0, i0 = 0, i2 = 0; i < AetSets.Length; i++)
            {
                if (!notAdd.Contains(i))
                {
                    i0 += AetSets[i].Aets.Length; i2++;
                }
            }

            i1 = i0 * 12;
            i1 = i1.A(0x20) + 0x20;

            s = File.OpenWriter(file + ".bin", true);
            s.W(i2);
            s.W(i1);
            s.W(i0);
            s.W(0x20);
            s.W(0x9066906690669066);
            s.W(0x9066906690669066);

            s.P = (i1 + i2 * 0x14).A(0x20);
            for (i = 0; i < AetSets.Length; i++)
            {
                if (notAdd.Contains(i))
                {
                    continue;
                }
                AetSets[i].NameOffset     = s.P; s.W(AetSets[i].Name + "\0");
                AetSets[i].FileNameOffset = s.P; s.W(AetSets[i].FileName + "\0");
            }

            for (i = 0; i < AetSets.Length; i++)
            {
                if (notAdd.Contains(i))
                {
                    continue;
                }
                for (i0 = 0; i0 < AetSets[i].Aets.Length; i0++)
                {
                    AetSets[i].Aets[i0].NameOffset = s.P; s.W(AetSets[i].Aets[i0].Name + "\0");
                }
            }
            s.A(0x08, true);

            s.P = 0x20;
            for (i = 0, i2 = 0; i < AetSets.Length; i++)
            {
                if (notAdd.Contains(i))
                {
                    i2++; continue;
                }

                for (i0 = 0; i0 < AetSets[i].Aets.Length; i0++)
                {
                    s.W(AetSets[i].Aets[i0].Id);
                    s.W(AetSets[i].Aets[i0].NameOffset);
                    s.W((ushort)i0);
                    s.W((ushort)(i - i2));
                }
            }
            s.A(0x20);

            for (i = 0, i2 = 0; i < AetSets.Length; i++)
            {
                if (notAdd.Contains(i))
                {
                    i2++; continue;
                }

                s.W(AetSets[i].Id);
                s.W(AetSets[i].NameOffset);
                s.W(AetSets[i].FileNameOffset);
                s.W(i - i2);
                s.W(AetSets[i].SpriteSetId);
            }
            notAdd.Dispose();
            s.C();
        }
예제 #12
0
파일: STR.cs 프로젝트: korenkonder/PD_Tool
        public void STRWriter(string filepath)
        {
            if (Strings == null || Strings.Length == 0 || header.Format > Format.F2)
            {
                return;
            }
            uint   offset        = 0;
            uint   currentOffset = 0;
            Format format        = header.Format;

            s = File.OpenWriter(filepath + (header.Format > Format.AFT &&
                                            header.Format < Format.FT ? ".str" : ".bin"), true);
            s.Format    = header.Format;
            s.IsBE      = header.UseBigEndian;
            pof.Offsets = KKdList <long> .New;

            long count = Strings.LongLength;

            if (s.Format > Format.AFT && s.Format < Format.FT)
            {
                s.P = 0x40;
                s.WX(count, ref pof);
                s.WX(0x80);
                s.P = 0x80;
                for (int i = 0; i < count; i++)
                {
                    s.W(0x00L);
                }
            }
            else
            {
                for (int i = 0; i < count; i++)
                {
                    s.W(0x00);
                }
            }
            s.A(0x10);

            KKdList <string> usedSTR    = KKdList <string> .New;
            KKdList <int>    usedSTRPos = KKdList <int> .New;

            int[] STRPos = new int[count];

            for (int i = 0; i < count; i++)
            {
                if (usedSTR.Contains(Strings[i].Str.V))
                {
                    for (int i2 = 0; i2 < count; i2++)
                    {
                        if (usedSTR[i2] == Strings[i].Str.V)
                        {
                            STRPos[i] = usedSTRPos[i2]; break;
                        }
                    }
                }
                else
                {
                    usedSTRPos.Add(STRPos[i] = s.P);
                    usedSTR.Add(Strings[i].Str.V);
                    s.W(Strings[i].Str.V);
                    s.W((byte)0);
                    if (format < Format.F)
                    {
                        s.A(0x8);
                    }
                }
            }
            s.A(0x4);
            s.L = s.P;

            if (s.Format > Format.AFT)
            {
                s.A(0x10);
                offset = s.PU32;
                s.P    = 0x80;
                for (int i = 0; i < count; i++)
                {
                    pof.Offsets.Add(s.P);
                    s.WE(STRPos[i]);
                    s.WE(Strings[i].ID);
                }

                s.PU32 = offset;
                s.W(pof, false, 1);
                s.WEOFC(1);
                currentOffset = s.PU32;
                s.WEOFC();
                header.DataSize       = currentOffset - 0x40;
                header.Signature      = 0x41525453;
                header.SectionSize    = offset - 0x40;
                header.UseSectionSize = true;
                s.P = 0;
                s.W(header, true);
            }
            else
            {
                s.P    = 0;
                s.IsBE = header.Format < Format.F;
                for (int i = 0; i < count; i++)
                {
                    s.WE(STRPos[i]);
                }
            }
            s.C();
        }
예제 #13
0
        private static Struct ReadStruct(ref Stream stream, Header Header)
        {
            Struct Struct = new Struct {
                Header = Header, DataOffset =
                    stream.Position, Data = stream.ReadBytes(Header.SectionSize)
            };
            int ID = Header.ID;

            KKdList <Struct> SubStructs = KKdList <Struct> .New;
            long             Length     = stream.Length - stream.Position;
            long             Position   = 0;

            while (Length > Position)
            {
                Header    = stream.ReadHeader(false);
                Position += Header.Length + Header.DataSize;
                if (Header.ID == ID && Header.Signature == 0x43464F45)
                {
                    Struct.HasEOFC = true; break;
                }
                else if (Header.ID == 0 && Header.Signature == 0x53524E45)
                {
                    SubStructs.Add(new Struct {
                        Header = Header, DataOffset =
                            stream.Position, Data = stream.ReadBytes(Header.SectionSize)
                    });
                }
                else if (Header.ID <= ID)
                {
                    stream.LongPosition -= Header.Length; break;
                }
                else
                {
                    SubStructs.Add(ReadStruct(ref stream, Header));
                }
                //(Header.Signature == 0x30464F50 || Header.Signature ==
                //    0x31464F50 || Header.Signature == 0x53524E45)
            }

            for (int i = 0; i < SubStructs.Capacity; i++)
            {
                string Sig = SubStructs[i].Header.ToString();
                if (Sig == "ENRS" || Sig == "POF0" || Sig == "POF1")
                {
                    if (Sig == "ENRS")
                    {
                        Struct.ENRS = (Mini)SubStructs[i];
                    }
                    else
                    {
                        Struct.POF = (Mini)SubStructs[i];
                    }
                    SubStructs.RemoveAt(i); SubStructs.Capacity--; i--;
                }
            }

            if (SubStructs.Capacity > 0)
            {
                Struct.SubStructs = SubStructs.ToArray();
            }
            return(Struct);
        }