예제 #1
0
        public static List <PKM> GetLivingDex(this ITrainerInfo tr, IEnumerable <int> speciesToGenerate, PKM blank)
        {
            var result   = new List <PKM>();
            var destType = blank.GetType();

            foreach (var s in speciesToGenerate)
            {
                var pk = blank.Clone();
                pk.Species = s;
                pk.Gender  = pk.GetSaneGender();

                var pi = pk.PersonalInfo;
                for (int f = 0; f < pi.FormCount; f++)
                {
                    var entry = tr.GetLivingEntry(pk, s, f, destType);
                    if (entry == null)
                    {
                        continue;
                    }
                    result.Add(entry);
                }
            }

            return(result);
        }
예제 #2
0
        /// <summary>
        /// Gets all balls that are legal for the input <see cref="PKM"/>.
        /// </summary>
        /// <remarks>
        /// Requires checking the <see cref="LegalityAnalysis"/> for every <see cref="Ball"/> that is tried.
        /// </remarks>
        /// <param name="pkm">Pokémon to retrieve a list of valid balls for.</param>
        /// <returns>Enumerable list of <see cref="Ball"/> values that the <see cref="PKM"/> is legal with.</returns>
        public static IEnumerable <Ball> GetLegalBalls(PKM pkm)
        {
            var clone = pkm.Clone();

            foreach (var b in BallList)
            {
                clone.Ball = (int)b;
                if (new LegalityAnalysis(clone).Valid)
                {
                    yield return(b);
                }
            }
        }
예제 #3
0
        /// <summary>
        /// Gets a moveset for the provided <see cref="PKM"/> data.
        /// </summary>
        /// <param name="pk">PKM to generate for</param>
        /// <param name="random">Full movepool &amp; shuffling</param>
        /// <returns>4 moves</returns>
        public static int[] GetMoveSet(this PKM pk, bool random = false)
        {
            var la    = new LegalityAnalysis(pk);
            var moves = la.GetMoveSet(random);

            if (random)
            {
                return(moves);
            }

            var clone = pk.Clone();

            clone.SetMoves(moves);
            var newLa = new LegalityAnalysis(pk);

            // ReSharper disable once TailRecursiveCall
            return(newLa.Valid ? moves : GetMoveSet(pk, true));
        }
예제 #4
0
        public static List <PKM> GetLivingDex(ITrainerInfo tr, IEnumerable <int> speciesToGenerate, PKM blank)
        {
            var result   = new List <PKM>();
            var destType = blank.GetType();

            foreach (var s in speciesToGenerate)
            {
                var pk = blank.Clone();
                pk.Species = s;
                pk.Gender  = pk.GetSaneGender();

                var pi = pk.PersonalInfo;
                for (int i = 0; i < pi.FormeCount; i++)
                {
                    pk.AltForm = i;
                    if (s == (int)Species.Indeedee || s == (int)Species.Meowstic)
                    {
                        pk.Gender = i;
                    }

                    var f = EncounterMovesetGenerator.GeneratePKMs(pk, tr).FirstOrDefault();
                    if (f == null)
                    {
                        continue;
                    }
                    var converted = PKMConverter.ConvertToType(f, destType, out _);
                    if (converted == null)
                    {
                        continue;
                    }

                    converted.CurrentLevel = 100;
                    converted.Species      = s;
                    converted.AltForm      = i;

                    result.Add(converted);
                }
            }

            return(result);
        }
예제 #5
0
        private static PKM ConvertPKM(PKM pk, Type PKMType, int toFormat, ref string comment)
        {
            PKM pkm = pk.Clone();

            if (pkm.IsEgg)
            {
                pkm.ForceHatchPKM();
            }
            while (true)
            {
                pkm = IntermediaryConvert(pkm, PKMType, toFormat, ref comment);
                if (pkm == null) // fail convert
                {
                    return(null);
                }
                if (pkm.GetType() == PKMType) // finish convert
                {
                    return(pkm);
                }
            }
        }
