public PokemonDataInfoEntry(CreatureIndex id, IReadOnlyBinaryDataAccessor data)
            {
                this.Id = id;

                Unknown00 = data.ReadInt64(0);
                Unknown08 = data.ReadInt64(8);

                var levelupLearnset = new List <LevelUpMove>(26);

                for (int i = 0; i < 26; i++)
                {
                    WazaIndex move  = (WazaIndex)data.ReadInt16(0x10 + i * sizeof(short));
                    byte      level = data.ReadByte(0x44 + i);
                    levelupLearnset.Add(new LevelUpMove(level, move));
                }
                this.LevelupLearnset = levelupLearnset;

                Unknown5E = data.ReadInt16(0x5E);
                Unknown60 = data.ReadInt32(0x60);

                PokedexNumber = data.ReadInt16(0x64);
                Unknown66     = data.ReadInt16(0x66);
                Taxon         = data.ReadInt16(0x68);

                Unknown6A = data.ReadInt16(0x6A);
                Unknown6C = data.ReadInt32(0x6C);
                Unknown70 = data.ReadInt32(0x70);

                BaseHitPoints      = data.ReadInt16(0x74);
                BaseAttack         = data.ReadInt16(0x76);
                BaseSpecialAttack  = data.ReadInt16(0x78);
                BaseDefense        = data.ReadInt16(0x7A);
                BaseSpecialDefense = data.ReadInt16(0x7C);
                BaseSpeed          = data.ReadInt16(0x7E);

                Unknown80 = data.ReadInt32(0x80);

                ExperienceEntry = data.ReadInt32(0x84);

                Unknown88 = data.ReadInt64(0x88);

                Ability1      = (AbilityIndex)data.ReadByte(0x90);
                Ability2      = (AbilityIndex)data.ReadByte(0x91);
                HiddenAbility = (AbilityIndex)data.ReadByte(0x92);
                Type1         = (PokemonType)data.ReadByte(0x93);
                Type2         = (PokemonType)data.ReadByte(0x94);

                Unknown95 = data.ReadByte(0x95);
                Unknown96 = data.ReadByte(0x96);
                Unknown97 = data.ReadByte(0x97);
                Unknown98 = data.ReadByte(0x98);
                Unknown99 = data.ReadByte(0x99);
                Unknown9A = data.ReadByte(0x9A);

                RecruitPrereq = data.ReadString(0x9B, 69, Encoding.ASCII).TrimEnd('\0');
            }
Ejemplo n.º 2
0
            public PokemonGraphicsDatabaseEntry(IReadOnlyBinaryDataAccessor entryAccessor, IReadOnlyBinaryDataAccessor rawDataAccessor)
            {
                BgrsFilenamePointer          = entryAccessor.ReadInt32(0);
                SecondaryBgrsFilenamePointer = entryAccessor.ReadInt32(4);
                PortraitNamePointer          = entryAccessor.ReadInt32(8);

                BgrsFilename          = rawDataAccessor.ReadNullTerminatedUnicodeString(BgrsFilenamePointer);
                SecondaryBgrsFilename = rawDataAccessor.ReadNullTerminatedUnicodeString(SecondaryBgrsFilenamePointer);
                PortraitName          = rawDataAccessor.ReadNullTerminatedUnicodeString(PortraitNamePointer);

                UnknownData = entryAccessor.ReadArray(0xC, entrySize - 0xC);
            }
