Exemplo n.º 1
0
Arquivo: PK4.cs Projeto: kwsch/pk2pk
        public PK5 convertToPK5()
        {
            // Double Check Location Data to see if we're already a PK5
            if (Data[0x5F] < 0x10 && BitConverter.ToUInt16(Data, 0x80) > 0x4000)
                return new PK5(Data);

            DateTime moment = DateTime.Now;

            PK5 pk5 = new PK5(Data) // Convert away!
            {
                HeldItem = 0,
                Friendship = 70,
                // Apply new met date
                Met_Year = moment.Year - 2000,
                Met_Month = moment.Month,
                Met_Day = moment.Day
            };

            // Fix PP
            pk5.Move1_PP = PKX.getMovePP(pk5.Move1_PP, pk5.Move1_PPUps);
            pk5.Move2_PP = PKX.getMovePP(pk5.Move2_PP, pk5.Move2_PPUps);
            pk5.Move3_PP = PKX.getMovePP(pk5.Move3_PP, pk5.Move3_PPUps);
            pk5.Move4_PP = PKX.getMovePP(pk5.Move4_PP, pk5.Move4_PPUps);

            // Disassociate Nature and PID
            pk5.Nature = (int)(pk5.PID % 0x19);

            // Delete Platinum/HGSS Met Location Data
            BitConverter.GetBytes((uint)0).CopyTo(pk5.Data, 0x44);

            // Met / Crown Data Detection
            pk5.Met_Location = pk5.FatefulEncounter && Array.IndexOf(new[] {251, 243, 244, 245}, pk5.Species) >= 0
                ? (pk5.Species == 251 ? 30010 : 30012) // Celebi : Beast
                : 30001; // Pokétransfer (not Crown)

            // Delete HGSS Data
            BitConverter.GetBytes((ushort)0).CopyTo(pk5.Data, 0x86);
            if (HGSSBall > 0 && HGSSBall != 4)
                pk5.Ball = HGSSBall;

            // Transfer Nickname and OT Name
            pk5.Nickname = Nickname;
            pk5.OT_Name = OT_Name;

            // Fix Level
            pk5.Met_Level = PKX.getLevel(pk5.Species, pk5.EXP);

            // Remove HM moves; Defog should be kept if both are learned.
            int[] banned = Moves.Contains(250) /*Whirlpool*/ && !Moves.Contains(432) /*Defog*/
                ? new[] {15, 19, 57, 70, 432, 249, 127, 431} // No Defog
                : new[] {15, 19, 57, 70, 250, 249, 127, 431};// No Whirlpool

            int[] newMoves = pk5.Moves;
            for (int i = 0; i < 4; i++)
                if (banned.Contains(newMoves[i]))
                    newMoves[i] = 0;
            pk5.Moves = newMoves;
            pk5.FixMoves();

            pk5.RefreshChecksum();
            return pk5;
        }
Exemplo n.º 2
0
Arquivo: Form1.cs Projeto: kwsch/pk2pk
        private void convert(string path)
        {
            FileInfo fi = new FileInfo(path);
            string filename = Path.GetFileNameWithoutExtension(path);
            string foldername = Path.GetDirectoryName(path);
            string extension = Path.GetExtension(path);
            long len = fi.Length;
            byte[] data;
            byte[] newdata = new byte[136];
            int game;

            if ((len == PK3.SIZE_STORED || len == PK3.SIZE_PARTY) && RB_I3.Checked)
            {
                game = 4;
                data = File.ReadAllBytes(path);
                if (!PKX.verifychk(data))
                    goto invalidchk;
                newdata = new PK3(data).convertToPK4().Data;
                if (RB_O5.Checked)
                {
                    newdata = new PK4(newdata).convertToPK5().Data;
                    game = 5;
                }
                else if (RB_O6.Checked)
                {
                    newdata = new PK4(newdata).convertToPK5().Data;
                    newdata = new PK5(newdata).convertToPK6().Data;
                    game = 6;
                }
            }
            else if ((len == PK4.SIZE_STORED || len == PK4.SIZE_PARTY) && RB_I4.Checked)
            {
                game = 5;
                data = File.ReadAllBytes(path);
                PKM.checkEncrypted(ref data);
                if (!PKX.verifychk(data))
                    goto invalidchk;
                newdata = new PK4(data).convertToPK5().Data;
                if (RB_O6.Checked)
                {
                    newdata = new PK5(newdata).convertToPK6().Data;
                    game = 6;
                }
            }
            else if ((len == PK5.SIZE_STORED || len == PK5.SIZE_PARTY) && RB_I5.Checked)
            {
                game = 6;
                data = File.ReadAllBytes(path);
                PKM.checkEncrypted(ref data);
                if (!PKX.verifychk(data))
                    goto invalidchk;
                if (BitConverter.ToUInt32(data, 0x44) != 0) // if PTHGSS met data exists
                    data = new PK4(data).convertToPK5().Data;

                newdata = new PK5(data).convertToPK6().Data;
            }
            else
            {
                RTB_Output.AppendText($"Invalid file supplied. ({filename}{extension})" + Environment.NewLine);
                goto quit;
            }

            invalidchk:
            {
                if (!PKX.verifychk(data))
                {
                    RTB_Output.AppendText($"Invalid checksum. Is the file encrypted? ({filename}{extension})" + Environment.NewLine);
                    goto quit;
                }
            }

            // Output
            string ext;
            if (RB_O6.Checked)
                ext = ".pk6";
            else if (RB_O5.Checked)
                ext = ".pk5";
            else ext = ".pk4";
            if (RB_PKM.Checked)
                ext = ".pkm";
            if (RB_PKM.Checked && RB_O6.Checked)
                ext = ".pkx";
            string newname = Path.Combine(foldername, filename + ext);
            if (newname == path)
                newname = Path.Combine(foldername, filename + " - " + game + "th" + ext);
            File.WriteAllBytes(newname,newdata);

            var pk6 = new PK6();
            if (game == 4)
                pk6 = new PK4(newdata).convertToPK5().convertToPK6();
            else if (game == 5)
                pk6 = new PK5(newdata).convertToPK6();
            else
                pk6 = new PK6(newdata);

            RTB_Output.AppendText(
                $"{pk6.Nickname} converted to Gen {game} @ {pk6.OT_Name} ({pk6.TID.ToString("00000")}/{pk6.SID.ToString("00000")}){Environment.NewLine}");
            quit:
            {
                RTB_Output.AppendText("----------" + Environment.NewLine);
                RTB_Output.SelectionStart = RTB_Output.Text.Length;
                RTB_Output.ScrollToCaret();
            }
        }