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'); }
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); }
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); }
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 }
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); }
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); }
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; }
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); }
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; }
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; }
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) ); }
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); } }
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()); } }
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); }