Ejemplo n.º 3
0
        public Experience(IReadOnlyBinaryDataAccessor data, IReadOnlyBinaryDataAccessor entryList)
        {
            var entryCount = checked ((int)entryList.Length / sizeof(int));
            var entries    = new List <ExperienceEntry>(entryCount);

            for (int i = 0; i < entryCount - 1; i++)
            {
                var entryOffset = entryList.ReadInt32(i * sizeof(int));
                var entryEnd    = entryList.ReadInt32((i + 1) * sizeof(int));
                entries.Add(new ExperienceEntry(data.Slice(entryOffset, entryEnd - entryOffset)));
            }
            this.Entries = entries;
        }
            public PokemonGraphicsDatabaseEntry(IReadOnlyBinaryDataAccessor entryAccessor, IReadOnlyBinaryDataAccessor rawDataAccessor)
            {
                ModelNamePointer                  = entryAccessor.ReadInt64(0);
                AnimationNamePointer              = entryAccessor.ReadInt64(8);
                BaseFormModelNamePointer          = entryAccessor.ReadInt64(16);
                PortraitSheetNamePointer          = entryAccessor.ReadInt64(24);
                RescueCampSheetNamePointer        = entryAccessor.ReadInt64(32);
                RescueCampSheetReverseNamePointer = entryAccessor.ReadInt64(40);

                ModelName                  = rawDataAccessor.ReadNullTerminatedUnicodeString(ModelNamePointer);
                AnimationName              = rawDataAccessor.ReadNullTerminatedUnicodeString(AnimationNamePointer);
                BaseFormModelName          = rawDataAccessor.ReadNullTerminatedUnicodeString(BaseFormModelNamePointer);
                PortraitSheetName          = rawDataAccessor.ReadNullTerminatedUnicodeString(PortraitSheetNamePointer);
                RescueCampSheetName        = rawDataAccessor.ReadNullTerminatedUnicodeString(RescueCampSheetNamePointer);
                RescueCampSheetReverseName = rawDataAccessor.ReadNullTerminatedUnicodeString(RescueCampSheetReverseNamePointer);

                UnkX30 = entryAccessor.ReadSingle(0x30);
                UnkX34 = entryAccessor.ReadSingle(0x34);
                UnkX38 = entryAccessor.ReadSingle(0x38);
                UnkX3C = entryAccessor.ReadSingle(0x3C);

                UnkX40            = entryAccessor.ReadSingle(0x40);
                UnkX44            = entryAccessor.ReadSingle(0x44);
                UnkX48            = entryAccessor.ReadSingle(0x48);
                WalkSpeedDistance = entryAccessor.ReadSingle(0x4C); // Referenced by PokemonDatabase_GetWalkSpeed()

                UnkX50 = entryAccessor.ReadSingle(0x50);
                RunSpeedRatioGround = entryAccessor.ReadSingle(0x54); // Referenced by PokemonDatabase_GetRunRateGround()
                UnkX58 = entryAccessor.ReadSingle(0x58);
                UnkX5C = entryAccessor.ReadSingle(0x5C);

                UnkX60           = entryAccessor.ReadSingle(0x60);
                UnkX64           = entryAccessor.ReadSingle(0x64);
                UnknownBodyType1 = (GraphicsBodySizeType)entryAccessor.ReadInt32(0x68);
                UnknownBodyType2 = (GraphicsBodySizeType)entryAccessor.ReadInt32(0x6C);

                Flags            = (PokemonGraphicsDatabaseEntryFlags)entryAccessor.ReadInt32(0x70);
                EnabledPortraits = (EnabledPortraitsFlags)entryAccessor.ReadUInt32(0x74); // Bitmask of enabled portraits
                UnkX78           = entryAccessor.ReadInt32(0x78);
                UnkX7C           = entryAccessor.ReadInt32(0x7C);

                UnkX80 = entryAccessor.ReadInt32(0x80);
                UnkX84 = entryAccessor.ReadSingle(0x84);
                UnkX88 = entryAccessor.ReadSingle(0x88);
                UnkX8C = entryAccessor.ReadSingle(0x8C);

                UnkX90 = entryAccessor.ReadSingle(0x90);
                UnkX94 = entryAccessor.ReadSingle(0x94);
                UnkX98 = entryAccessor.ReadSingle(0x98);
                UnkX9C = entryAccessor.ReadSingle(0x9C);

                UnkXA0   = entryAccessor.ReadSingle(0xA0);
                Padding1 = entryAccessor.ReadInt32(0xA4);
                Padding2 = entryAccessor.ReadInt32(0xA8);
                Padding3 = entryAccessor.ReadInt32(0xAC);
            }
Ejemplo n.º 5
0
 public Entry(IReadOnlyBinaryDataAccessor data)
 {
     Features            = (Feature)data.ReadInt32(0x00);
     Index               = data.ReadInt32(0x04);
     Short08             = data.ReadInt16(0x08);
     Short0A             = data.ReadInt16(0x0A);
     SortKey             = data.ReadInt32(0x0C);
     DungeonBalanceIndex = data.ReadByte(0x12);
     Byte13              = data.ReadByte(0x13);
     MaxItems            = data.ReadByte(0x14);
     MaxTeammates        = data.ReadByte(0x15);
     Byte17              = data.ReadByte(0x17);
     Byte18              = data.ReadByte(0x18);
     Byte19              = data.ReadByte(0x19);
     // All unread bytes are zero
 }
Ejemplo n.º 6
0
 public CampEntry(IReadOnlyBinaryDataAccessor data)
 {
     Lineup            = data.ReadString(2, 0x40, Encoding.ASCII);
     UnlockCondition   = data.ReadString(0x42, 0x40, Encoding.ASCII);
     Price             = data.ReadInt32(0x84);
     BackgroundTexture = data.ReadString(0x94, 0x40, Encoding.ASCII);
     BackgroundMusic   = data.ReadString(0xD4, 0x40, Encoding.ASCII);
 }
