diff --git a/PKHeX.Core/Saves/Substructures/Gen7/GP1.cs b/PKHeX.Core/Saves/Substructures/Gen7/GP1.cs
index 308319056..986e3c231 100644
--- a/PKHeX.Core/Saves/Substructures/Gen7/GP1.cs
+++ b/PKHeX.Core/Saves/Substructures/Gen7/GP1.cs
@@ -23,6 +23,9 @@ namespace PKHeX.Core
return gpkm;
}
+ ///
+ /// First 0x20 bytes of an empty , all other bytes are 0.
+ ///
private static readonly byte[] Blank20 =
{
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
@@ -117,14 +120,15 @@ namespace PKHeX.Core
public string StatMove => $"{IV1:00}/{IV2:00}/{IV3:00}, Move1 {Move1}, Move2 {Move2}, CP={CP}";
public string Dump(IReadOnlyList speciesNames, int index) => $"{index:000} {Nickname} ({speciesNames[Species]}{FormString} {ShinyString}[{GenderString}]) @ lv{Level} - {StatMove}, {GeoTime}.";
- public PB7 ConvertToPB7(ITrainerInfo sav)
+ public PB7 ConvertToPB7(ITrainerInfo sav) => ConvertToPB7(sav, EncounterCriteria.Unrestricted);
+
+ public PB7 ConvertToPB7(ITrainerInfo sav, EncounterCriteria criteria)
{
var pk = new PB7
{
Version = (int) GameVersion.GO,
Species = Species,
AltForm = AltForm,
- Gender = Gender,
Met_Location = 50, // Go complex
Met_Year = Year - 2000,
Met_Month = Month,
@@ -136,7 +140,6 @@ namespace PKHeX.Core
OT_Name = sav.OT,
Ball = 4,
Language = sav.Language,
- Nature = Util.Rand.Next(25),
PID = Util.Rand32(),
};
@@ -156,7 +159,12 @@ namespace PKHeX.Core
pk.IV_HP = (IV1 * 2) + 1;
pk.IV_SPE = Util.Rand.Next(32);
- pk.RefreshAbility(Util.Rand.Next(2));
+ var pi = pk.PersonalInfo;
+ int av = 3;
+ pk.Gender = criteria.GetGender(Gender, pi);
+ pk.Nature = (int)criteria.GetNature(Nature.Random);
+ pk.RefreshAbility(criteria.GetAbility(av, pi));
+
if (IsShiny)
pk.SetShiny();
diff --git a/PKHeX.Core/Saves/Substructures/Gen7/QR7.cs b/PKHeX.Core/Saves/Substructures/Gen7/QR7.cs
index d48f34418..b45f53b08 100644
--- a/PKHeX.Core/Saves/Substructures/Gen7/QR7.cs
+++ b/PKHeX.Core/Saves/Substructures/Gen7/QR7.cs
@@ -1,5 +1,5 @@
using System;
-using System.Linq;
+using System.Collections.Generic;
namespace PKHeX.Core
{
@@ -15,24 +15,38 @@ namespace PKHeX.Core
// u16 crc16
// sizeof(QR7) == 0x1A2
+ ///
+ /// Generation 7 QR format (readable by the in-game QR Scanner feature)
+ ///
public static class QR7
{
- private static bool HasGenderDifferences(int species)
+ private static readonly HashSet GenderDifferences = new HashSet
{
- var gendered = new[]
- {
- 3, 12, 19, 20, 25, 26, 41, 42, 44, 45, 64, 65, 84, 85, 97, 111, 112, 118, 119, 123, 129, 130, 154, 165, 166,
- 178, 185, 186, 190, 194, 195, 198, 202, 203, 207, 208, 212, 214, 215, 217, 221, 224, 229, 232, 255, 256,
- 257, 267, 269, 272, 274, 275, 307, 308, 315, 316, 317, 322, 323, 332, 350, 369, 396, 397, 398, 399, 400,
- 401, 402, 403, 404, 405, 407, 415, 417, 418, 419, 424, 443, 444, 445, 449, 450, 453, 454, 456, 457, 459,
- 460, 461, 464, 465, 473, 521, 592, 593, 668, 678
- };
- return gendered.Contains(species);
- }
+ 003, 012, 019, 020, 025, 026, 041, 042, 044, 045,
+ 064, 065, 084, 085, 097, 111, 112, 118, 119, 123,
+ 129, 130, 154, 165, 166, 178, 185, 186, 190, 194,
+ 195, 198, 202, 203, 207, 208, 212, 214, 215, 217,
+ 221, 224, 229, 232, 255, 256, 257, 267, 269, 272,
+ 274, 275, 307, 308, 315, 316, 317, 322, 323, 332,
+ 350, 369, 396, 397, 398, 399, 400, 401, 402, 403,
+ 404, 405, 407, 415, 417, 418, 419, 424, 443, 444,
+ 445, 449, 450, 453, 454, 456, 457, 459, 460, 461,
+ 464, 465, 473, 521, 592, 593, 668, 678
+ };
+
+ private static readonly byte[] BaseQR =
+ {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
private static byte[] GetRawQR(int species, int formnum, bool shiny, int gender)
{
- var basedata = "FFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000D20200000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000".ToByteArray();
+ var basedata = (byte[])BaseQR.Clone();
BitConverter.GetBytes((ushort)species).CopyTo(basedata, 0x28);
basedata[0x2A] = (byte)formnum;
basedata[0x2C] = (byte)(shiny ? 1 : 0);
@@ -53,7 +67,7 @@ namespace PKHeX.Core
basedata[0x2B] = 2;
break;
default:
- basedata[0x2D] = (byte)(HasGenderDifferences(species) ? 0 : 1);
+ basedata[0x2D] = (byte)(GenderDifferences.Contains(species) ? 0 : 1);
basedata[0x2B] = (byte)gender;
break;
}