예제 #6
0
        /// <summary>
        /// Converts a PKM from one Generation 3 format to another. If it matches the destination format, the conversion will automatically return.
        /// </summary>
        /// <param name="pk">PKM to convert</param>
        /// <param name="PKMType">Format/Type to convert to</param>
        /// <param name="comment">Comments regarding the transfer's success/failure</param>
        /// <returns>Converted PKM</returns>
        public static PKM ConvertToType(PKM pk, Type PKMType, out string comment)
        {
            if (pk == null)
            {
                comment = $"Bad {nameof(pk)} input. Aborting.";
                return(null);
            }

            Type fromType = pk.GetType();

            if (fromType == PKMType)
            {
                comment = "No need to convert, current format matches requested format.";
                return(pk);
            }

            if (IsNotTransferrable(pk, out comment))
            {
                return(null);
            }

            Debug.WriteLine($"Trying to convert {fromType.Name} to {PKMType.Name}.");

            int fromFormat = int.Parse(fromType.Name.Last().ToString());
            int toFormat   = int.Parse(PKMType.Name.Last().ToString());

            if (fromFormat > toFormat && fromFormat != 2)
            {
                comment = $"Cannot convert a {fromType.Name} to a {PKMType.Name}.";
                return(null);
            }

            PKM pkm = pk.Clone();

            if (pkm.IsEgg)
            {
                ForceHatchPKM(pkm);
            }

            switch (fromType.Name)
            {
            case nameof(PK1):
                if (toFormat == 7)     // VC->Bank
                {
                    pkm = ((PK1)pk).ConvertToPK7();
                }
                else if (toFormat == 2)     // GB<->GB
                {
                    pkm = ((PK1)pk).ConvertToPK2();
                }
                break;

            case nameof(PK2):
                if (toFormat == 7)     // VC->Bank
                {
                    pkm = ((PK2)pk).ConvertToPK7();
                }
                else if (toFormat == 1)     // GB<->GB
                {
                    if (pk.Species > 151)
                    {
                        comment = $"Cannot convert a {PKX.GetSpeciesName(pkm.Species, pkm.Japanese ? 1 : 2)} to {PKMType.Name}";
                        return(null);
                    }
                    pkm = ((PK2)pk).ConvertToPK1();
                    pkm.ClearInvalidMoves();
                }
                break;

            case nameof(CK3):
            case nameof(XK3):
                // interconverting C/XD needs to visit main series format
                // ends up stripping purification/shadow etc stats
                pkm = pkm.ConvertToPK3();
                goto case nameof(PK3);     // fall through

            case nameof(PK3):
                if (toFormat == 3)     // Gen3 Inter-trading
                {
                    pkm = InterConvertPK3(pkm, PKMType);
                    break;
                }
                if (fromType.Name != nameof(PK3))
                {
                    pkm = pkm.ConvertToPK3();
                }

                pkm = ((PK3)pkm).ConvertToPK4();
                if (toFormat == 4)
                {
                    break;
                }
                goto case nameof(PK4);

            case nameof(BK4):
                pkm = ((BK4)pkm).ConvertToPK4();
                if (toFormat == 4)
                {
                    break;
                }
                goto case nameof(PK4);

            case nameof(PK4):
                if (PKMType == typeof(BK4))
                {
                    pkm = ((PK4)pkm).ConvertToBK4();
                    break;
                }
                pkm = ((PK4)pkm).ConvertToPK5();
                if (toFormat == 5)
                {
                    break;
                }
                goto case nameof(PK5);

            case nameof(PK5):
                pkm = ((PK5)pkm).ConvertToPK6();
                if (toFormat == 6)
                {
                    break;
                }
                goto case nameof(PK6);

            case nameof(PK6):
                if (pkm.Species == 25 && pkm.AltForm != 0)     // cosplay pikachu
                {
                    comment = "Cannot transfer Cosplay Pikachu forward.";
                    return(null);
                }
                pkm = ((PK6)pkm).ConvertToPK7();
                if (toFormat == 7)
                {
                    break;
                }
                goto case nameof(PK7);

            case nameof(PK7):
                break;
            }

            comment = pkm == null
                ? $"Cannot convert a {fromType.Name} to a {PKMType.Name}."
                : $"Converted from {fromType.Name} to {PKMType.Name}.";

            return(pkm);
        }
예제 #7
0
        /// <summary>
        /// Gets a list of valid ribbons for the <see cref="pkm"/> that can be removed.
        /// </summary>
        /// <param name="pkm">Entity to fetch the list for.</param>
        /// <param name="allRibbons">All ribbon names.</param>
        /// <returns>List of all removable ribbon names.</returns>
        public static IReadOnlyList <string> GetRemovableRibbons(PKM pkm, IList <string> allRibbons)
        {
            var pk = pkm.Clone();

            return(RemoveAllValidRibbons(allRibbons, pk));
        }