Ejemplo n.º 7
0
        private void OpenInternalNormal(IReadOnlyBinaryDataAccessor f)
        {
            BgrsName    = f.ReadNullTerminatedString(0x58, Encoding.ASCII);        // Max length: &H40
            BgrsDevName = f.ReadNullTerminatedString(0x58 + 0x40, Encoding.ASCII); // Max length: &H80

            // Yes, the counts of these two sections are in a different order than the sections themselves
            var animationCount = f.ReadInt32(0x118);
            var partCount      = f.ReadInt32(0x11C);

            for (var partIndex = 0x140; partIndex <= 0x140 + (0x80 * partCount) - 1; partIndex += 0x80)
            {
                var partName = f.ReadNullTerminatedString(partIndex + 0x18, System.Text.Encoding.ASCII);
                Parts.Add(new ModelPart(f.ReadArray(partIndex, 0x80), partName));
            }
            UnknownModelPartsFooter = f.ReadArray(0x140 + (0x80 * partCount), 0x18);
            OpenInternalAnimations(f, 0x140 + (0x80 * partCount) + 0x18, animationCount);
        }
Ejemplo n.º 8
0
        private void OpenInternalExtended(IReadOnlyBinaryDataAccessor f)
        {
            var animationCount = f.ReadInt32(0x4);

            OpenInternalAnimations(f, 0x58, animationCount);

            // Set BGRS name, inferred from the animation names. Animation names are in the form of bgrs_name__animation_name
            BgrsName = Animations.FirstOrDefault()?.BgrsName;
        }
Ejemplo n.º 9
0
 public Level(IReadOnlyBinaryDataAccessor data)
 {
     MinimumExperience    = data.ReadInt32(0);
     HitPointsGained      = data.ReadByte(5);
     AttackGained         = data.ReadByte(6);
     DefenseGained        = data.ReadByte(7);
     SpecialAttackGained  = data.ReadByte(8);
     SpecialDefenseGained = data.ReadByte(9);
     SpeedGained          = data.ReadByte(0xA);
     LevelsGained         = data.ReadByte(0xB);
 }
Ejemplo n.º 10
0
        public CampHabitat(IReadOnlyBinaryDataAccessor data)
        {
            var entryCount = checked ((int)data.Length / sizeof(int));
            var entries    = new Dictionary <CreatureIndex, CampIndex>(entryCount);

            for (int i = 0; i < entryCount; i++)
            {
                entries.Add((CreatureIndex)i, (CampIndex)data.ReadInt32(i * sizeof(int)));
            }
            this.Entries = entries;
        }
Ejemplo n.º 11
0
        public Farc(byte[] data)
        {
            using var binaryFile = new BinaryFile(data);
            IReadOnlyBinaryDataAccessor accessor = binaryFile;

            Magic             = accessor.ReadInt32(0);
            UnknownHeaderData = accessor.ReadArray(4, 0x1C);
            FarcVersion       = accessor.ReadInt32(0x20);
            if (FarcVersion != 5)
            {
                throw new NotSupportedException("Only FARC version 5 is supported");
            }

            var fatOffset  = accessor.ReadInt32(0x24);
            var fatLength  = accessor.ReadInt32(0x28);
            var dataOffset = accessor.ReadInt32(0x2C);
            var dataLength = accessor.ReadInt32(0x30);

            var fat = new FarcFat(data, fatOffset, fatLength);

            var files = new Dictionary <uint, byte[]>();

            foreach (var file in fat.Entries)
            {
                files.Add(file.Hash, accessor.ReadArray(dataOffset + file.DataOffset, file.DataLength));
            }
            Files = files;
        }
Ejemplo n.º 12
0
 public RankEntry(Sir0 sir0, IReadOnlyBinaryDataAccessor data)
 {
     {
         int offset = checked ((int)data.ReadInt64(0));
         RewardStatue = sir0.Data.ReadString(offset, offset + 0x10, Encoding.ASCII);
     }
     MinPoints    = data.ReadInt32(8);
     Unknown      = data.ReadInt16(0xC);
     ToolboxSize  = data.ReadInt16(0xE);
     CampCapacity = data.ReadInt16(0x10);
     TeamPresets  = data.ReadInt16(0x12);
     JobLimit     = data.ReadInt16(0x14);
 }
 public StatsEntry(int index, IReadOnlyBinaryDataAccessor accessor)
 {
     Index          = index;
     CreatureIndex  = (CreatureIndex)(index + 1);
     XPYield        = accessor.ReadInt32(0x00);
     HitPoints      = accessor.ReadInt16(0x04);
     Attack         = accessor.ReadByte(0x06);
     Defense        = accessor.ReadByte(0x07);
     SpecialAttack  = accessor.ReadByte(0x08);
     SpecialDefense = accessor.ReadByte(0x09);
     Speed          = accessor.ReadByte(0x0A);
     StrongFoe      = accessor.ReadByte(0x0B);
     Level          = accessor.ReadByte(0x0C);
 }
            public PokemonEvolutionEntry(Sir0 sir0, IReadOnlyBinaryDataAccessor data)
            {
                int branchOffset = checked ((int)data.ReadInt64(0));
                int branchCount  = data.ReadInt32(8);
                var branches     = new List <PokemonEvolutionBranch>(branchCount);

                for (int i = 0; i < branchCount; i++)
                {
                    branches.Add(new PokemonEvolutionBranch(sir0.Data.Slice(branchOffset + i * 0x14, 0x14)));
                }
                this.Branches = branches;
                MegaEvos      = (
                    (CreatureIndex)data.ReadInt16(0xC),
                    (CreatureIndex)data.ReadInt16(0xE)
                    );
            }
