コード例 #1
0
ファイル: MysteryUtil.cs プロジェクト: yanisdreemurr/PKHeX
        /// <summary>
        /// Gets a description of the <see cref="MysteryGift"/> using provided string data.
        /// </summary>
        /// <param name="gift">Gift data to parse</param>
        /// <param name="strings">String data to use</param>
        /// <returns>List of lines</returns>
        public static IEnumerable <string> GetDescription(this MysteryGift gift, IBasicStrings strings)
        {
            if (gift.Empty)
            {
                return new[] { MsgMysteryGiftSlotEmpty }
            }
            ;

            var result = new List <string> {
                gift.CardHeader
            };

            if (gift.IsItem)
            {
                AddLinesItem(gift, strings, result);
            }
            else if (gift.IsPokémon)
            {
                try
                {
                    AddLinesPKM(gift, strings, result);
                }
#pragma warning disable CA1031 // Do not catch general exception types
                catch { result.Add(MsgMysteryGiftParseFail); }
#pragma warning restore CA1031 // Do not catch general exception types
            }
            else
            {
                switch (gift)
                {
                case WC7 {
                        IsBP: true
                } w7bp:
                    result.Add($"BP: {w7bp.BP}");
                    break;

                case WC7 {
                        IsBean: true
                } w7bean:
                    result.Add($"Bean ID: {w7bean.Bean}");
                    result.Add($"Quantity: {w7bean.Quantity}");
                    break;

                default:
                    result.Add(MsgMysteryGiftParseTypeUnknown);
                    break;
                }
            }
            switch (gift)
            {
            case WC7 w7:
                result.Add($"Repeatable: {w7.GiftRepeatable}");
                result.Add($"Collected: {w7.GiftUsed}");
                result.Add($"Once Per Day: {w7.GiftOncePerDay}");
                break;
            }
            return(result);
        }
コード例 #2
0
        private static void AddLinesItem(MysteryGift gift, IBasicStrings strings, ICollection <string> result)
        {
            result.Add($"Item: {strings.Item[gift.ItemID]} (Quantity: {gift.Quantity})");
            if (gift is not WC7 wc7)
            {
                return;
            }

            for (var ind = 1; wc7.GetItem(ind) != 0; ind++)
            {
                result.Add($"Item: {strings.Item[wc7.GetItem(ind)]} (Quantity: {wc7.GetQuantity(ind)})");
            }
        }
コード例 #3
0
ファイル: MysteryUtil.cs プロジェクト: asanrom/PKHeX
        /// <summary>
        /// Gets a description of the <see cref="MysteryGift"/> using provided string data.
        /// </summary>
        /// <param name="gift">Gift data to parse</param>
        /// <param name="strings">String data to use</param>
        /// <returns>List of lines</returns>
        public static IEnumerable <string> GetDescription(this MysteryGift gift, IBasicStrings strings)
        {
            if (gift.Empty)
            {
                return new[] { MsgMysteryGiftSlotEmpty }
            }
            ;

            var result = new List <string> {
                gift.CardHeader
            };

            if (gift.IsItem)
            {
                AddLinesItem(gift, strings, result);
            }
            else if (gift.IsPokémon)
            {
                try
                {
                    AddLinesPKM(gift, strings, result);
                }
                catch { result.Add(MsgMysteryGiftParseFail); }
            }
            else if (gift.IsBP)
            {
                result.Add($"BP: {gift.BP}");
            }
            else if (gift.IsBean)
            {
                result.Add($"Bean ID: {gift.Bean}");
                result.Add($"Quantity: {gift.Quantity}");
            }
            else
            {
                result.Add(MsgMysteryGiftParseTypeUnknown);
            }
            if (gift is WC7 w7)
            {
                result.Add($"Repeatable: {w7.GiftRepeatable}");
                result.Add($"Collected: {w7.GiftUsed}");
                result.Add($"Once Per Day: {w7.GiftOncePerDay}");
            }
            return(result);
        }
コード例 #4
0
        private static void AddLinesPKM(MysteryGift gift, IBasicStrings strings, ICollection <string> result)
        {
            var id = gift.Generation < 7 ? $"{gift.TID:D5}/{gift.SID:D5}" : $"[{gift.TrainerSID7:D4}]{gift.TrainerID7:D6}";

            var first =
                $"{strings.Species[gift.Species]} @ {strings.Item[gift.HeldItem >= 0 ? gift.HeldItem : 0]}  --- "
                + (gift.IsEgg ? strings.EggName : $"{gift.OT_Name} - {id}");

            result.Add(first);
            result.Add(string.Join(" / ", gift.Moves.Select(z => strings.Move[z])));

            if (gift is WC7 wc7)
            {
                var addItem = wc7.AdditionalItem;
                if (addItem != 0)
                {
                    result.Add($"+ {strings.Item[addItem]}");
                }
            }
        }
コード例 #5
0
ファイル: MysteryUtil.cs プロジェクト: asanrom/PKHeX
        private static void AddLinesPKM(MysteryGift gift, IBasicStrings strings, ICollection <string> result)
        {
            int TID7() => (int)((uint)(gift.TID | (gift.SID << 16)) % 1000000);
            int SID7() => (int)((uint)(gift.TID | (gift.SID << 16)) / 1000000);

            var id = gift.Format < 7 ? $"{gift.TID:D5}/{gift.SID:D5}" : $"[{SID7():D4}]{TID7():D6}";

            var first =
                $"{strings.Species[gift.Species]} @ {strings.Item[gift.HeldItem]}  --- "
                + (gift.IsEgg ? strings.EggName : $"{gift.OT_Name} - {id}");

            result.Add(first);
            result.Add(string.Join(" / ", gift.Moves.Select(z => strings.Move[z])));

            if (gift is WC7 wc7)
            {
                var addItem = wc7.AdditionalItem;
                if (addItem != 0)
                {
                    result.Add($"+ {strings.Item[addItem]}");
                }
            }
        }