예제 #8
0
        public static PKM convertToFormat(PKM pk, Type PKMType, out string comment)
        {
            bool timeMachine = true;

            if (pk == null || pk.Species == 0)
            {
                comment = "Null input. Aborting.";
                return(null);
            }

            Type fromType   = pk.GetType();
            int  fromFormat = int.Parse(fromType.Name.Last().ToString());
            int  toFormat   = int.Parse(PKMType.Name.Last().ToString());

            Console.WriteLine($"Trying to convert {fromType.Name} to {PKMType.Name}.");

            PKM pkm = null;

            if (fromType == PKMType)
            {
                comment = "No need to convert, current format matches requested format.";
                return(pk);
            }
            if (fromFormat <= toFormat)
            {
                pkm = pk.Clone();
                if (pkm.IsEgg) // force hatch
                {
                    pkm.IsEgg = false;
                    if (pkm.AO)
                    {
                        pkm.Met_Location = 318; // Battle Resort
                    }
                    else if (pkm.XY)
                    {
                        pkm.Met_Location = 38; // Route 7
                    }
                    else if (pkm.Gen5)
                    {
                        pkm.Met_Location = 16; // Route 16
                    }
                    else
                    {
                        pkm.Met_Location = 30001; // Pokétransfer
                    }
                }
                switch (fromType.Name)
                {
                case nameof(PK1):
                    pkm = PKMType == typeof(PK2) ? ((PK1)pk).convertToPK2() : null;
                    if (toFormat == 2)
                    {
                        break;
                    }
                    pkm = ((PK2)pk).convertToPK3();
                    if (toFormat == 3)
                    {
                        break;
                    }
                    pkm = ((PK3)pkm).convertToPK4();
                    if (toFormat == 4)
                    {
                        if (PKMType == typeof(BK4))
                        {
                            pkm = ((PK4)pkm).convertToBK4();
                        }
                        break;
                    }
                    pkm = ((PK4)pkm).convertToPK5();
                    if (toFormat == 5)
                    {
                        break;
                    }
                    pkm = ((PK5)pkm).convertToPK6();
                    if (toFormat == 6)
                    {
                        break;
                    }
                    pkm = new PK7(pkm.Data, pkm.Identifier);
                    break;

                //if (toFormat == 7)
                //    pkm = null; // pkm.convertPK1toPK7();
                //break;
                case nameof(PK2):
                    //if (PKMType == typeof(PK1))
                    //{
                    //    if (pk.Species > 151)
                    //    {
                    //        comment = $"Cannot convert a {PKX.getSpeciesName(pkm.Species, ((PK2)pkm).Japanese ? 1 : 2)} to {PKMType.Name}";
                    //        return null;
                    //    }
                    //    pkm = ((PK2)pk).convertToPK1();
                    //}
                    //else if (PKMType == typeof(PK3))
                    //{
                    //    pkm = ((PK2)pk).convertToPK3();
                    //}
                    //else
                    //    pkm = null;

                    pkm = ((PK2)pk).convertToPK3();
                    if (toFormat == 3)
                    {
                        break;
                    }
                    pkm = ((PK3)pkm).convertToPK4();
                    if (toFormat == 4)
                    {
                        if (PKMType == typeof(BK4))
                        {
                            pkm = ((PK4)pkm).convertToBK4();
                        }
                        break;
                    }
                    pkm = ((PK4)pkm).convertToPK5();
                    if (toFormat == 5)
                    {
                        break;
                    }
                    pkm = ((PK5)pkm).convertToPK6();
                    if (toFormat == 6)
                    {
                        break;
                    }
                    pkm = new PK7(pkm.Data, pkm.Identifier);
                    break;

                case nameof(CK3):
                case nameof(XK3):
                    // interconverting C/XD needs to visit main series format
                    // ends up stripping purification/shadow etc stats
                    pkm = pkm.convertToPK3();
                    goto case nameof(PK3);     // fall through

                case nameof(PK3):
                    if (toFormat == 2)
                    {
                        pkm = ((PK3)pkm).convertToPK2();
                        break;
                    }
                    if (toFormat == 3)     // Gen3 Inter-trading
                    {
                        switch (PKMType.Name)
                        {
                        case nameof(CK3): pkm = pkm.convertToCK3(); break;

                        case nameof(XK3): pkm = pkm.convertToXK3(); break;

                        case nameof(PK3): pkm = pkm.convertToPK3(); break;         // already converted, instantly returns

                        default: throw new FormatException();
                        }
                        break;
                    }
                    if (fromType.Name != nameof(PK3))
                    {
                        pkm = pkm.convertToPK3();
                    }

                    pkm = ((PK3)pkm).convertToPK4();
                    if (toFormat == 4)
                    {
                        break;
                    }
                    goto case nameof(PK4);

                case nameof(BK4):
                    pkm = ((BK4)pkm).convertToPK4();
                    if (toFormat == 4)
                    {
                        break;
                    }
                    goto case nameof(PK4);

                case nameof(PK4):
                    if (PKMType == typeof(BK4))
                    {
                        pkm = ((PK4)pkm).convertToBK4();
                        break;
                    }
                    pkm = ((PK4)pkm).convertToPK5();
                    if (toFormat == 5)
                    {
                        break;
                    }
                    goto case nameof(PK5);

                case nameof(PK5):
                    pkm = ((PK5)pkm).convertToPK6();
                    if (toFormat == 6)
                    {
                        break;
                    }
                    goto case nameof(PK6);

                case nameof(PK6):
                    pkm = ((PK6)pkm).convertToPK7();
                    if (toFormat == 7)
                    {
                        break;
                    }
                    goto case nameof(PK7);

                case nameof(PK7):
                    break;
                }
            }

            else // fromFormat > toFormat - we're going backwards, normally unsupported - obviously not perfect, but its cool i guess
            {
                pkm = pk.Clone();
                if (pkm.IsEgg) // force hatch
                {
                    pkm.IsEgg = false;
                    if (pkm.AO)
                    {
                        pkm.Met_Location = 318; // Battle Resort
                    }
                    else if (pkm.XY)
                    {
                        pkm.Met_Location = 38; // Route 7
                    }
                    else if (pkm.Gen5)
                    {
                        pkm.Met_Location = 16; // Route 16
                    }
                    else
                    {
                        pkm.Met_Location = 30001; // Pokétransfer
                    }
                }

                switch (fromType.Name)
                {
                case "PK2":
                    if (PKMType == typeof(PK1))
                    {
                        if (pk.Species > 151)
                        {
                            comment = $"Cannot convert a {PKX.getSpeciesName(pkm.Species, ((PK2)pkm).Japanese ? 1 : 2)} to {PKMType.Name}";
                            return(null);
                        }
                        pkm = ((PK2)pk).convertToPK1();
                    }
                    else
                    {
                        pkm = null;
                    }
                    break;

                case "PK7":
                    if (
                        (toFormat == 6 && pk.Species > 721) ||
                        (toFormat == 5 && pk.Species > 649) ||
                        (toFormat == 4 && pk.Species > 493) ||
                        (toFormat == 3 && pk.Species > 386) ||
                        (toFormat == 2 && pk.Species > 251) ||
                        (toFormat == 1 && pk.Species > 151)
                        )
                    {
                        pkm = null; break;
                    }                          // how awkward im the worst

                    pkm = new PK6(pkm.Data, pkm.Identifier);
                    if (toFormat == 6)
                    {
                        break;
                    }
                    pkm = ((PK6)pkm).convertToPK5();
                    if (toFormat == 5)
                    {
                        break;
                    }
                    pkm = ((PK5)pkm).convertToPK4();
                    if (toFormat == 4)
                    {
                        break;
                    }
                    pkm = ((PK4)pkm).convertToPK3();
                    if (toFormat == 3)
                    {
                        break;
                    }
                    pkm = ((PK3)pkm).convertToPK2();
                    if (toFormat == 2)
                    {
                        break;
                    }
                    pkm = ((PK2)pkm).convertToPK1();
                    break;

                case "PK6":
                    if (
                        (toFormat == 5 && pk.Species > 649) ||
                        (toFormat == 4 && pk.Species > 493) ||
                        (toFormat == 3 && pk.Species > 386) ||
                        (toFormat == 2 && pk.Species > 251) ||
                        (toFormat == 1 && pk.Species > 151)
                        )
                    {
                        pkm = null; break;
                    }                               // how awkward im the worst

                    pkm = ((PK6)pkm).convertToPK5();
                    if (toFormat == 5)
                    {
                        break;
                    }
                    pkm = ((PK5)pkm).convertToPK4();
                    if (toFormat == 4)
                    {
                        break;
                    }
                    pkm = ((PK4)pkm).convertToPK3();
                    if (toFormat == 3)
                    {
                        break;
                    }
                    pkm = ((PK3)pkm).convertToPK2();
                    if (toFormat == 2)
                    {
                        break;
                    }
                    pkm = ((PK2)pkm).convertToPK1();
                    break;

                case "PK5":
                    if (
                        (toFormat == 4 && pk.Species > 493) ||
                        (toFormat == 3 && pk.Species > 386) ||
                        (toFormat == 2 && pk.Species > 251) ||
                        (toFormat == 1 && pk.Species > 151)
                        )
                    {
                        pkm = null; break;
                    }                               // how awkward im the worst

                    pkm = ((PK5)pkm).convertToPK4();
                    if (toFormat == 4)
                    {
                        break;
                    }
                    pkm = ((PK4)pkm).convertToPK3();
                    if (toFormat == 3)
                    {
                        break;
                    }
                    pkm = ((PK3)pkm).convertToPK2();
                    if (toFormat == 2)
                    {
                        break;
                    }
                    pkm = ((PK2)pkm).convertToPK1();
                    break;

                case "PK4":
                    if (
                        (toFormat == 3 && pk.Species > 386) ||
                        (toFormat == 2 && pk.Species > 251) ||
                        (toFormat == 1 && pk.Species > 151)
                        )
                    {
                        pkm = null; break;
                    }                               // how awkward im the worst

                    pkm = ((PK4)pkm).convertToPK3();
                    if (toFormat == 3)
                    {
                        break;
                    }
                    pkm = ((PK3)pkm).convertToPK2();
                    if (toFormat == 2)
                    {
                        break;
                    }
                    pkm = ((PK2)pkm).convertToPK1();
                    break;

                case "CK3":
                case "XK3":
                    // interconverting C/XD needs to visit main series format
                    // ends up stripping purification/shadow etc stats
                    pkm = pkm.convertToPK3();
                    goto case "PK3";     // fall through

                case "PK3":
                    if (
                        (toFormat == 2 && pk.Species > 251) ||
                        (toFormat == 1 && pk.Species > 151)
                        )
                    {
                        pkm = null; break;
                    }                               // how awkward im the worst

                    pkm = ((PK3)pkm).convertToPK2();
                    if (toFormat == 2)
                    {
                        break;
                    }
                    pkm = ((PK2)pkm).convertToPK1();
                    break;
                }
            }

            comment = pkm == null
                ? $"Cannot convert a {fromType.Name} to a {PKMType.Name}."
                : $"Converted from {fromType.Name} to {PKMType.Name}.";

            return(pkm);
        }
