// Slot 0 Active @ 0x3F3D64 // Slot 1 Active @ 0x4E9E74 // Slot 2 Active @ 0x5DFF84 private MonsterStatsSaveSlotInfo ReadSaveSlot(int slotNumber) { SaveSlotInfoBase baseSaveSlotInfo = ReadUntilPlaytimeIncluded(slotNumber); Skip( 4 + // unknown Constants.HunterAppearanceStructureSize + // H_APPEARANCE Constants.PalicoAppearanceStructureSize // P_APPEARANCE ); // Here is struct GUILDCARD Skip( 167 + // begining of GUILDCARD struct Constants.HunterAppearanceStructureSize + // hunterAppearance (H_APPEARANCE) Constants.PalicoAppearanceStructureSize + // palicoAppearance (P_APPEARANCE) Constants.HunterEquipmentStructureSize + // hunterEquipment 92 + // unknown Constants.PalicoStructureSize + // struct palico 63 // remaining of the struct GUILDCARD until weapon usage ); Skip(Constants.WeaponUsageStructureSize * 3); // Skip the remaining of the GUILDCARD structure Skip( 1 + // poseID 1 + // expressionID 1 + // backgroundID 1 + // stickerID 256 + // greeting 256 + // title 2 + // titleFirst 2 + // titleMiddle 2 + // titleLast 4 + // positionX 4 + // positionY 4 + // zoom 10 * Constants.ArenaStatsStructSize // arenaRecords ); ushort[] captured = ReadMonsters16(); ushort[] slayed = ReadMonsters16(); ushort[] largest = ReadMonsters16(); ushort[] smallest = ReadMonsters16(); byte[] researchLevel = ReadMonsters8(); // Skip the remaining of the saveSlot structure Skip( Constants.GuildCardStructureSize * 100 + // sharedGC 0x019e36 + // unknown Constants.ItemLoadoutsStructureSize + // itemLoadouts 8 + // unknown Constants.ItemPouchStructureSize + // itemPouch Constants.ItemBoxStructureSize + // itemBox 0x034E3C + // unknown 42 * 250 + // investigations 0x0FB9 + // unknown Constants.EquipLoadoutsStructureSize + // equipLoadout 0x6521 + // unknown Constants.DlcTypeSize * 256 + // DLCClaimed 0x2A5D // unknown ); if (baseSaveSlotInfo.Playtime == 0) { return(null); } var monsters = new MonsterStatsInfo[captured.Length]; for (int i = 0; i < captured.Length; i++) { bool hasMini = HasMini(smallest[i], MonsterData[i]); bool hasGold = HasGold(largest[i], MonsterData[i]); bool hasSilver = hasGold ? true : HasSilver(largest[i], MonsterData[i]); monsters[i] = new MonsterStatsInfo { Name = MonsterData[i].Name, Captured = captured[i], Slayed = slayed[i], Largest = largest[i], Smallest = smallest[i], ResearchLevel = researchLevel[i], HasCrowns = MonsterData[i].CrownSize != MonsterSize.None, HasMiniCrown = hasMini, HasSilverCrown = hasSilver, HasGoldCrown = hasGold }; } return(new MonsterStatsSaveSlotInfo(baseSaveSlotInfo, monsters)); }
// Slot 0 Active @ 0x3F3D64 // Slot 1 Active @ 0x4E9E74 // Slot 2 Active @ 0x5DFF84 private MonsterStatsSaveSlotInfo ReadSaveSlot(int slotNumber) { Skip(4); // unknown SaveSlotInfoBase baseSaveSlotInfo = ReadUntilPlaytimeIncluded(slotNumber); Skip( Constants.HunterAppearanceStructureSize + // H_APPEARANCE 382 + // unknown Constants.PalicoAppearanceStructureSize // P_APPEARANCE ); // Here is struct GUILDCARD Skip( 171 + // begining of GUILDCARD struct Constants.HunterAppearanceStructureSize + // hunterAppearance (H_APPEARANCE) 212 + // unknown 64 + // Palico name 4 + // Palico rank 194 // unknown ); Skip(Constants.WeaponUsageStructureSize * 5); // Skip the remaining of the GUILDCARD structure Skip( 1 + // poseID 1 + // expressionID 1 + // backgroundID 1 + // stickerID 256 + // greeting 256 // title ); Skip( 5454 // lot of things ); ushort[] captured = ReadMonsters16(); ushort[] slayed = ReadMonsters16(); ushort[] largest = ReadMonsters16(); ushort[] smallest = ReadMonsters16(); byte[] researchLevel = ReadMonsters8(); // Skip the remaining of the saveSlot structure Skip( 2127779 + // lot of things 512 // hash things ); if (baseSaveSlotInfo.Playtime == 0) { return(null); } var monsters = new MonsterStatsInfo[MonsterData.Count]; int i = 0; foreach (MonsterBaseInfo monsterData in MonsterData.Values) { bool hasMini = HasMini(smallest[i], monsterData); bool hasGold = HasGold(largest[i], monsterData); bool hasSilver = hasGold || HasSilver(largest[i], monsterData); monsters[i] = new MonsterStatsInfo { Name = monsterData.Name, Captured = captured[i], Slayed = slayed[i], Largest = largest[i], Smallest = smallest[i], ResearchLevel = researchLevel[i], HasCrowns = monsterData.CrownSize != MonsterSize.None, HasMiniCrown = hasMini, HasSilverCrown = hasSilver, HasGoldCrown = hasGold }; i++; } return(new MonsterStatsSaveSlotInfo(baseSaveSlotInfo, monsters)); }