コード例 #1
0
        private void InitializeData(byte[] data)
        {
            Data = DecryptPBRSaveData(data);

            // Detect active save
            SaveCount = Math.Max(BigEndian.ToUInt32(Data, 0x1C004C), BigEndian.ToUInt32(Data, 0x4C));
            if (BigEndian.ToUInt32(Data, 0x1C004C) > BigEndian.ToUInt32(Data, 0x4C))
            {
                byte[] tempData = new byte[0x1C0000];
                Array.Copy(Data, 0, tempData, 0, 0x1C0000);
                Array.Copy(Data, 0x1C0000, Data, 0, 0x1C0000);
                tempData.CopyTo(Data, 0x1C0000);
            }

            for (int i = 0; i < SAVE_COUNT; i++)
            {
                if (!IsOTNamePresent(i))
                {
                    continue;
                }
                SaveSlots.Add(i);
                SaveNames.Add(GetOTName(i));
            }

            CurrentSlot = SaveSlots[0];
        }
コード例 #2
0
ファイル: SAV4BR.cs プロジェクト: metaboss/MysteryGiftTool
        public static void SetChecksum(byte[] input, int offset, int len, int checksum_offset)
        {
            uint[] storedChecksums = new uint[16];
            for (int i = 0; i < storedChecksums.Length; i++)
            {
                storedChecksums[i] = BigEndian.ToUInt32(input, checksum_offset + i * 4);
                BitConverter.GetBytes((uint)0).CopyTo(input, checksum_offset + i * 4);
            }

            uint[] checksums = new uint[16];

            for (int i = 0; i < len; i += 2)
            {
                ushort val = BigEndian.ToUInt16(input, offset + i);
                for (int j = 0; j < 16; j++)
                {
                    checksums[j] += (uint)((val >> j) & 1);
                }
            }

            for (int i = 0; i < checksums.Length; i++)
            {
                BigEndian.GetBytes(checksums[i]).CopyTo(input, checksum_offset + i * 4);
            }
        }
コード例 #3
0
ファイル: BlockInfoRSBOX.cs プロジェクト: yanisdreemurr/PKHeX
        protected override bool ChecksumValid(byte[] data)
        {
            var chk = GetChecksum(data);
            var old = BigEndian.ToUInt32(data, Offset);

            return(chk == old);
        }
コード例 #4
0
ファイル: BK4.cs プロジェクト: yanisdreemurr/PKHeX
        public static BK4 ReadUnshuffle(byte[] data)
        {
            var  PID    = BigEndian.ToUInt32(data, 0);
            uint sv     = ((PID & 0x3E000) >> 0xD) % 24;
            var  Data   = PokeCrypto.ShuffleArray(data, sv, PokeCrypto.SIZE_4BLOCK);
            var  result = new BK4(Data);

            result.RefreshChecksum();
            return(result);
        }
コード例 #5
0
ファイル: BlockInfoRSBOX.cs プロジェクト: yanisdreemurr/PKHeX
        public BlockInfoRSBOX(byte[] data, int offset)
        {
            Offset = offset;
            Length = 4 + ChecksumRegionSize;

            // Values stored in Big Endian format
            OriginalChecksum = BigEndian.ToUInt32(data, Offset);
            ID        = BigEndian.ToUInt32(data, Offset + 4);
            SaveCount = BigEndian.ToUInt32(data, Offset + 8);
        }
コード例 #6
0
ファイル: SAV4BR.cs プロジェクト: trainboy2019/PKHeX
        public SAV4BR(byte[] data = null)
        {
            Data       = data ?? new byte[SaveUtil.SIZE_G4BR];
            BAK        = (byte[])Data.Clone();
            Exportable = !Data.All(z => z == 0);

            if (SaveUtil.GetIsG4BRSAV(Data) != GameVersion.BATREV)
            {
                return;
            }

            Data = DecryptPBRSaveData(data);

            // Detect active save
            SaveCount = Math.Max(BigEndian.ToUInt32(Data, 0x1C004C), BigEndian.ToUInt32(Data, 0x4C));
            if (BigEndian.ToUInt32(Data, 0x1C004C) > BigEndian.ToUInt32(Data, 0x4C))
            {
                byte[] tempData = new byte[0x1C0000];
                Array.Copy(Data, 0, tempData, 0, 0x1C0000);
                Array.Copy(Data, 0x1C0000, Data, 0, 0x1C0000);
                tempData.CopyTo(Data, 0x1C0000);
            }

            SaveSlots = new List <int>();
            SaveNames = new string[SAVE_COUNT];
            for (int i = 0; i < SAVE_COUNT; i++)
            {
                if (BitConverter.ToUInt16(Data, 0x390 + 0x6FF00 * i) != 0)
                {
                    SaveSlots.Add(i);
                    SaveNames[i] = Encoding.BigEndianUnicode.GetString(Data, 0x390 + 0x6FF00 * i, 0x10);
                }
            }

            CurrentSlot = SaveSlots[0];

            Personal  = PersonalTable.DP;
            HeldItems = Legal.HeldItems_DP;

            if (!Exportable)
            {
                ClearBoxes();
            }
        }