예제 #9
0
파일: PKMConverter.cs 프로젝트: kwsch/PKHeX
        public static PKM convertToFormat(PKM pk, Type PKMType, out string comment)
        {
            if (pk == null || pk.Species == 0)
            {
                comment = "Null input. Aborting.";
                return null;
            }

            Type fromType = pk.GetType();
            int fromFormat = int.Parse(fromType.Name.Last().ToString());
            int toFormat = int.Parse(PKMType.Name.Last().ToString());
            Console.WriteLine($"Trying to convert {fromType.Name} to {PKMType.Name}.");

            PKM pkm = null;

            if (fromType == PKMType)
            {
                comment = "No need to convert, current format matches requested format.";
                return pk;
            }
            if (fromFormat <= toFormat || fromFormat == 2)
            {
                pkm = pk.Clone();
                if (pkm.IsEgg) // force hatch
                {
                    pkm.IsEgg = false;
                    if (pkm.AO)
                        pkm.Met_Location = 318; // Battle Resort
                    else if (pkm.XY)
                        pkm.Met_Location = 38; // Route 7
                    else if (pkm.Gen5)
                        pkm.Met_Location = 16; // Route 16
                    else
                        pkm.Met_Location = 30001; // Pokétransfer
                }
                switch (fromType.Name)
                {
                    case nameof(PK1):
                        if (toFormat == 2)
                        {
                            pkm = PKMType == typeof (PK2) ? ((PK1) pk).convertToPK2() : null;
                            break;
                        }
                        if (toFormat == 7)
                            pkm = null; // pkm.convertPK1toPK7();
                        break;
                    case nameof(PK2):
                        if (PKMType == typeof (PK1))
                        {
                            if (pk.Species > 151)
                            {
                                comment = $"Cannot convert a {PKX.getSpeciesName(pkm.Species, ((PK2)pkm).Japanese ? 1 : 2)} to {PKMType.Name}";
                                return null;
                            }
                            pkm = ((PK2) pk).convertToPK1();
                        }
                        else
                            pkm = null;
                        break;
                    case nameof(CK3):
                    case nameof(XK3):
                        // interconverting C/XD needs to visit main series format
                        // ends up stripping purification/shadow etc stats
                        pkm = pkm.convertToPK3();
                        goto case nameof(PK3); // fall through
                    case nameof(PK3):
                        if (toFormat == 3) // Gen3 Inter-trading
                        {
                            switch (PKMType.Name)
                            {
                                case nameof(CK3): pkm = pkm.convertToCK3(); break;
                                case nameof(XK3): pkm = pkm.convertToXK3(); break;
                                case nameof(PK3): pkm = pkm.convertToPK3(); break; // already converted, instantly returns
                                default: throw new FormatException();
                            }
                            break;
                        }
                        if (fromType.Name != nameof(PK3))
                            pkm = pkm.convertToPK3();

                        pkm = ((PK3)pkm).convertToPK4();
                        if (toFormat == 4)
                            break;
                        goto case nameof(PK4);
                    case nameof(BK4):
                        pkm = ((BK4)pkm).convertToPK4();
                        if (toFormat == 4)
                            break;
                        goto case nameof(PK4);
                    case nameof(PK4):
                        if (PKMType == typeof(BK4))
                        {
                            pkm = ((PK4)pkm).convertToBK4();
                            break;
                        }
                        pkm = ((PK4)pkm).convertToPK5();
                        if (toFormat == 5)
                            break;
                        goto case nameof(PK5);
                    case nameof(PK5):
                        pkm = ((PK5)pkm).convertToPK6();
                        if (toFormat == 6)
                            break;
                        goto case nameof(PK6);
                    case nameof(PK6):
                        pkm = new PK7(pkm.Data, pkm.Identifier);
                        if (toFormat == 7)
                            break;
                        goto case nameof(PK7);
                    case nameof(PK7):
                        break;
                }
            }

            comment = pkm == null
                ? $"Cannot convert a {fromType.Name} to a {PKMType.Name}." 
                : $"Converted from {fromType.Name} to {PKMType.Name}.";

            return pkm;
        }