コード例 #6
0
        private static IReadOnlyList <string> GetSaveFileErrata(this SaveFile SAV, PKM pkm, IBasicStrings strings)
        {
            var errata = new List <string>();

            if (SAV.Generation > 1)
            {
                ushort held = (ushort)pkm.HeldItem;

                if (held > strings.Item.Count)
                {
                    errata.Add($"{MsgIndexItemRange} {held}");
                }
                else if (held > SAV.MaxItemID)
                {
                    errata.Add($"{MsgIndexItemGame} {strings.Item[held]}");
                }
                else if (!pkm.CanHoldItem(SAV.HeldItems))
                {
                    errata.Add($"{MsgIndexItemHeld} {strings.Item[held]}");
                }
            }

            if (pkm.Species > strings.Species.Count)
            {
                errata.Add($"{MsgIndexSpeciesRange} {pkm.Species}");
            }
            else if (SAV.MaxSpeciesID < pkm.Species)
            {
                errata.Add($"{MsgIndexSpeciesGame} {strings.Species[pkm.Species]}");
            }

            if (!SAV.Personal[pkm.Species].IsFormeWithinRange(pkm.AltForm) && !FormConverter.IsValidOutOfBoundsForme(pkm.Species, pkm.AltForm, pkm.GenNumber))
            {
                errata.Add(string.Format(LegalityCheckStrings.V304, Math.Max(0, SAV.Personal[pkm.Species].FormeCount - 1), pkm.AltForm));
            }

            if (pkm.Moves.Any(m => m > strings.Move.Count))
            {
                errata.Add($"{MsgIndexMoveRange} {string.Join(", ", pkm.Moves.Where(m => m > strings.Move.Count).Select(m => m.ToString()))}");
            }
            else if (pkm.Moves.Any(m => m > SAV.MaxMoveID))
            {
                errata.Add($"{MsgIndexMoveGame} {string.Join(", ", pkm.Moves.Where(m => m > SAV.MaxMoveID).Select(m => strings.Move[m]))}");
            }

            if (pkm.Ability > strings.Ability.Count)
            {
                errata.Add($"{MsgIndexAbilityRange} {pkm.Ability}");
            }
            else if (pkm.Ability > SAV.MaxAbilityID)
            {
                errata.Add($"{MsgIndexAbilityGame} {strings.Ability[pkm.Ability]}");
            }

            return(errata);
        }
コード例 #7
0
        /// <summary>
        /// Checks a <see cref="PKM"/> file for compatibility to the <see cref="SaveFile"/>.
        /// </summary>
        /// <param name="SAV"><see cref="SaveFile"/> that is being checked.</param>
        /// <param name="pkm"><see cref="PKM"/> that is being tested for compatibility.</param>
        /// <returns></returns>
        public static IReadOnlyList <string> IsPKMCompatible(this SaveFile SAV, PKM pkm)
        {
            IBasicStrings strings = GameInfo.Strings;

            return(SAV.GetSaveFileErrata(pkm, strings));
        }
コード例 #8
0
    private static IReadOnlyList <string> GetSaveFileErrata(this SaveFile sav, PKM pk, IBasicStrings strings)
    {
        var    errata = new List <string>();
        ushort held   = (ushort)pk.HeldItem;

        if (sav.Generation > 1 && held != 0)
        {
            string?msg = null;
            if (held > sav.MaxItemID)
            {
                msg = MsgIndexItemGame;
            }
            else if (!pk.CanHoldItem(sav.HeldItems))
            {
                msg = MsgIndexItemHeld;
            }
            if (msg != null)
            {
                var itemstr = GameInfo.Strings.GetItemStrings(pk.Format, (GameVersion)pk.Version);
                errata.Add($"{msg} {(held >= itemstr.Length ? held.ToString() : itemstr[held])}");
            }
        }

        if (pk.Species > strings.Species.Count)
        {
            errata.Add($"{MsgIndexSpeciesRange} {pk.Species}");
        }
        else if (sav.MaxSpeciesID < pk.Species)
        {
            errata.Add($"{MsgIndexSpeciesGame} {strings.Species[pk.Species]}");
        }

        if (!sav.Personal[pk.Species].IsFormWithinRange(pk.Form) && !FormInfo.IsValidOutOfBoundsForm(pk.Species, pk.Form, pk.Generation))
        {
            errata.Add(string.Format(LegalityCheckStrings.LFormInvalidRange, Math.Max(0, sav.Personal[pk.Species].FormCount - 1), pk.Form));
        }

        if (pk.Moves.Any(m => m > strings.Move.Count))
        {
            errata.Add($"{MsgIndexMoveRange} {string.Join(", ", pk.Moves.Where(m => m > strings.Move.Count).Select(m => m.ToString()))}");
        }
        else if (pk.Moves.Any(m => m > sav.MaxMoveID))
        {
            errata.Add($"{MsgIndexMoveGame} {string.Join(", ", pk.Moves.Where(m => m > sav.MaxMoveID).Select(m => strings.Move[m]))}");
        }

        if (pk.Ability > strings.Ability.Count)
        {
            errata.Add($"{MsgIndexAbilityRange} {pk.Ability}");
        }
        else if (pk.Ability > sav.MaxAbilityID)
        {
            errata.Add($"{MsgIndexAbilityGame} {strings.Ability[pk.Ability]}");
        }

        return(errata);
    }