public WildPokemonInfo(IReadOnlyBinaryDataAccessor accessor)
            {
                var sir0 = new Sir0(accessor);

                int pokemonStatsCount  = sir0.SubHeader.ReadInt32(0x00);
                int pokemonStatsOffset = sir0.SubHeader.ReadInt32(0x08);

                Stats = new StatsEntry[pokemonStatsCount];
                for (int i = 0; i < pokemonStatsCount; i++)
                {
                    var offset = sir0.Data.ReadInt64(pokemonStatsOffset + i * sizeof(long));
                    Stats[i] = new StatsEntry(i, sir0.Data.Slice(offset, 16));
                }

                int floorCount = sir0.SubHeader.ReadInt32(0x10);

                Floors = new FloorInfo[floorCount];
                for (int i = 0; i < floorCount; i++)
                {
                    Floors[i] = new FloorInfo(pokemonStatsCount);
                    var offset = sir0.SubHeader.ReadInt64(0x18 + i * sizeof(long));
                    for (int j = 0; j < pokemonStatsCount; j++)
                    {
                        Floors[i].Entries[j] = new FloorInfo.Entry(sir0.Data.Slice(offset + j * 16, 16));
                    }
                }
            }
        public MessageBinEntry(IReadOnlyBinaryDataAccessor data, ICodeTable?codeTable = null) : this()
        {
            var sir0          = new Sir0(data);
            var entryCount1   = sir0.SubHeader.ReadInt32(0);
            var entryCount2   = sir0.SubHeader.ReadInt32(4);
            var entriesOffset = sir0.SubHeader.ReadInt32(8);

            var hashes = new Dictionary <long, int>();

            for (int i = 0; i < entryCount1; i++)
            {
                var entryOffset  = entriesOffset + (i * EntryLength);
                var stringOffset = sir0.Data.ReadInt64(entryOffset);

                var hash    = sir0.Data.ReadInt32(entryOffset + 8);
                var unknown = sir0.Data.ReadInt32(entryOffset + 0xC);

                var value = sir0.Data.ReadNullTerminatedUnicodeString(stringOffset);
                if (codeTable != null)
                {
                    value = codeTable.UnicodeDecode(value);
                }
                AddString(new MessageBinString
                {
                    Value        = value,
                    Hash         = hash,
                    Unknown      = unknown,
                    StringOffset = stringOffset
                });
                hashes.Add(stringOffset, hash);
            }
            OrderedHashes = hashes.OrderBy(h => h.Key).Select(h => h.Value).ToArray();
        }
Пример #3
0
        public FixedPokemon(byte[] data)
        {
            var sir0       = new Sir0(data);
            var entryCount = sir0.SubHeader.ReadInt32(0);
            var entries    = new List <FixedPokemonEntry>();

            for (int i = 0; i < entryCount; i++)
            {
                entries.Add(new FixedPokemonEntry(i, data, sir0.SubHeader.ReadInt32((i + 1) * 8)));
            }
            this.Entries = entries;
        }
        public PokemonGraphicsDatabase(byte[] data)
        {
            var sir0        = new Sir0(data);
            var indexOffset = BitConverter.ToInt32(data, (int)sir0.SubHeaderOffset + 8);
            var entryCount  = BitConverter.ToInt32(data, (int)sir0.SubHeaderOffset + 16);
            var entries     = new List <PokemonGraphicsDatabaseEntry>();

            for (int i = 0; i < entryCount; i++)
            {
                entries.Add(new PokemonGraphicsDatabaseEntry(sir0.Data.Slice(indexOffset + (i * entrySize), entrySize), sir0.Data));
            }
            this.Entries = entries;
        }
        public Sir0StringList(byte[] data, Encoding encoding)
        {
            this.encoding = encoding;

            var sir0 = new Sir0(data);

            var entryCount = sir0.SubHeader.ReadInt32(0);

            for (int i = 0; i < entryCount; i++)
            {
                long   stringOffset = sir0.SubHeader.ReadInt32(8 + i * sizeof(long));
                string value        = sir0.Data.ReadNullTerminatedUnicodeString(stringOffset);
                Entries.Add(value);
            }
        }
            public DungeonBalanceDataEntry4(IReadOnlyBinaryDataAccessor accessor)
            {
                var sir0  = new Sir0(accessor);
                int count = sir0.SubHeader.ReadInt32(0x00);

                Records = new Record[count];
                for (int i = 0; i < count; i++)
                {
                    Records[i] = new Record();
                    var offset = sir0.SubHeader.ReadInt64(0x08 + i * sizeof(long));
                    for (int j = 0; j < Records[i].Entries.Length; j++)
                    {
                        Records[i].Entries[j] = new Record.Entry(sir0.Data.Slice(offset + j * 8, 8));
                    }
                }
            }