예제 #10
0
        public static PKM ConvertToType(PKM pk, Type PKMType, out string comment)
        {
            if (pk == null || pk.Species == 0)
            {
                comment = "Null input. Aborting.";
                return(null);
            }

            Type fromType   = pk.GetType();
            int  fromFormat = int.Parse(fromType.Name.Last().ToString());
            int  toFormat   = int.Parse(PKMType.Name.Last().ToString());

            Debug.WriteLine($"Trying to convert {fromType.Name} to {PKMType.Name}.");

            PKM pkm = null;

            if (fromType == PKMType)
            {
                comment = "No need to convert, current format matches requested format.";
                return(pk);
            }
            if (fromFormat <= toFormat || fromFormat == 2)
            {
                pkm = pk.Clone();
                if (pkm.IsEgg) // force hatch
                {
                    pkm.IsEgg = false;
                    if (pkm.AO)
                    {
                        pkm.Met_Location = 318; // Battle Resort
                    }
                    else if (pkm.XY)
                    {
                        pkm.Met_Location = 38; // Route 7
                    }
                    else if (pkm.Gen5)
                    {
                        pkm.Met_Location = 16; // Route 16
                    }
                    else
                    {
                        pkm.Met_Location = 30001; // Pokétransfer
                    }
                    pkm.IsNicknamed = false;
                    pkm.Nickname    = PKX.GetSpeciesNameGeneration(pkm.Species, pkm.Language, fromFormat);
                }
                switch (fromType.Name)
                {
                case nameof(PK1):
                    if (toFormat == 2)
                    {
                        pkm = PKMType == typeof(PK2) ? ((PK1)pk).ConvertToPK2() : null;
                        break;
                    }
                    if (toFormat == 7)
                    {
                        pkm = ((PK1)pk).ConvertToPK7();
                    }
                    break;

                case nameof(PK2):
                    if (PKMType == typeof(PK1))
                    {
                        if (pk.Species > 151)
                        {
                            comment = $"Cannot convert a {PKX.GetSpeciesName(pkm.Species, ((PK2)pkm).Japanese ? 1 : 2)} to {PKMType.Name}";
                            return(null);
                        }
                        pkm = ((PK2)pk).ConvertToPK1();
                        pkm.ClearInvalidMoves();
                    }
                    else
                    {
                        pkm = null;
                    }
                    break;

                case nameof(CK3):
                case nameof(XK3):
                    // interconverting C/XD needs to visit main series format
                    // ends up stripping purification/shadow etc stats
                    pkm = pkm.ConvertToPK3();
                    goto case nameof(PK3);     // fall through

                case nameof(PK3):
                    if (toFormat == 3)     // Gen3 Inter-trading
                    {
                        switch (PKMType.Name)
                        {
                        case nameof(CK3): pkm = pkm.ConvertToCK3(); break;

                        case nameof(XK3): pkm = pkm.ConvertToXK3(); break;

                        case nameof(PK3): pkm = pkm.ConvertToPK3(); break;         // already converted, instantly returns

                        default: throw new FormatException();
                        }
                        break;
                    }
                    if (fromType.Name != nameof(PK3))
                    {
                        pkm = pkm.ConvertToPK3();
                    }

                    pkm = ((PK3)pkm).ConvertToPK4();
                    if (toFormat == 4)
                    {
                        break;
                    }
                    goto case nameof(PK4);

                case nameof(BK4):
                    pkm = ((BK4)pkm).ConvertToPK4();
                    if (toFormat == 4)
                    {
                        break;
                    }
                    goto case nameof(PK4);

                case nameof(PK4):
                    if (PKMType == typeof(BK4))
                    {
                        pkm = ((PK4)pkm).ConvertToBK4();
                        break;
                    }
                    if (pkm.Species == 172 && pkm.AltForm != 0)
                    {
                        comment = "Cannot transfer Spiky-Eared Pichu forward.";
                        return(null);
                    }
                    pkm = ((PK4)pkm).ConvertToPK5();
                    if (toFormat == 5)
                    {
                        break;
                    }
                    goto case nameof(PK5);

                case nameof(PK5):
                    pkm = ((PK5)pkm).ConvertToPK6();
                    if (toFormat == 6)
                    {
                        break;
                    }
                    goto case nameof(PK6);

                case nameof(PK6):
                    if (pkm.Species == 25 && pkm.AltForm != 0)     // cosplay pikachu
                    {
                        comment = "Cannot transfer Cosplay Pikachu forward.";
                        return(null);
                    }
                    pkm = ((PK6)pkm).ConvertToPK7();
                    if (toFormat == 7)
                    {
                        break;
                    }
                    goto case nameof(PK7);

                case nameof(PK7):
                    break;
                }
            }

            comment = pkm == null
                ? $"Cannot convert a {fromType.Name} to a {PKMType.Name}."
                : $"Converted from {fromType.Name} to {PKMType.Name}.";

            return(pkm);
        }
