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