// 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));
        }
예제 #2
0
        // 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));
        }