예제 #11
0
        private static PKM ConvertPKM(PKM pk, Type PKMType, Type fromType, int toFormat, ref string comment)
        {
            PKM pkm = pk.Clone();

            if (pkm.IsEgg)
            {
                ForceHatchPKM(pkm);
            }

            switch (fromType.Name)
            {
            case nameof(PK1):
                if (toFormat == 7)     // VC->Bank
                {
                    pkm = ((PK1)pk).ConvertToPK7();
                }
                else if (toFormat == 2)     // GB<->GB
                {
                    pkm = ((PK1)pk).ConvertToPK2();
                }
                break;

            case nameof(PK2):
                if (toFormat == 7)     // VC->Bank
                {
                    pkm = ((PK2)pk).ConvertToPK7();
                }
                else if (toFormat == 1)     // GB<->GB
                {
                    if (pk.Species > 151)
                    {
                        comment = $"Cannot convert a {PKX.GetSpeciesName(pkm.Species, pkm.Japanese ? 1 : 2)} to {PKMType.Name}";
                        return(pkm);
                    }
                    pkm = ((PK2)pk).ConvertToPK1();
                    pkm.ClearInvalidMoves();
                }
                break;

            case nameof(CK3):
            case nameof(XK3):
                // interconverting C/XD needs to visit main series format
                // ends up stripping purification/shadow etc stats
                pkm = pkm.ConvertToPK3();
                goto case nameof(PK3);     // fall through

            case nameof(PK3):
                if (toFormat == 3)     // Gen3 Inter-trading
                {
                    pkm = InterConvertPK3(pkm, PKMType);
                    break;
                }
                if (fromType.Name != nameof(PK3))
                {
                    pkm = pkm.ConvertToPK3();
                }

                pkm = ((PK3)pkm).ConvertToPK4();
                if (toFormat == 4)
                {
                    break;
                }
                goto case nameof(PK4);

            case nameof(BK4):
                pkm = ((BK4)pkm).ConvertToPK4();
                if (toFormat == 4)
                {
                    break;
                }
                goto case nameof(PK4);

            case nameof(PK4):
                if (PKMType == typeof(BK4))
                {
                    pkm = ((PK4)pkm).ConvertToBK4();
                    break;
                }
                pkm = ((PK4)pkm).ConvertToPK5();
                if (toFormat == 5)
                {
                    break;
                }
                goto case nameof(PK5);

            case nameof(PK5):
                pkm = ((PK5)pkm).ConvertToPK6();
                if (toFormat == 6)
                {
                    break;
                }
                goto case nameof(PK6);

            case nameof(PK6):
                if (pkm.Species == 25 && pkm.AltForm != 0)     // cosplay pikachu
                {
                    comment = "Cannot transfer Cosplay Pikachu forward.";
                    return(pkm);
                }
                pkm = ((PK6)pkm).ConvertToPK7();
                if (toFormat == 7)
                {
                    break;
                }
                goto case nameof(PK7);

            case nameof(PK7):
                break;
            }
            return(pkm);
        }