Ejemplo n.º 15
0
 private void OpenInternalAnimations(IReadOnlyBinaryDataAccessor f, int animationIndex, int animationCount)
 {
     for (var i = animationIndex; i <= animationIndex + (0xC4 * animationCount) - 1; i += 0xC4)
     {
         var animName    = (f.ReadNullTerminatedString(i, System.Text.Encoding.ASCII));        // Max length: &H40
         var animDevName = (f.ReadNullTerminatedString(i + 0x40, System.Text.Encoding.ASCII)); // Max length: &H80
         if (!string.IsNullOrEmpty(animDevName))
         {
             // If any animation has a dev name, then this is a file format that requires them
             UsesDevNames = true;
         }
         var       animType = (AnimationType)f.ReadInt32(i + 0xC0);
         Animation anim     = new Animation(animName, animDevName, animType);
         Animations.Add(anim);
     }
 }
Ejemplo n.º 16
0
        public BGRS(IReadOnlyBinaryDataAccessor data)
        {
            Magic = data.ReadNullTerminatedString(0, System.Text.Encoding.ASCII);
            ReferencedBchFileName = (data.ReadNullTerminatedString(0x8, System.Text.Encoding.ASCII)).TrimEnd('0'); // Max length: 0x40
            Type = (BgrsType)data.ReadInt32(0x48);

            switch (Type)
            {
            case BgrsType.Normal:
                OpenInternalNormal(data);
                break;

            case BgrsType.Extension:
                OpenInternalExtended(data);
                break;

            default:
                throw new NotSupportedException("Unsupported BGRS type: " + Type.ToString());
            }
        }
Ejemplo n.º 17
0
        public static IBinaryDataAccessor Decompress(IReadOnlyBinaryDataAccessor data)
        {
            var Magic  = data.ReadInt32(0);
            var Length = data.ReadInt32(4);

            IBinaryDataAccessor dest = new BinaryFile(new byte[Length]);

            var dataIndex = 8;
            var destIndex = 0;

            while (true)
            {
                byte cur = data.ReadByte(dataIndex++);

                if (cur < 0x80)
                {
                    var next = data.ReadByte(dataIndex++);

                    // EOF marker
                    if (cur == 0x7F && next == 0xFF)
                    {
                        return(dest);
                    }

                    var offset = 0x400 - ((cur & 3) * 0x100 + next);
                    var bytes  = dest.ReadSpan(destIndex - offset, (cur >> 2) + 2);
                    dest.Write(destIndex, bytes);
                    destIndex += bytes.Length;
                    continue;
                }

                var op  = (Opcode)((cur >> 5) - 4);
                var arg = cur & 0x1F;

                switch (op)
                {
                case Opcode.Copy:
                {
                    var bytes = data.ReadSpan(dataIndex, arg + 1);
                    dataIndex += bytes.Length;
                    dest.Write(destIndex, bytes);
                    destIndex += bytes.Length;
                    break;
                }

                case Opcode.SplitCopy:
                {
                    var sep   = data.ReadByte(dataIndex++);
                    var bytes = data.ReadSpan(dataIndex, arg + 2);
                    dataIndex += bytes.Length;
                    foreach (byte x in bytes)
                    {
                        dest.Write(destIndex++, sep);
                        dest.Write(destIndex++, x);
                    }
                    break;
                }

                case Opcode.Fill:
                {
                    var fill = data.ReadByte(dataIndex++);
                    for (int i = 0; i < arg + 2; i++)
                    {
                        dest.Write(destIndex++, fill);
                    }
                    break;
                }

                case Opcode.Skip:
                {
                    var count = arg < 0x1F ? arg + 1 : 0x20 + data.ReadByte(dataIndex++);
                    destIndex += count;
                    break;
                }
                }
            }
        }
 public DungeonDataInfoEntry(IReadOnlyBinaryDataAccessor data)
 {
     Index        = (DungeonIndex)data.ReadInt32(4);
     SortPriority = data.ReadInt32(0xC);
 }