Пример #7
0
            public FarcFat(byte[] data, long offset, long length)
            {
                var sir0       = new Sir0(data, offset, length);
                var dataOffset = sir0.SubHeader.ReadInt32(0);
                var entryCount = sir0.SubHeader.ReadInt32(4);
                var useHashesInsteadOfFilenames = sir0.SubHeader.ReadInt32(8);

                if (useHashesInsteadOfFilenames != 1)
                {
                    throw new NotSupportedException("Only FARC files with hashes instead of filenames are supported");
                }

                var entries = new List <FarcFatEntry>();

                for (int i = 0; i < entryCount; i++)
                {
                    entries.Add(new FarcFatEntry(sir0.Data.ReadArray(dataOffset + (i * FarcFatEntry.Length), 0x10)));
                }
                this.Entries = entries;
            }
Пример #8
0
        public MessageBinEntry(IReadOnlyBinaryDataAccessor data)
        {
            var sir0          = new Sir0(data);
            var entryCount    = sir0.SubHeader.ReadInt32(0);
            var entriesOffset = sir0.SubHeader.ReadInt32(4);

            var strings = new Dictionary <int, string>();
            var hashes  = new Dictionary <long, int>();

            for (int i = 0; i < entryCount; i++)
            {
                var entryOffset  = entriesOffset + (i * EntryLength);
                var stringOffset = sir0.Data.ReadInt32(entryOffset);
                var hash         = sir0.Data.ReadInt32(entryOffset + 4);
                var unknown      = sir0.Data.ReadInt32(entryOffset + 8);
                strings.Add(hash, sir0.Data.ReadNullTerminatedUnicodeString(stringOffset));
                hashes.Add(stringOffset, hash);
            }
            Strings       = strings;
            OrderedHashes = hashes.OrderBy(h => h.Key).Select(h => h.Value).ToArray();
        }
            public Entry(IReadOnlyBinaryDataAccessor accessor)
            {
                var buffer = Gyu0.Decompress(accessor);

                Sir0 sir0              = new Sir0(buffer);
                var  offsetHeader      = sir0.SubHeader.ReadInt64(0x00);
                var  offsetWildPokemon = sir0.SubHeader.ReadInt64(0x08);
                var  offset3           = sir0.SubHeader.ReadInt64(0x10);
                var  offset4           = sir0.SubHeader.ReadInt64(0x18);
                var  lenHeader         = offsetWildPokemon - offsetHeader;
                var  lenWildPokemon    = offset3 - offsetWildPokemon;
                var  len3              = offset4 - offset3;
                var  len4              = sir0.SubHeaderOffset - offset4;

                var headerEntrySize = FloorInfoEntry.Size;
                var entryCount      = lenHeader / headerEntrySize;

                FloorInfos = new FloorInfoEntry[entryCount];
                for (int i = 0; i < lenHeader / headerEntrySize; i++)
                {
                    FloorInfos[i] = new FloorInfoEntry(sir0.Data.Slice(offsetHeader + i * headerEntrySize, headerEntrySize));
                }

                if (lenWildPokemon > 0)
                {
                    WildPokemon = new WildPokemonInfo(sir0.Data.Slice(offsetWildPokemon, lenWildPokemon));
                }
                if (len3 > 0)
                {
                    Data3 = new DungeonBalanceDataEntry3(sir0.Data.Slice(offset3, len3));
                }
                if (len4 > 0)
                {
                    Data4 = new DungeonBalanceDataEntry4(sir0.Data.Slice(offset4, len4));
                }
            }