Ejemplo n.º 1
0
        private CheckResult VerifyForm(LegalityAnalysis data)
        {
            var pkm          = data.pkm;
            var PersonalInfo = data.PersonalInfo;

            int count = PersonalInfo.FormeCount;
            var form  = pkm.AltForm;

            if (count <= 1 && form == 0)
            {
                return(VALID); // no forms to check
            }
            var species        = pkm.Species;
            var EncounterMatch = data.EncounterMatch;
            var Info           = data.Info;

            if (!PersonalInfo.IsFormeWithinRange(form) && !AltFormInfo.IsValidOutOfBoundsForme(species, form, Info.Generation))
            {
                return(GetInvalid(string.Format(LFormInvalidRange, count - 1, form)));
            }

            if (EncounterMatch is EncounterSlot w && w.Area.Type == SlotType.FriendSafari)
            {
                VerifyFormFriendSafari(data);
            }
Ejemplo n.º 2
0
 protected virtual bool IsMatchForm(PKM pkm, DexLevel evo)
 {
     if (SkipFormCheck)
     {
         return(true);
     }
     return(Form == evo.Form || AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format));
 }
Ejemplo n.º 3
0
        private static IReadOnlyList <string> GetSaveFileErrata(this SaveFile sav, PKM pkm, IBasicStrings strings)
        {
            var    errata = new List <string>();
            ushort held   = (ushort)pkm.HeldItem;

            if (sav.Generation > 1 && held != 0)
            {
                string?msg = null;
                if (held > sav.MaxItemID)
                {
                    msg = MsgIndexItemGame;
                }
                else if (!pkm.CanHoldItem(sav.HeldItems))
                {
                    msg = MsgIndexItemHeld;
                }
                if (msg != null)
                {
                    var itemstr = GameInfo.Strings.GetItemStrings(pkm.Format, (GameVersion)pkm.Version);
                    errata.Add($"{msg} {(held >= itemstr.Count ? held.ToString() : itemstr[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) && !AltFormInfo.IsValidOutOfBoundsForme(pkm.Species, pkm.AltForm, pkm.GenNumber))
            {
                errata.Add(string.Format(LegalityCheckStrings.LFormInvalidRange, 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);
        }
Ejemplo n.º 4
0
 private static bool IsDisallowedDuplicateForm(int species, int f)
 {
     if (AltFormInfo.IsBattleOnlyForm(species, f, 8))
     {
         return(true);
     }
     if (AltFormInfo.IsFusedForm(species, f, 8))
     {
         return(true);
     }
     return(false);
 }
Ejemplo n.º 5
0
        protected override bool IsMatchForm(PKM pkm, DexLevel evo)
        {
            if (SkipFormCheck)
            {
                return(true);
            }

            if (AltFormInfo.IsTotemForm(Species, Form, Generation))
            {
                var expectForm = pkm.Format == 7 ? Form : AltFormInfo.GetTotemBaseForm(Species, Form);
                return(expectForm == evo.Form);
            }

            return(Form == evo.Form || AltFormInfo.IsFormChangeable(Species, Form, pkm.AltForm, pkm.Format));
        }
Ejemplo n.º 6
0
 private static bool NoHatchFromEggForm(int species, int form, int gen)
 {
     if (form == 0)
     {
         return(false);
     }
     if (AltFormInfo.IsTotemForm(species, form, gen))
     {
         return(true);
     }
     if (species == (int)Species.Pichu)
     {
         return(true);                                                            // can't get Spiky Ear Pichu eggs
     }
     if (species == (int)Species.Sinistea || species == (int)Species.Polteageist) // Antique = impossible
     {
         return(true);                                                            // can't get Antique eggs
     }
     return(false);
 }
Ejemplo n.º 7
0
        public override IEnumerable <EncounterSlot> GetMatchingSlots(PKM pkm, IReadOnlyList <EvoCriteria> chain)
        {
            if (pkm.TSV == 0) // HOME doesn't assign TSV=0 to accounts.
            {
                yield break;
            }

            var sf = chain.FirstOrDefault(z => z.Species == Species && (z.Form == Form || AltFormInfo.IsFormChangeable(Species, Form, z.Form, pkm.Format)));

            if (sf == null)
            {
                yield break;
            }

            var ball  = (Ball)pkm.Ball;
            var stamp = EncounterSlotGO.GetTimeStamp(pkm.Met_Year + 2000, pkm.Met_Month, pkm.Met_Day);
            var met   = Math.Max(sf.MinLevel, pkm.Met_Level);

            foreach (var s in Slots)
            {
                var slot = (EncounterSlot8GO)s;
                if (!slot.IsLevelWithinRange(met))
                {
                    continue;
                }
                if (!slot.IsBallValid(ball))
                {
                    continue;
                }
                if (!slot.Shiny.IsValid(pkm))
                {
                    continue;
                }
                if (!slot.IsWithinStartEnd(stamp))
                {
                    continue;
                }

                if (IsDeferredSlot(slot, pkm))
                {
                    continue;
                }

                yield return(slot);
            }
        }