예제 #12
0
파일: Main.cs 프로젝트: kwsch/PKHeX
        public void populateFields(PKM pk, bool focus = true)
        {
            if (pk == null) { WinFormsUtil.Error("Attempted to load a null file."); return; }
            
            if ((pk.Format >= 3 && pk.Format > SAV.Generation) // pk3-7, can't go backwards
                || (pk.Format <= 2 && SAV.Generation > 2 && SAV.Generation < 7)) // pk1-2, can't go 3-6
            { WinFormsUtil.Alert($"Can't load Gen{pk.Format} to Gen{SAV.Generation} games."); return; }

            bool oldInit = fieldsInitialized;
            fieldsInitialized = fieldsLoaded = false;
            if (focus)
                Tab_Main.Focus();

            pkm = pk.Clone();

            if (fieldsInitialized & !pkm.ChecksumValid)
                WinFormsUtil.Alert("PKX File has an invalid checksum.");

            if (pkm.Format != SAV.Generation) // past gen format
            {
                string c;
                pkm = PKMConverter.convertToFormat(pkm, SAV.PKMType, out c);
                if (pk.Format != pkm.Format && focus) // converted
                    WinFormsUtil.Alert("Converted File.");
            }

            try { getFieldsfromPKM(); }
            catch { fieldsInitialized = oldInit; throw; }

            CB_EncounterType.Visible = Label_EncounterType.Visible = pkm.Gen4 && SAV.Generation < 7;
            fieldsInitialized = oldInit;
            updateIVs(null, null);
            updatePKRSInfected(null, null);
            updatePKRSCured(null, null);

            if (HaX) // Load original values from pk not pkm
            {
                MT_Level.Text = (pk.Stat_HPMax != 0 ? pk.Stat_Level : PKX.getLevel(pk.Species, pk.EXP)).ToString();
                TB_EXP.Text = pk.EXP.ToString();
                MT_Form.Text = pk.AltForm.ToString();
                if (pk.Stat_HPMax != 0) // stats present
                {
                    Stat_HP.Text = pk.Stat_HPCurrent.ToString();
                    Stat_ATK.Text = pk.Stat_ATK.ToString();
                    Stat_DEF.Text = pk.Stat_DEF.ToString();
                    Stat_SPA.Text = pk.Stat_SPA.ToString();
                    Stat_SPD.Text = pk.Stat_SPD.ToString();
                    Stat_SPE.Text = pk.Stat_SPE.ToString();
                }
            }
            fieldsLoaded = true;

            Label_HatchCounter.Visible = CHK_IsEgg.Checked && SAV.Generation > 1;
            Label_Friendship.Visible = !CHK_IsEgg.Checked && SAV.Generation > 1;

            // Set the Preview Box
            dragout.Image = pk.Sprite();
            setMarkings();
            updateLegality();
        }