コード例 #7
0
ファイル: SAV4BR.cs プロジェクト: iiippppk/PKHeX
        public SAV4BR(byte[] data = null)
        {
            Data       = data ?? new byte[SaveUtil.SIZE_G4BR];
            BAK        = (byte[])Data.Clone();
            Exportable = !IsRangeEmpty(0, Data.Length);

            if (SaveUtil.GetIsG4BRSAV(Data) != GameVersion.BATREV)
            {
                return;
            }

            Data = DecryptPBRSaveData(data);

            // Detect active save
            SaveCount = Math.Max(BigEndian.ToUInt32(Data, 0x1C004C), BigEndian.ToUInt32(Data, 0x4C));
            if (BigEndian.ToUInt32(Data, 0x1C004C) > BigEndian.ToUInt32(Data, 0x4C))
            {
                byte[] tempData = new byte[0x1C0000];
                Array.Copy(Data, 0, tempData, 0, 0x1C0000);
                Array.Copy(Data, 0x1C0000, Data, 0, 0x1C0000);
                tempData.CopyTo(Data, 0x1C0000);
            }

            for (int i = 0; i < SAVE_COUNT; i++)
            {
                if (!IsOTNamePresent(i))
                {
                    continue;
                }
                SaveSlots.Add(i);
                SaveNames.Add(GetOTName(i).Trim());
            }

            CurrentSlot = SaveSlots[0];

            Personal  = PersonalTable.DP;
            HeldItems = Legal.HeldItems_DP;

            if (!Exportable)
            {
                ClearBoxes();
            }
        }
コード例 #8
0
ファイル: SAV4BR.cs プロジェクト: sutiam/PKHeX
        private void InitializeData(byte[] data)
        {
            Data = DecryptPBRSaveData(data);

            // Detect active save
            var first  = BigEndian.ToUInt32(Data, 0x00004C);
            var second = BigEndian.ToUInt32(Data, 0x1C004C);

            SaveCount = Math.Max(second, first);
            if (second > first)
            {
                // swap halves
                byte[] tempData = new byte[0x1C0000];
                Array.Copy(Data, 0, tempData, 0, 0x1C0000);
                Array.Copy(Data, 0x1C0000, Data, 0, 0x1C0000);
                tempData.CopyTo(Data, 0x1C0000);
            }

            var names = (string[])SaveNames;

            for (int i = 0; i < SAVE_COUNT; i++)
            {
                var name = GetOTName(i);
                if (string.IsNullOrWhiteSpace(name))
                {
                    name = $"Empty {i + 1}";
                }
                else if (_currentSlot == -1)
                {
                    _currentSlot = i;
                }
                names[i] = name;
            }

            if (_currentSlot == -1)
            {
                _currentSlot = 0;
            }

            CurrentSlot = _currentSlot;
        }
コード例 #9
0
 private static bool GetIsRanchPlat(byte[] data) => data.Length == SIZE_G4RANCH_PLAT && BigEndian.ToUInt32(data, 0x268C) != 0;
コード例 #10
0
 private static bool GetIsBank3(byte[] data) => data.Length == SIZE_G4BANK && BitConverter.ToUInt32(data, 0x3FC00) == 0; // size collision with ^
 private static bool GetIsRanchDP(byte[] data) => data.Length == SIZE_G4RANCH && BigEndian.ToUInt32(data, 0x22AC) != 0;
コード例 #11
0
ファイル: SaveUtil.cs プロジェクト: rboninsegna/PKHeX
 private static bool GetIsBank3(byte[] data) => data.Length == SIZE_G4BANK && BitConverter.ToUInt32(data, 0x3FC00) == 0; // size collision with ^
 private static bool GetIsRanch4(byte[] data) => (data.Length == SIZE_G4RANCH && BigEndian.ToUInt32(data, 0x22AC) != 0) || (data.Length == SIZE_G4RANCH_PLAT && BigEndian.ToUInt32(data, 0x268C) != 0);