diff --git a/PKHeX.Core/MysteryGifts/WB7.cs b/PKHeX.Core/MysteryGifts/WB7.cs index 0b077f2ed..96575708d 100644 --- a/PKHeX.Core/MysteryGifts/WB7.cs +++ b/PKHeX.Core/MysteryGifts/WB7.cs @@ -365,25 +365,6 @@ public override PKM ConvertToPKM(ITrainerInfo SAV) EXP = Experience.GetEXP(currentLevel, Species, 0), - // Ribbons - RibbonCountry = RibbonCountry, - RibbonNational = RibbonNational, - - RibbonEarth = RibbonEarth, - RibbonWorld = RibbonWorld, - RibbonClassic = RibbonClassic, - RibbonPremier = RibbonPremier, - RibbonEvent = RibbonEvent, - RibbonBirthday = RibbonBirthday, - RibbonSpecial = RibbonSpecial, - RibbonSouvenir = RibbonSouvenir, - - RibbonWishing = RibbonWishing, - RibbonChampionBattle = RibbonChampionBattle, - RibbonChampionRegional = RibbonChampionRegional, - RibbonChampionNational = RibbonChampionNational, - RibbonChampionWorld = RibbonChampionWorld, - OT_Friendship = pi.BaseFriendship, FatefulEncounter = true, }; diff --git a/PKHeX.Core/PKM/PB7.cs b/PKHeX.Core/PKM/PB7.cs index 5cac7f580..65e92c600 100644 --- a/PKHeX.Core/PKM/PB7.cs +++ b/PKHeX.Core/PKM/PB7.cs @@ -1,18 +1,21 @@ using System; -using System.Linq; namespace PKHeX.Core { - /// - /// Notes about the next format - /// - public sealed class PB7 : PKM, IHyperTrain, IAwakened + /// Generation 7 format used for . + public sealed class PB7 : _K6, IHyperTrain, IAwakened { public static readonly byte[] Unused = { 0x2A, // Old Marking Value (PelagoEventStatus) - 0x36, 0x37, // Unused Ribbons - 0x58, 0x59, 0x73, 0x90, 0x91, 0x9E, 0x9F, 0xA0, 0xA1, 0xA7, 0xAA, 0xAB, 0xAC, 0xAD, 0xC8, 0xC9, 0xE4, 0xE5, 0xE6, 0xE7 + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, // Unused Ribbons + 0x58, 0x59, // Nickname Terminator + 0x73, + 0x90, 0x91, // HT Terminator + 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, // Old Geolocation/memories + 0xA7, 0xAA, 0xAB, + 0xAC, 0xAD, // Fatigue, no GUI editing + 0xC8, 0xC9, // OT Terminator }; public override byte[] ExtraBytes => Unused; @@ -47,11 +50,6 @@ protected override ushort CalculateChecksum() return chk; } - // Trash Bytes - public override byte[] Nickname_Trash { get => GetData(0x40, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0x40); } } - public override byte[] HT_Trash { get => GetData(0x78, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0x78); } } - public override byte[] OT_Trash { get => GetData(0xB0, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0xB0); } } - // Structure #region Block A public override uint EncryptionConstant @@ -129,71 +127,15 @@ public override uint PID public int AV_SPE { get => Data[0x27]; set => Data[0x27] = (byte)value; } public int AV_SPA { get => Data[0x28]; set => Data[0x28] = (byte)value; } public int AV_SPD { get => Data[0x29]; set => Data[0x29] = (byte)value; } - public byte ResortEventStatus { get => Data[0x2A]; set => Data[0x2A] = value; } + public byte _0x2A { get => Data[0x2A]; set => Data[0x2A] = value; } private byte PKRS { get => Data[0x2B]; set => Data[0x2B] = value; } public override int PKRS_Days { get => PKRS & 0xF; set => PKRS = (byte)((PKRS & ~0xF) | value); } public override int PKRS_Strain { get => PKRS >> 4; set => PKRS = (byte)((PKRS & 0xF) | value << 4); } public float HeightAbsolute { get => BitConverter.ToSingle(Data, 0x2C); set => BitConverter.GetBytes(value).CopyTo(Data, 0x2C); } private uint RIB0 { get => BitConverter.ToUInt32(Data, 0x30); set => BitConverter.GetBytes(value).CopyTo(Data, 0x30); } private uint RIB1 { get => BitConverter.ToUInt32(Data, 0x34); set => BitConverter.GetBytes(value).CopyTo(Data, 0x34); } - public bool RibbonChampionKalos { get => (RIB0 & (1 << 00)) == 1 << 00; set => RIB0 = ((RIB0 & ~(1u << 00)) | (value ? 1u << 00 : 0)); } - public bool RibbonChampionG3Hoenn { get => (RIB0 & (1 << 01)) == 1 << 01; set => RIB0 = ((RIB0 & ~(1u << 01)) | (value ? 1u << 01 : 0)); } - public bool RibbonChampionSinnoh { get => (RIB0 & (1 << 02)) == 1 << 02; set => RIB0 = ((RIB0 & ~(1u << 02)) | (value ? 1u << 02 : 0)); } - public bool RibbonBestFriends { get => (RIB0 & (1 << 03)) == 1 << 03; set => RIB0 = ((RIB0 & ~(1u << 03)) | (value ? 1u << 03 : 0)); } - public bool RibbonTraining { get => (RIB0 & (1 << 04)) == 1 << 04; set => RIB0 = ((RIB0 & ~(1u << 04)) | (value ? 1u << 04 : 0)); } - public bool RibbonBattlerSkillful { get => (RIB0 & (1 << 05)) == 1 << 05; set => RIB0 = ((RIB0 & ~(1u << 05)) | (value ? 1u << 05 : 0)); } - public bool RibbonBattlerExpert { get => (RIB0 & (1 << 06)) == 1 << 06; set => RIB0 = ((RIB0 & ~(1u << 06)) | (value ? 1u << 06 : 0)); } - public bool RibbonEffort { get => (RIB0 & (1 << 07)) == 1 << 07; set => RIB0 = ((RIB0 & ~(1u << 07)) | (value ? 1u << 07 : 0)); } - public bool RibbonAlert { get => (RIB0 & (1 << 08)) == 1 << 08; set => RIB0 = ((RIB0 & ~(1u << 08)) | (value ? 1u << 08 : 0)); } - public bool RibbonShock { get => (RIB0 & (1 << 09)) == 1 << 09; set => RIB0 = ((RIB0 & ~(1u << 09)) | (value ? 1u << 09 : 0)); } - public bool RibbonDowncast { get => (RIB0 & (1 << 10)) == 1 << 10; set => RIB0 = ((RIB0 & ~(1u << 10)) | (value ? 1u << 10 : 0)); } - public bool RibbonCareless { get => (RIB0 & (1 << 11)) == 1 << 11; set => RIB0 = ((RIB0 & ~(1u << 11)) | (value ? 1u << 11 : 0)); } - public bool RibbonRelax { get => (RIB0 & (1 << 12)) == 1 << 12; set => RIB0 = ((RIB0 & ~(1u << 12)) | (value ? 1u << 12 : 0)); } - public bool RibbonSnooze { get => (RIB0 & (1 << 13)) == 1 << 13; set => RIB0 = ((RIB0 & ~(1u << 13)) | (value ? 1u << 13 : 0)); } - public bool RibbonSmile { get => (RIB0 & (1 << 14)) == 1 << 14; set => RIB0 = ((RIB0 & ~(1u << 14)) | (value ? 1u << 14 : 0)); } - public bool RibbonGorgeous { get => (RIB0 & (1 << 15)) == 1 << 15; set => RIB0 = ((RIB0 & ~(1u << 15)) | (value ? 1u << 15 : 0)); } - public bool RibbonRoyal { get => (RIB0 & (1 << 16)) == 1 << 16; set => RIB0 = ((RIB0 & ~(1u << 16)) | (value ? 1u << 16 : 0)); } - public bool RibbonGorgeousRoyal { get => (RIB0 & (1 << 17)) == 1 << 17; set => RIB0 = ((RIB0 & ~(1u << 17)) | (value ? 1u << 17 : 0)); } - public bool RibbonArtist { get => (RIB0 & (1 << 18)) == 1 << 18; set => RIB0 = ((RIB0 & ~(1u << 18)) | (value ? 1u << 18 : 0)); } - public bool RibbonFootprint { get => (RIB0 & (1 << 19)) == 1 << 19; set => RIB0 = ((RIB0 & ~(1u << 19)) | (value ? 1u << 19 : 0)); } - public bool RibbonRecord { get => (RIB0 & (1 << 20)) == 1 << 20; set => RIB0 = ((RIB0 & ~(1u << 20)) | (value ? 1u << 20 : 0)); } - public bool RibbonLegend { get => (RIB0 & (1 << 21)) == 1 << 21; set => RIB0 = ((RIB0 & ~(1u << 21)) | (value ? 1u << 21 : 0)); } - public bool RibbonCountry { get => (RIB0 & (1 << 22)) == 1 << 22; set => RIB0 = ((RIB0 & ~(1u << 22)) | (value ? 1u << 22 : 0)); } - public bool RibbonNational { get => (RIB0 & (1 << 23)) == 1 << 23; set => RIB0 = ((RIB0 & ~(1u << 23)) | (value ? 1u << 23 : 0)); } - public bool RibbonEarth { get => (RIB0 & (1 << 24)) == 1 << 24; set => RIB0 = ((RIB0 & ~(1u << 24)) | (value ? 1u << 24 : 0)); } - public bool RibbonWorld { get => (RIB0 & (1 << 25)) == 1 << 25; set => RIB0 = ((RIB0 & ~(1u << 25)) | (value ? 1u << 25 : 0)); } - public bool RibbonClassic { get => (RIB0 & (1 << 26)) == 1 << 26; set => RIB0 = ((RIB0 & ~(1u << 26)) | (value ? 1u << 26 : 0)); } - public bool RibbonPremier { get => (RIB0 & (1 << 27)) == 1 << 27; set => RIB0 = ((RIB0 & ~(1u << 27)) | (value ? 1u << 27 : 0)); } - public bool RibbonEvent { get => (RIB0 & (1 << 28)) == 1 << 28; set => RIB0 = ((RIB0 & ~(1u << 28)) | (value ? 1u << 28 : 0)); } - public bool RibbonBirthday { get => (RIB0 & (1 << 29)) == 1 << 29; set => RIB0 = ((RIB0 & ~(1u << 29)) | (value ? 1u << 29 : 0)); } - public bool RibbonSpecial { get => (RIB0 & (1 << 30)) == 1 << 30; set => RIB0 = ((RIB0 & ~(1u << 30)) | (value ? 1u << 30 : 0)); } - public bool RibbonSouvenir { get => (RIB0 & (1 << 31)) == 1 << 31; set => RIB0 = ((RIB0 & ~(1u << 31)) | (value ? 1u << 31 : 0)); } - public bool RibbonWishing { get => (RIB1 & (1 << 00)) == 1 << 00; set => RIB1 = ((RIB1 & ~(1u << 00)) | (value ? 1u << 00 : 0)); } - public bool RibbonChampionBattle { get => (RIB1 & (1 << 01)) == 1 << 01; set => RIB1 = ((RIB1 & ~(1u << 01)) | (value ? 1u << 01 : 0)); } - public bool RibbonChampionRegional { get => (RIB1 & (1 << 02)) == 1 << 02; set => RIB1 = ((RIB1 & ~(1u << 02)) | (value ? 1u << 02 : 0)); } - public bool RibbonChampionNational { get => (RIB1 & (1 << 03)) == 1 << 03; set => RIB1 = ((RIB1 & ~(1u << 03)) | (value ? 1u << 03 : 0)); } - public bool RibbonChampionWorld { get => (RIB1 & (1 << 04)) == 1 << 04; set => RIB1 = ((RIB1 & ~(1u << 04)) | (value ? 1u << 04 : 0)); } - public bool RIB4_5 { get => (RIB1 & (1 << 05)) == 1 << 05; set => RIB1 = ((RIB1 & ~(1u << 05)) | (value ? 1u << 05 : 0)); } // Unused - public bool RIB4_6 { get => (RIB1 & (1 << 06)) == 1 << 06; set => RIB1 = ((RIB1 & ~(1u << 06)) | (value ? 1u << 06 : 0)); } // Unused - public bool RibbonChampionG6Hoenn { get => (RIB1 & (1 << 07)) == 1 << 07; set => RIB1 = ((RIB1 & ~(1u << 07)) | (value ? 1u << 07 : 0)); } - public bool RibbonContestStar { get => (RIB1 & (1 << 08)) == 1 << 08; set => RIB1 = ((RIB1 & ~(1u << 08)) | (value ? 1u << 08 : 0)); } - public bool RibbonMasterCoolness { get => (RIB1 & (1 << 09)) == 1 << 09; set => RIB1 = ((RIB1 & ~(1u << 09)) | (value ? 1u << 09 : 0)); } - public bool RibbonMasterBeauty { get => (RIB1 & (1 << 10)) == 1 << 10; set => RIB1 = ((RIB1 & ~(1u << 10)) | (value ? 1u << 10 : 0)); } - public bool RibbonMasterCuteness { get => (RIB1 & (1 << 11)) == 1 << 11; set => RIB1 = ((RIB1 & ~(1u << 11)) | (value ? 1u << 11 : 0)); } - public bool RibbonMasterCleverness { get => (RIB1 & (1 << 12)) == 1 << 12; set => RIB1 = ((RIB1 & ~(1u << 12)) | (value ? 1u << 12 : 0)); } - public bool RibbonMasterToughness { get => (RIB1 & (1 << 13)) == 1 << 13; set => RIB1 = ((RIB1 & ~(1u << 13)) | (value ? 1u << 13 : 0)); } - public bool RibbonChampionAlola { get => (RIB1 & (1 << 14)) == 1 << 14; set => RIB1 = ((RIB1 & ~(1u << 14)) | (value ? 1u << 14 : 0)); } - public bool RibbonBattleRoyale { get => (RIB1 & (1 << 15)) == 1 << 15; set => RIB1 = ((RIB1 & ~(1u << 15)) | (value ? 1u << 15 : 0)); } - public bool RibbonBattleTreeGreat { get => (RIB1 & (1 << 16)) == 1 << 16; set => RIB1 = ((RIB1 & ~(1u << 16)) | (value ? 1u << 16 : 0)); } - public bool RibbonBattleTreeMaster { get => (RIB1 & (1 << 17)) == 1 << 17; set => RIB1 = ((RIB1 & ~(1u << 17)) | (value ? 1u << 17 : 0)); } - public bool RIB6_2 { get => (RIB1 & (1 << 18)) == 1 << 18; set => RIB1 = ((RIB1 & ~(1u << 18)) | (value ? 1u << 18 : 0)); } // Unused - public bool RIB6_3 { get => (RIB1 & (1 << 19)) == 1 << 19; set => RIB1 = ((RIB1 & ~(1u << 19)) | (value ? 1u << 19 : 0)); } // Unused - public bool RIB6_4 { get => (RIB1 & (1 << 20)) == 1 << 20; set => RIB1 = ((RIB1 & ~(1u << 20)) | (value ? 1u << 20 : 0)); } // Unused - public bool RIB6_5 { get => (RIB1 & (1 << 21)) == 1 << 21; set => RIB1 = ((RIB1 & ~(1u << 21)) | (value ? 1u << 21 : 0)); } // Unused - public bool RIB6_6 { get => (RIB1 & (1 << 22)) == 1 << 22; set => RIB1 = ((RIB1 & ~(1u << 22)) | (value ? 1u << 22 : 0)); } // Unused - public bool RIB6_7 { get => (RIB1 & (1 << 23)) == 1 << 23; set => RIB1 = ((RIB1 & ~(1u << 23)) | (value ? 1u << 23 : 0)); } // Unused - public int RibbonCountMemoryContest { get => Data[0x38]; set => Data[0x38] = (byte)value; } - public int RibbonCountMemoryBattle { get => Data[0x39]; set => Data[0x39] = (byte)value; } + public byte _0x38 { get => Data[0x38]; set => Data[0x38] = value; } + public byte _0x39 { get => Data[0x39]; set => Data[0x39] = value; } public int HeightScalar { get => Data[0x3A]; set => Data[0x3A] = (byte)value; } public int WeightScalar { get => Data[0x3B]; set => Data[0x3B] = (byte)value; } public uint FormDuration { get => BitConverter.ToUInt32(Data, 0x3C); set => BitConverter.GetBytes(value).CopyTo(Data, 0x3C); } @@ -278,16 +220,16 @@ public override int RelearnMove4 public override string HT_Name { get => GetString(0x78, 24); set => SetString(value, 12).CopyTo(Data, 0x78); } public override int HT_Gender { get => Data[0x92]; set => Data[0x92] = (byte)value; } public override int CurrentHandler { get => Data[0x93]; set => Data[0x93] = (byte)value; } - public int Geo1_Region { get => Data[0x94]; set => Data[0x94] = (byte)value; } - public int Geo1_Country { get => Data[0x95]; set => Data[0x95] = (byte)value; } - public int Geo2_Region { get => Data[0x96]; set => Data[0x96] = (byte)value; } - public int Geo2_Country { get => Data[0x97]; set => Data[0x97] = (byte)value; } - public int Geo3_Region { get => Data[0x98]; set => Data[0x98] = (byte)value; } - public int Geo3_Country { get => Data[0x99]; set => Data[0x99] = (byte)value; } - public int Geo4_Region { get => Data[0x9A]; set => Data[0x9A] = (byte)value; } - public int Geo4_Country { get => Data[0x9B]; set => Data[0x9B] = (byte)value; } - public int Geo5_Region { get => Data[0x9C]; set => Data[0x9C] = (byte)value; } - public int Geo5_Country { get => Data[0x9D]; set => Data[0x9D] = (byte)value; } + public byte _0x94 { get => Data[0x94]; set => Data[0x94] = value; } + public byte _0x95 { get => Data[0x95]; set => Data[0x95] = value; } + public byte _0x96 { get => Data[0x96]; set => Data[0x96] = value; } + public byte _0x97 { get => Data[0x97]; set => Data[0x97] = value; } + public byte _0x98 { get => Data[0x98]; set => Data[0x98] = value; } + public byte _0x99 { get => Data[0x99]; set => Data[0x99] = value; } + public byte _0x9A { get => Data[0x9A]; set => Data[0x9A] = value; } + public byte _0x9B { get => Data[0x9B]; set => Data[0x9B] = value; } + public byte _0x9C { get => Data[0x9C]; set => Data[0x9C] = value; } + public byte _0x9D { get => Data[0x9D]; set => Data[0x9D] = value; } public byte _0x9E { get => Data[0x9E]; set => Data[0x9E] = value; } public byte _0x9F { get => Data[0x9F]; set => Data[0x9F] = value; } public byte _0xA0 { get => Data[0xA0]; set => Data[0xA0] = value; } @@ -360,44 +302,6 @@ public override int RelearnMove4 // 102/103 unused #endregion - // Simple Generated Attributes - public override int CurrentFriendship - { - get => CurrentHandler == 0 ? OT_Friendship : HT_Friendship; - set { if (CurrentHandler == 0) OT_Friendship = value; else HT_Friendship = value; } - } - - public int OppositeFriendship - { - get => CurrentHandler == 1 ? OT_Friendship : HT_Friendship; - set { if (CurrentHandler == 1) OT_Friendship = value; else HT_Friendship = value; } - } - - public override int PSV => (int)((PID >> 16 ^ (PID & 0xFFFF)) >> 4); - public override int TSV => (TID ^ SID) >> 4; - public bool IsUntradedEvent6 => Geo1_Country == 0 && Geo1_Region == 0 && Met_Location / 10000 == 4 && Gen6; - public override bool IsUntraded => Data[0x78] == 0 && Data[0x78 + 1] == 0 && Format == GenNumber; // immediately terminated HT_Name data (\0) - - // Complex Generated Attributes - public override int Characteristic - { - get - { - // Characteristic with EC%6 - int pm6 = (int)(EncryptionConstant % 6); // EC MOD 6 - int maxIV = IVs.Max(); - int pm6stat = 0; - - for (int i = 0; i < 6; i++) - { - if (IVs[pm6stat = pm6++ % 6] == maxIV) - break; - } - - return (pm6stat * 5) + (maxIV % 5); - } - } - public override int[] Markings { get @@ -419,95 +323,7 @@ public override int[] Markings } } - // Methods - protected override byte[] Encrypt() - { - RefreshChecksum(); - return PKX.EncryptArray(Data); - } - - // General User-error Fixes - public void FixRelearn() - { - while (true) - { - if (RelearnMove4 != 0 && RelearnMove3 == 0) - { - RelearnMove3 = RelearnMove4; - RelearnMove4 = 0; - } - if (RelearnMove3 != 0 && RelearnMove2 == 0) - { - RelearnMove2 = RelearnMove3; - RelearnMove3 = 0; - continue; - } - if (RelearnMove2 != 0 && RelearnMove1 == 0) - { - RelearnMove1 = RelearnMove2; - RelearnMove2 = 0; - continue; - } - break; - } - } - - public void FixMemories() - { - if (IsUntraded) - HT_Friendship = HT_Affection = HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = 0; - - Geo1_Region = Geo1_Country > 0 ? Geo1_Region : 0; - Geo2_Region = Geo2_Country > 0 ? Geo2_Region : 0; - Geo3_Region = Geo3_Country > 0 ? Geo3_Region : 0; - Geo4_Region = Geo4_Country > 0 ? Geo4_Region : 0; - Geo5_Region = Geo5_Country > 0 ? Geo5_Region : 0; - - while (true) - { - if (Geo5_Country != 0 && Geo4_Country == 0) - { - Geo4_Country = Geo5_Country; - Geo4_Region = Geo5_Region; - Geo5_Country = Geo5_Region = 0; - } - if (Geo4_Country != 0 && Geo3_Country == 0) - { - Geo3_Country = Geo4_Country; - Geo3_Region = Geo4_Region; - Geo4_Country = Geo4_Region = 0; - continue; - } - if (Geo3_Country != 0 && Geo2_Country == 0) - { - Geo2_Country = Geo3_Country; - Geo2_Region = Geo3_Region; - Geo3_Country = Geo3_Region = 0; - continue; - } - if (Geo2_Country != 0 && Geo1_Country == 0) - { - Geo1_Country = Geo2_Country; - Geo1_Region = Geo2_Region; - Geo2_Country = Geo2_Region = 0; - continue; - } - break; - } - } - - // Synthetic Trading Logic - public void Trade(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_GENDER, int Day = 1, int Month = 1, int Year = 2015) - { - // Eggs do not have any modifications done if they are traded - if (IsEgg && !(SAV_Trainer == OT_Name && SAV_TID == TID && SAV_SID == SID && SAV_GENDER == OT_Gender)) - SetLinkTradeEgg(Day, Month, Year); - // Process to the HT if the OT of the Pokémon does not match the SAV's OT info. - else if (!TradeOT(SAV_Trainer, SAV_TID, SAV_SID, SAV_GENDER)) - TradeHT(SAV_Trainer, SAV_GENDER); - } - - private bool TradeOT(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_GENDER) + protected override bool TradeOT(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank) { // Check to see if the OT matches the SAV's OT info. if (!(SAV_Trainer == OT_Name && SAV_TID == TID && SAV_SID == SID && SAV_GENDER == OT_Gender)) @@ -517,7 +333,7 @@ private bool TradeOT(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_GENDE return true; } - private void TradeHT(string SAV_Trainer, int SAV_GENDER) + protected override void TradeHT(string SAV_Trainer, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank) { CurrentHandler = 1; if (HT_Name != SAV_Trainer) @@ -529,10 +345,11 @@ private void TradeHT(string SAV_Trainer, int SAV_GENDER) HT_Gender = SAV_GENDER; } - // Legality Properties - public override bool WasLink => Met_Location == 30011; - public override bool WasEvent => (Met_Location > 40000 && Met_Location < 50000) || FatefulEncounter; - public override bool WasEventEgg => GenNumber < 5 ? base.WasEventEgg : ((Egg_Location > 40000 && Egg_Location < 50000) || (FatefulEncounter && Egg_Location == 30002)) && Met_Level == 1; + public void FixMemories() + { + if (IsUntraded) + HT_Friendship = HT_Affection = HT_TextVar = HT_Memory = HT_Intensity = HT_Feeling = 0; + } // Maximums public override int MaxMoveID => Legal.MaxMoveID_7b; @@ -541,10 +358,6 @@ private void TradeHT(string SAV_Trainer, int SAV_GENDER) public override int MaxItemID => Legal.MaxItemID_7_USUM; public override int MaxBallID => Legal.MaxBallID_7; public override int MaxGameID => Legal.MaxGameID_7b; - public override int MaxIV => 31; - public override int MaxEV => 252; - public override int OTLength => 12; - public override int NickLength => 12; public override ushort[] GetStats(PersonalInfo p) => CalculateStatsBeluga(p); @@ -594,7 +407,7 @@ private static int GetStat(int baseStat, int iv, int level, int nature, int stat private static int AmplifyStat(int nature, int index, int initial) { - switch (AbilityAmpTable[(5 * nature) + index]) + switch (GetNatureAmp(nature, index)) { case 1: return 110 * initial / 100; // 110% case -1: return 90 * initial / 100; // 90% @@ -602,7 +415,14 @@ private static int AmplifyStat(int nature, int index, int initial) } } - private static readonly sbyte[] AbilityAmpTable = + private static sbyte GetNatureAmp(int nature, int index) + { + if ((uint) nature >= 25) + return -1; + return NatureAmpTable[(5 * nature) + index]; + } + + private static readonly sbyte[] NatureAmpTable = { 0, 0, 0, 0, 0, // Hardy 1,-1, 0, 0, 0, // Lonely diff --git a/PKHeX.Core/PKM/PK6.cs b/PKHeX.Core/PKM/PK6.cs index 3f80ae53b..698b6a63b 100644 --- a/PKHeX.Core/PKM/PK6.cs +++ b/PKHeX.Core/PKM/PK6.cs @@ -1,10 +1,9 @@ using System; -using System.Linq; namespace PKHeX.Core { /// Generation 6 format. - public sealed class PK6 : PKM, IRibbonSetEvent3, IRibbonSetEvent4, IRibbonSetCommon3, IRibbonSetCommon4, IRibbonSetCommon6, IContestStats, IGeoTrack + public sealed class PK6 : _K6, IRibbonSetEvent3, IRibbonSetEvent4, IRibbonSetCommon3, IRibbonSetCommon4, IRibbonSetCommon6, IContestStats, IGeoTrack { private static readonly byte[] Unused = { @@ -13,9 +12,6 @@ public sealed class PK6 : PKM, IRibbonSetEvent3, IRibbonSetEvent4, IRibbonSetCom }; public override byte[] ExtraBytes => Unused; - - public override int SIZE_PARTY => PKX.SIZE_6PARTY; - public override int SIZE_STORED => PKX.SIZE_6STORED; public override int Format => 6; public override PersonalInfo PersonalInfo => PersonalTable.AO.GetFormeEntry(Species, AltForm); @@ -35,11 +31,6 @@ public PK6(byte[] decryptedData, string ident = null) private string GetString(int Offset, int Count) => StringConverter.GetString6(Data, Offset, Count); private byte[] SetString(string value, int maxLength) => StringConverter.SetString6(value, maxLength); - // Trash Bytes - public override byte[] Nickname_Trash { get => GetData(0x40, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0x40); } } - public override byte[] HT_Trash { get => GetData(0x78, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0x78); } } - public override byte[] OT_Trash { get => GetData(0xB0, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0xB0); } } - // Structure #region Block A public override uint EncryptionConstant @@ -370,19 +361,6 @@ public override int RelearnMove4 public override int Stat_SPD { get => BitConverter.ToUInt16(Data, 0xFC); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0xFC); } #endregion - // Simple Generated Attributes - public override int CurrentFriendship - { - get => CurrentHandler == 0 ? OT_Friendship : HT_Friendship; - set { if (CurrentHandler == 0) OT_Friendship = value; else HT_Friendship = value; } - } - - public int OppositeFriendship - { - get => CurrentHandler == 1 ? OT_Friendship : HT_Friendship; - set { if (CurrentHandler == 1) OT_Friendship = value; else HT_Friendship = value; } - } - public override int SuperTrainingMedalCount(int maxCount = 30) { uint value = BitConverter.ToUInt32(Data, 0x2C); @@ -398,64 +376,10 @@ public override int SuperTrainingMedalCount(int maxCount = 30) return TrainCount; } - public override int PSV => (int)((PID >> 16 ^ (PID & 0xFFFF)) >> 4); - public override int TSV => (TID ^ SID) >> 4; public bool IsUntradedEvent6 => Geo1_Country == 0 && Geo1_Region == 0 && Met_Location / 10000 == 4 && Gen6; - public override bool IsUntraded => Data[0x78] == 0 && Data[0x78 + 1] == 0 && Format == GenNumber; // immediately terminated HT_Name data (\0) // Complex Generated Attributes - public override int Characteristic - { - get - { - // Characteristic with EC%6 - int pm6 = (int)(EncryptionConstant % 6); // EC MOD 6 - int maxIV = IVs.Max(); - int pm6stat = 0; - - for (int i = 0; i < 6; i++) - { - if (IVs[pm6stat = pm6++ % 6] == maxIV) - break; - } - return (pm6stat * 5) + (maxIV % 5); - } - } - - // Methods - protected override byte[] Encrypt() - { - RefreshChecksum(); - return PKX.EncryptArray(Data); - } - - // General User-error Fixes - public void FixRelearn() - { - while (true) - { - if (RelearnMove4 != 0 && RelearnMove3 == 0) - { - RelearnMove3 = RelearnMove4; - RelearnMove4 = 0; - } - if (RelearnMove3 != 0 && RelearnMove2 == 0) - { - RelearnMove2 = RelearnMove3; - RelearnMove3 = 0; - continue; - } - if (RelearnMove2 != 0 && RelearnMove1 == 0) - { - RelearnMove1 = RelearnMove2; - RelearnMove2 = 0; - continue; - } - break; - } - } - public void FixMemories() { if (IsEgg) // No memories if is egg. @@ -478,18 +402,7 @@ public void FixMemories() this.SanitizeGeoLocationData(); } - // Synthetic Trading Logic - public void Trade(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank, int Day = 1, int Month = 1, int Year = 2015) - { - // Eggs do not have any modifications done if they are traded - if (IsEgg && !(SAV_Trainer == OT_Name && SAV_TID == TID && SAV_SID == SID && SAV_GENDER == OT_Gender)) - SetLinkTradeEgg(Day, Month, Year); - // Process to the HT if the OT of the Pokémon does not match the SAV's OT info. - else if (!TradeOT(SAV_Trainer, SAV_TID, SAV_SID, SAV_COUNTRY, SAV_REGION, SAV_GENDER)) - TradeHT(SAV_Trainer, SAV_COUNTRY, SAV_REGION, SAV_GENDER, Bank); - } - - private bool TradeOT(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER) + protected override bool TradeOT(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank) { // Check to see if the OT matches the SAV's OT info. if (!(SAV_Trainer == OT_Name && SAV_TID == TID && SAV_SID == SID && SAV_GENDER == OT_Gender)) @@ -502,7 +415,7 @@ private bool TradeOT(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_COUNT return true; } - private void TradeHT(string SAV_Trainer, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank) + protected override void TradeHT(string SAV_Trainer, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank) { if (SAV_Trainer != HT_Name || SAV_GENDER != HT_Gender || (Geo1_Country == 0 && Geo1_Region == 0 && !IsUntradedEvent6)) this.TradeGeoLocation(SAV_COUNTRY, SAV_REGION); @@ -520,19 +433,6 @@ private void TradeHT(string SAV_Trainer, int SAV_COUNTRY, int SAV_REGION, int SA if (HT_Memory == 0) TradeMemory(Bank); } - // Misc Updates - public void TradeMemory(bool Bank) - { - HT_Memory = 4; // Link trade to [VAR: General Location] - HT_TextVar = Bank ? 0 : 9; // Somewhere (Bank) : Pokécenter (Trade) - HT_Intensity = 1; - HT_Feeling = Memories.GetRandomFeeling(HT_Memory, Bank ? 10 : 20); // 0-9 Bank, 0-19 Trade - } - - // Legality Properties - public override bool WasLink => Met_Location == 30011; - public override bool WasEvent => (Met_Location > 40000 && Met_Location < 50000) || FatefulEncounter; - public override bool WasEventEgg => GenNumber < 5 ? base.WasEventEgg : ((Egg_Location > 40000 && Egg_Location < 50000) || (FatefulEncounter && Egg_Location == 30002)) && Met_Level == 1; // Maximums public override int MaxMoveID => Legal.MaxMoveID_6_AO; @@ -541,10 +441,6 @@ public void TradeMemory(bool Bank) public override int MaxItemID => Legal.MaxItemID_6_AO; public override int MaxBallID => Legal.MaxBallID_6; public override int MaxGameID => Legal.MaxGameID_6; // OR - public override int MaxIV => 31; - public override int MaxEV => 252; - public override int OTLength => 12; - public override int NickLength => 12; public PK7 ConvertToPK7() { diff --git a/PKHeX.Core/PKM/PK7.cs b/PKHeX.Core/PKM/PK7.cs index e107e0375..daae22064 100644 --- a/PKHeX.Core/PKM/PK7.cs +++ b/PKHeX.Core/PKM/PK7.cs @@ -1,10 +1,9 @@ using System; -using System.Linq; namespace PKHeX.Core { /// Generation 7 format. - public sealed class PK7 : PKM, IRibbonSetEvent3, IRibbonSetEvent4, IRibbonSetCommon3, IRibbonSetCommon4, IRibbonSetCommon6, IRibbonSetCommon7, IContestStats, IHyperTrain, IGeoTrack + public sealed class PK7 : _K6, IRibbonSetEvent3, IRibbonSetEvent4, IRibbonSetCommon3, IRibbonSetCommon4, IRibbonSetCommon6, IRibbonSetCommon7, IContestStats, IHyperTrain, IGeoTrack { private static readonly byte[] Unused = { @@ -14,9 +13,6 @@ public sealed class PK7 : PKM, IRibbonSetEvent3, IRibbonSetEvent4, IRibbonSetCom }; public override byte[] ExtraBytes => Unused; - - public override int SIZE_PARTY => PKX.SIZE_6PARTY; - public override int SIZE_STORED => PKX.SIZE_6STORED; public override int Format => 7; public override PersonalInfo PersonalInfo => PersonalTable.USUM.GetFormeEntry(Species, AltForm); @@ -36,11 +32,6 @@ public PK7(byte[] decryptedData, string ident = null) private string GetString(int Offset, int Count) => StringConverter.GetString7(Data, Offset, Count); private byte[] SetString(string value, int maxLength, bool chinese = false) => StringConverter.SetString7(value, maxLength, Language, chinese: chinese); - // Trash Bytes - public override byte[] Nickname_Trash { get => GetData(0x40, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0x40); } } - public override byte[] HT_Trash { get => GetData(0x78, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0x78); } } - public override byte[] OT_Trash { get => GetData(0xB0, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0xB0); } } - // Structure #region Block A public override uint EncryptionConstant @@ -403,19 +394,6 @@ public override int RelearnMove4 public override int Stat_SPD { get => BitConverter.ToUInt16(Data, 0xFC); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0xFC); } #endregion - // Simple Generated Attributes - public override int CurrentFriendship - { - get => CurrentHandler == 0 ? OT_Friendship : HT_Friendship; - set { if (CurrentHandler == 0) OT_Friendship = value; else HT_Friendship = value; } - } - - public int OppositeFriendship - { - get => CurrentHandler == 1 ? OT_Friendship : HT_Friendship; - set { if (CurrentHandler == 1) OT_Friendship = value; else HT_Friendship = value; } - } - public override int SuperTrainingMedalCount(int maxCount = 30) { uint value = BitConverter.ToUInt32(Data, 0x2C); @@ -431,29 +409,7 @@ public override int SuperTrainingMedalCount(int maxCount = 30) return TrainCount; } - public override int PSV => (int)((PID >> 16 ^ (PID & 0xFFFF)) >> 4); - public override int TSV => (TID ^ SID) >> 4; public bool IsUntradedEvent6 => Geo1_Country == 0 && Geo1_Region == 0 && Met_Location / 10000 == 4 && Gen6; - public override bool IsUntraded => Data[0x78] == 0 && Data[0x78 + 1] == 0 && Format == GenNumber; // immediately terminated HT_Name data (\0) - - // Complex Generated Attributes - public override int Characteristic - { - get - { - // Characteristic with EC%6 - int pm6 = (int)(EncryptionConstant % 6); // EC MOD 6 - int maxIV = IVs.Max(); - int pm6stat = 0; - - for (int i = 0; i < 6; i++) - { - if (IVs[pm6stat = pm6++ % 6] == maxIV) - break; - } - return (pm6stat * 5) + (maxIV % 5); - } - } public override int[] Markings { @@ -476,39 +432,6 @@ public override int[] Markings } } - // Methods - protected override byte[] Encrypt() - { - RefreshChecksum(); - return PKX.EncryptArray(Data); - } - - // General User-error Fixes - public void FixRelearn() - { - while (true) - { - if (RelearnMove4 != 0 && RelearnMove3 == 0) - { - RelearnMove3 = RelearnMove4; - RelearnMove4 = 0; - } - if (RelearnMove3 != 0 && RelearnMove2 == 0) - { - RelearnMove2 = RelearnMove3; - RelearnMove3 = 0; - continue; - } - if (RelearnMove2 != 0 && RelearnMove1 == 0) - { - RelearnMove1 = RelearnMove2; - RelearnMove2 = 0; - continue; - } - break; - } - } - public void FixMemories() { if (IsEgg) // No memories if is egg. @@ -536,18 +459,7 @@ public void FixMemories() } } - // Synthetic Trading Logic - public void Trade(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank, int Day = 1, int Month = 1, int Year = 2015) - { - // Eggs do not have any modifications done if they are traded - if (IsEgg && !(SAV_Trainer == OT_Name && SAV_TID == TID && SAV_SID == SID && SAV_GENDER == OT_Gender)) - SetLinkTradeEgg(Day, Month, Year); - // Process to the HT if the OT of the Pokémon does not match the SAV's OT info. - else if (!TradeOT(SAV_Trainer, SAV_TID, SAV_SID, SAV_COUNTRY, SAV_REGION, SAV_GENDER, Bank)) - TradeHT(SAV_Trainer, SAV_COUNTRY, SAV_REGION, SAV_GENDER, Bank); - } - - private bool TradeOT(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank) + protected override bool TradeOT(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank) { // Check to see if the OT matches the SAV's OT info. if (!(SAV_Trainer == OT_Name && SAV_TID == TID && SAV_SID == SID && SAV_GENDER == OT_Gender)) @@ -560,7 +472,7 @@ private bool TradeOT(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_COUNT return true; } - private void TradeHT(string SAV_Trainer, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank) + protected override void TradeHT(string SAV_Trainer, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank) { if (SAV_Trainer != HT_Name || SAV_GENDER != HT_Gender || (Geo1_Country == 0 && Geo1_Region == 0 && !IsUntradedEvent6)) { @@ -582,23 +494,14 @@ private void TradeHT(string SAV_Trainer, int SAV_COUNTRY, int SAV_REGION, int SA if (HT_Memory == 0) TradeMemory(Bank); } + // Misc Updates - public void TradeMemory(bool Bank) + public override void TradeMemory(bool Bank) { - if (!Bank) - return; - - HT_Memory = 4; // Link trade to [VAR: General Location] - HT_TextVar = 0; // Somewhere (Bank) - HT_Intensity = 1; - HT_Feeling = Memories.GetRandomFeeling(HT_Memory, 10); // 0-9 Bank + if (Bank) + base.TradeMemory(true); } - // Legality Properties - public override bool WasLink => Met_Location == 30011; - public override bool WasEvent => (Met_Location > 40000 && Met_Location < 50000) || FatefulEncounter; - public override bool WasEventEgg => GenNumber < 5 ? base.WasEventEgg : ((Egg_Location > 40000 && Egg_Location < 50000) || (FatefulEncounter && Egg_Location == 30002)) && Met_Level == 1; - // Maximums public override int MaxMoveID => Legal.MaxMoveID_7_USUM; public override int MaxSpeciesID => Legal.MaxSpeciesID_7_USUM; @@ -606,9 +509,5 @@ public void TradeMemory(bool Bank) public override int MaxItemID => Legal.MaxItemID_7_USUM; public override int MaxBallID => Legal.MaxBallID_7; public override int MaxGameID => Legal.MaxGameID_7; - public override int MaxIV => 31; - public override int MaxEV => 252; - public override int OTLength => 12; - public override int NickLength => 12; } } diff --git a/PKHeX.Core/PKM/Shared/_K6.cs b/PKHeX.Core/PKM/Shared/_K6.cs new file mode 100644 index 000000000..e867611ec --- /dev/null +++ b/PKHeX.Core/PKM/Shared/_K6.cs @@ -0,0 +1,151 @@ +using System; +using System.Linq; + +namespace PKHeX.Core +{ + /// Generation 6 format. + public abstract class _K6 : PKM + { + private static readonly byte[] Unused = + { + 0x36, 0x37, // Unused Ribbons + 0x58, 0x59, 0x73, 0x90, 0x91, 0x9E, 0x9F, 0xA0, 0xA1, 0xA7, 0xAA, 0xAB, 0xAC, 0xAD, 0xC8, 0xC9, 0xD7, 0xE4, 0xE5, 0xE6, 0xE7 + }; + + public override byte[] ExtraBytes => Unused; + + public override int SIZE_PARTY => PKX.SIZE_6PARTY; + public override int SIZE_STORED => PKX.SIZE_6STORED; + + // Trash Bytes + public override byte[] Nickname_Trash { get => GetData(0x40, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0x40); } } + public override byte[] HT_Trash { get => GetData(0x78, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0x78); } } + public override byte[] OT_Trash { get => GetData(0xB0, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0xB0); } } + + protected override ushort CalculateChecksum() + { + ushort chk = 0; + for (int i = 8; i < 0xE8; i += 2) + chk += BitConverter.ToUInt16(Data, i); + return chk; + } + + // Simple Generated Attributes + public override int CurrentFriendship + { + get => CurrentHandler == 0 ? OT_Friendship : HT_Friendship; + set { if (CurrentHandler == 0) OT_Friendship = value; else HT_Friendship = value; } + } + + public int OppositeFriendship + { + get => CurrentHandler == 1 ? OT_Friendship : HT_Friendship; + set { if (CurrentHandler == 1) OT_Friendship = value; else HT_Friendship = value; } + } + + public override int SuperTrainingMedalCount(int maxCount = 30) + { + uint value = BitConverter.ToUInt32(Data, 0x2C); + int TrainCount = 0; + value >>= 2; + for (int i = 0; i < maxCount; i++) + { + if ((value & 1) != 0) + TrainCount++; + value >>= 1; + } + + return TrainCount; + } + + public override int PSV => (int)((PID >> 16 ^ (PID & 0xFFFF)) >> 4); + public override int TSV => (TID ^ SID) >> 4; + public override bool IsUntraded => Data[0x78] == 0 && Data[0x78 + 1] == 0 && Format == GenNumber; // immediately terminated HT_Name data (\0) + + // Complex Generated Attributes + public override int Characteristic + { + get + { + // Characteristic with EC%6 + int pm6 = (int)(EncryptionConstant % 6); // EC MOD 6 + int maxIV = IVs.Max(); + int pm6stat = 0; + + for (int i = 0; i < 6; i++) + { + if (IVs[pm6stat = pm6++ % 6] == maxIV) + break; + } + return (pm6stat * 5) + (maxIV % 5); + } + } + + // Methods + protected override byte[] Encrypt() + { + RefreshChecksum(); + return PKX.EncryptArray(Data); + } + + // General User-error Fixes + public void FixRelearn() + { + while (true) + { + if (RelearnMove4 != 0 && RelearnMove3 == 0) + { + RelearnMove3 = RelearnMove4; + RelearnMove4 = 0; + } + if (RelearnMove3 != 0 && RelearnMove2 == 0) + { + RelearnMove2 = RelearnMove3; + RelearnMove3 = 0; + continue; + } + if (RelearnMove2 != 0 && RelearnMove1 == 0) + { + RelearnMove1 = RelearnMove2; + RelearnMove2 = 0; + continue; + } + break; + } + } + + // Synthetic Trading Logic + public void Trade(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank, int Day = 1, int Month = 1, int Year = 2015) + { + // Eggs do not have any modifications done if they are traded + if (IsEgg && !(SAV_Trainer == OT_Name && SAV_TID == TID && SAV_SID == SID && SAV_GENDER == OT_Gender)) + SetLinkTradeEgg(Day, Month, Year); + // Process to the HT if the OT of the Pokémon does not match the SAV's OT info. + else if (!TradeOT(SAV_Trainer, SAV_TID, SAV_SID, SAV_COUNTRY, SAV_REGION, SAV_GENDER, Bank)) + TradeHT(SAV_Trainer, SAV_COUNTRY, SAV_REGION, SAV_GENDER, Bank); + } + + protected abstract bool TradeOT(string SAV_Trainer, int SAV_TID, int SAV_SID, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank); + protected abstract void TradeHT(string SAV_Trainer, int SAV_COUNTRY, int SAV_REGION, int SAV_GENDER, bool Bank); + + // Misc Updates + public virtual void TradeMemory(bool Bank) + { + HT_Memory = 4; // Link trade to [VAR: General Location] + HT_TextVar = Bank ? 0 : 9; // Somewhere (Bank) : Pokécenter (Trade) + HT_Intensity = 1; + HT_Feeling = Memories.GetRandomFeeling(HT_Memory, Bank ? 10 : 20); // 0-9 Bank, 0-19 Trade + } + + // Legality Properties + public override bool WasLink => Met_Location == 30011; + public override bool WasEvent => (Met_Location > 40000 && Met_Location < 50000) || FatefulEncounter; + public override bool WasEventEgg => GenNumber < 5 ? base.WasEventEgg : ((Egg_Location > 40000 && Egg_Location < 50000) || (FatefulEncounter && Egg_Location == 30002)) && Met_Level == 1; + + // Maximums + public override int MaxIV => 31; + public override int MaxEV => 252; + public override int OTLength => 12; + public override int NickLength => 12; + } +} diff --git a/PKHeX.Core/Saves/SAV7b.cs b/PKHeX.Core/Saves/SAV7b.cs index 523038d56..cac6d3a6e 100644 --- a/PKHeX.Core/Saves/SAV7b.cs +++ b/PKHeX.Core/Saves/SAV7b.cs @@ -147,7 +147,7 @@ protected override void SetPKM(PKM pkm) // Apply to this Save File int CT = pk.CurrentHandler; var Date = DateTime.Now; - pk.Trade(OT, TID, SID, Gender, Date.Day, Date.Month, Date.Year); + pk.Trade(OT, TID, SID, Gender, Date.Day, Date.Month, false, Date.Year); if (CT != pk.CurrentHandler) // Logic updated Friendship { // Copy over the Friendship Value only under certain circumstances