예제 #13
0
        private static PKM ConvertPKM(PKM pk, Type PKMType, Type fromType, int toFormat, ref string comment)
        {
            PKM pkm = pk.Clone();

            if (pkm.IsEgg)
            {
                pkm.ForceHatchPKM();
            }

            switch (fromType.Name)
            {
            case nameof(PK1):
                if (toFormat == 7)     // VC->Bank
                {
                    pkm = ((PK1)pk).ConvertToPK7();
                }
                else if (toFormat == 2)     // GB<->GB
                {
                    pkm = ((PK1)pk).ConvertToPK2();
                }
                break;

            case nameof(PK2):
                if (toFormat == 7)     // VC->Bank
                {
                    pkm = ((PK2)pk).ConvertToPK7();
                }
                else if (toFormat == 1)     // GB<->GB
                {
                    if (pk.Species > 151)
                    {
                        comment = $"Cannot convert a {PKX.GetSpeciesName(pkm.Species, pkm.Japanese ? 1 : 2)} to {PKMType.Name}";
                        return(pkm);
                    }
                    pkm = ((PK2)pk).ConvertToPK1();
                    pkm.ClearInvalidMoves();
                }
                break;

            case nameof(CK3):
                pkm = ((CK3)pkm).ConvertToPK3();
                goto case nameof(PK3);     // fall through

            case nameof(XK3):
                pkm = ((XK3)pkm).ConvertToPK3();
                goto case nameof(PK3);     // fall through

            case nameof(PK3):
                if (toFormat == 3)
                {
                    if (PKMType == typeof(CK3))
                    {
                        pkm = ((PK3)pkm).ConvertToCK3();
                    }
                    else if (PKMType == typeof(XK3))
                    {
                        pkm = ((PK3)pkm).ConvertToXK3();
                    }
                    break;
                }

                pkm = ((PK3)pkm).ConvertToPK4();
                if (toFormat == 4)
                {
                    break;
                }
                goto case nameof(PK4);

            case nameof(BK4):
                pkm = ((BK4)pkm).ConvertToPK4();
                if (toFormat == 4)
                {
                    break;
                }
                goto case nameof(PK4);

            case nameof(PK4):
                if (PKMType == typeof(BK4))
                {
                    pkm = ((PK4)pkm).ConvertToBK4();
                    break;
                }
                pkm = ((PK4)pkm).ConvertToPK5();
                if (toFormat == 5)
                {
                    break;
                }
                goto case nameof(PK5);

            case nameof(PK5):
                pkm = ((PK5)pkm).ConvertToPK6();
                if (toFormat == 6)
                {
                    break;
                }
                goto case nameof(PK6);

            case nameof(PK6):
                if (pkm.Species == 25 && pkm.AltForm != 0)     // cosplay pikachu
                {
                    comment = "Cannot transfer Cosplay Pikachu forward.";
                    return(pkm);
                }
                pkm = ((PK6)pkm).ConvertToPK7();
                if (toFormat == 7)
                {
                    break;
                }
                goto case nameof(PK7);

            case nameof(PK7):
                break;
            }
            return(pkm);
        }