Ejemplo n.º 1
0
        private static bool GetIsMatchWC7(PKM pkm, WC7 wc, IEnumerable <DexLevel> vs)
        {
            if (pkm.Egg_Location == 0) // Not Egg
            {
                if (wc.OTGender != 3)
                {
                    if (wc.SID != pkm.SID)
                    {
                        return(false);
                    }
                    if (wc.TID != pkm.TID)
                    {
                        return(false);
                    }
                    if (wc.OTGender != pkm.OT_Gender)
                    {
                        return(false);
                    }
                }
                if (!string.IsNullOrEmpty(wc.OT_Name) && wc.OT_Name != pkm.OT_Name)
                {
                    return(false);
                }
                if (wc.OriginGame != 0 && wc.OriginGame != pkm.Version)
                {
                    return(false);
                }
                if (wc.EncryptionConstant != 0 && wc.EncryptionConstant != pkm.EncryptionConstant)
                {
                    return(false);
                }
                if (wc.Language != 0 && wc.Language != pkm.Language)
                {
                    return(false);
                }
            }
            if (wc.Form != pkm.AltForm && vs.All(dl => !IsFormChangeable(pkm, dl.Species)))
            {
                if (wc.Species == 744 && wc.Form == 1 && pkm.Species == 745 && pkm.AltForm == 2)
                {
                    // Rockruff gift edge case; has altform 1 then evolves to altform 2
                }
                else
                {
                    return(false);
                }
            }

            if (wc.IsEgg)
            {
                if (wc.EggLocation != pkm.Egg_Location) // traded
                {
                    if (pkm.Egg_Location != 30002)
                    {
                        return(false);
                    }
                }
                else if (wc.PIDType == 0 && pkm.IsShiny)
                {
                    return(false); // can't be traded away for unshiny
                }
                if (pkm.IsEgg && !pkm.IsNative)
                {
                    return(false);
                }
            }
            else
            {
                if (!wc.PIDType.IsValid(pkm))
                {
                    return(false);
                }
                if (wc.EggLocation != pkm.Egg_Location)
                {
                    return(false);
                }
                if (wc.MetLocation != pkm.Met_Location)
                {
                    return(false);
                }
            }

            if (wc.MetLevel != pkm.Met_Level)
            {
                return(false);
            }
            if (wc.Ball != pkm.Ball)
            {
                return(false);
            }
            if (wc.OTGender < 3 && wc.OTGender != pkm.OT_Gender)
            {
                return(false);
            }
            if (wc.Nature != 0xFF && wc.Nature != pkm.Nature)
            {
                return(false);
            }
            if (wc.Gender != 3 && wc.Gender != pkm.Gender)
            {
                return(false);
            }

            if (pkm.IsContestBelow(wc))
            {
                return(false);
            }

            switch (wc.CardID)
            {
            case 1624:     // Rockruff
                if (pkm.Species == 745 && pkm.AltForm != 2)
                {
                    return(false);
                }
                if (pkm.Version == (int)GameVersion.US)
                {
                    return(wc.Move3 == 424);    // Fire Fang
                }
                if (pkm.Version == (int)GameVersion.UM)
                {
                    return(wc.Move3 == 422);    // Thunder Fang
                }
                return(false);

            case 2046:          // Ash Greninja
                return(pkm.SM); // not USUM
            }
            return(true);
        }
Ejemplo n.º 2
0
        private static bool GetIsMatchWC6(PKM pkm, WC6 wc, IEnumerable <DexLevel> vs)
        {
            if (pkm.Egg_Location == 0) // Not Egg
            {
                if (wc.CardID != pkm.SID)
                {
                    return(false);
                }
                if (wc.TID != pkm.TID)
                {
                    return(false);
                }
                if (wc.OT_Name != pkm.OT_Name)
                {
                    return(false);
                }
                if (wc.OTGender != pkm.OT_Gender)
                {
                    return(false);
                }
                if (wc.PIDType == Shiny.FixedValue && pkm.PID != wc.PID)
                {
                    return(false);
                }
                if (!wc.PIDType.IsValid(pkm))
                {
                    return(false);
                }
                if (wc.OriginGame != 0 && wc.OriginGame != pkm.Version)
                {
                    return(false);
                }
                if (wc.EncryptionConstant != 0 && wc.EncryptionConstant != pkm.EncryptionConstant)
                {
                    return(false);
                }
                if (wc.Language != 0 && wc.Language != pkm.Language)
                {
                    return(false);
                }
            }
            if (wc.Form != pkm.AltForm && vs.All(dl => !IsFormChangeable(pkm, dl.Species)))
            {
                return(false);
            }

            if (wc.IsEgg)
            {
                if (wc.EggLocation != pkm.Egg_Location) // traded
                {
                    if (pkm.Egg_Location != 30002)
                    {
                        return(false);
                    }
                }
                else if (wc.PIDType == 0 && pkm.IsShiny)
                {
                    return(false); // can't be traded away for unshiny
                }
                if (pkm.IsEgg && !pkm.IsNative)
                {
                    return(false);
                }
            }
            else
            {
                if (wc.EggLocation != pkm.Egg_Location)
                {
                    return(false);
                }
                if (wc.MetLocation != pkm.Met_Location)
                {
                    return(false);
                }
            }

            if (wc.Level != pkm.Met_Level)
            {
                return(false);
            }
            if (wc.Ball != pkm.Ball)
            {
                return(false);
            }
            if (wc.OTGender < 3 && wc.OTGender != pkm.OT_Gender)
            {
                return(false);
            }
            if (wc.Nature != 0xFF && wc.Nature != pkm.Nature)
            {
                return(false);
            }
            if (wc.Gender != 3 && wc.Gender != pkm.Gender)
            {
                return(false);
            }

            if (pkm.IsContestBelow(wc))
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 3
0
        private static bool GetIsMatchStatic(PKM pkm, EncounterStatic e, int lvl)
        {
            if (e.Nature != Nature.Random && pkm.Nature != (int)e.Nature)
            {
                return(false);
            }
            if (pkm.WasEgg != e.EggEncounter && pkm.Egg_Location == 0 && pkm.Format > 3 && pkm.GenNumber > 3 && !pkm.IsEgg)
            {
                return(false);
            }
            if (e is EncounterStaticPID p && p.PID != pkm.PID)
            {
                return(false);
            }

            if (pkm.Gen3 && e.EggLocation != 0) // Gen3 Egg
            {
                if (pkm.Format == 3 && pkm.IsEgg && e.EggLocation != pkm.Met_Location)
                {
                    return(false);
                }
            }
            else if (pkm.VC || pkm.GenNumber <= 2 && e.EggLocation != 0) // Gen2 Egg
            {
                if (pkm.Format <= 2)
                {
                    if (pkm.IsEgg)
                    {
                        if (pkm.Met_Location != 0 && pkm.Met_Level != 0)
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        switch (pkm.Met_Level)
                        {
                        case 0 when pkm.Met_Location != 0:
                            return(false);

                        case 1 when pkm.Met_Location == 0:
                            return(false);

                        default:
                            if (pkm.Met_Location == 0 && pkm.Met_Level != 0)
                            {
                                return(false);
                            }
                            break;
                        }
                    }
                    if (pkm.Met_Level == 1)
                    {
                        lvl = 5; // met @ 1, hatch @ 5.
                    }
                }
            }
            else if (e.EggLocation != pkm.Egg_Location)
            {
                if (pkm.IsEgg) // unhatched
                {
                    if (e.EggLocation != pkm.Met_Location)
                    {
                        return(false);
                    }
                    if (pkm.Egg_Location != 0)
                    {
                        return(false);
                    }
                }
                else if (pkm.Gen4)
                {
                    if (pkm.Egg_Location != 2002) // Link Trade
                    {
                        // check Pt/HGSS data
                        if (pkm.Format <= 4)
                        {
                            return(false);                                  // must match
                        }
                        if (e.EggLocation >= 3000 || e.EggLocation <= 2010) // non-Pt/HGSS egg gift
                        {
                            return(false);
                        }

                        // transferring 4->5 clears pt/hgss location value and keeps Faraway Place
                        if (pkm.Egg_Location != 3002) // Faraway Place
                        {
                            return(false);
                        }
                    }
                }
                else
                {
                    if (pkm.Egg_Location != 30002) // Link Trade
                    {
                        return(false);
                    }
                }
            }
            else if (e.EggLocation != 0 && pkm.Gen4)
            {
                // Check the inverse scenario for 4->5 eggs
                if (e.EggLocation < 3000 && e.EggLocation > 2010) // Pt/HGSS egg gift
                {
                    if (pkm.Format > 4)
                    {
                        return(false); // locations match when it shouldn't
                    }
                }
            }

            if (pkm.HasOriginalMetLocation)
            {
                if (!e.EggEncounter && e.Location != 0 && e.Location != pkm.Met_Location)
                {
                    return(false);
                }
                if (e.Level != lvl)
                {
                    if (!(pkm.Format == 3 && e.EggEncounter && lvl == 0))
                    {
                        return(false);
                    }
                }
            }
            else if (e.Level > lvl)
            {
                return(false);
            }

            if (e.Gender != -1 && e.Gender != pkm.Gender)
            {
                return(false);
            }
            if (e.Form != pkm.AltForm && !e.SkipFormCheck && !IsFormChangeable(pkm, e.Species))
            {
                return(false);
            }
            if (e.EggLocation == 60002 && e.Relearn[0] == 0 && pkm.RelearnMoves.Any(z => z != 0)) // gen7 eevee edge case
            {
                return(false);
            }

            if (e.IVs != null && (e.Generation > 2 || pkm.Format <= 2)) // 1,2->7 regenerates IVs, only check if original IVs still exist
            {
                for (int i = 0; i < 6; i++)
                {
                    if (e.IVs[i] != -1 && e.IVs[i] != pkm.IVs[i])
                    {
                        return(false);
                    }
                }
            }

            if (pkm.IsContestBelow(e))
            {
                return(false);
            }

            // Defer to EC/PID check
            // if (e.Shiny != null && e.Shiny != pkm.IsShiny)
            // continue;

            // Defer ball check to later
            // if (e.Gift && pkm.Ball != 4) // PokéBall
            // continue;

            if (pkm is PK1 pk1 && pk1.Gen1_NotTradeback && !IsValidCatchRatePK1(e, pk1))
            {
                return(false);
            }

            if (!AllowGBCartEra && GameVersion.GBCartEraOnly.Contains(e.Version))
            {
                return(false);
            }
            return(true);
        }
Ejemplo n.º 4
0
        private static bool GetIsMatchPCD(PKM pkm, PKM wc, IEnumerable <DexLevel> vs)
        {
            if (!wc.IsEgg)
            {
                if (wc.TID != pkm.TID)
                {
                    return(false);
                }
                if (wc.SID != pkm.SID)
                {
                    return(false);
                }
                if (wc.OT_Name != pkm.OT_Name)
                {
                    return(false);
                }
                if (wc.OT_Gender != pkm.OT_Gender)
                {
                    return(false);
                }
                if (wc.Language != 0 && wc.Language != pkm.Language)
                {
                    return(false);
                }

                if (pkm.Format != 4) // transferred
                {
                    // met location: deferred to general transfer check
                    if (wc.CurrentLevel > pkm.Met_Level)
                    {
                        return(false);
                    }
                }
                else
                {
                    if (wc.Egg_Location + 3000 != pkm.Met_Location)
                    {
                        return(false);
                    }
                    if (wc.CurrentLevel != pkm.Met_Level)
                    {
                        return(false);
                    }
                }
            }
            else // Egg
            {
                if (wc.Egg_Location + 3000 != pkm.Egg_Location && pkm.Egg_Location != 2002) // traded
                {
                    return(false);
                }
                if (wc.CurrentLevel != pkm.Met_Level)
                {
                    return(false);
                }
                if (pkm.IsEgg && !pkm.IsNative)
                {
                    return(false);
                }
            }

            if (wc.AltForm != pkm.AltForm && vs.All(dl => !IsFormChangeable(pkm, dl.Species)))
            {
                return(false);
            }

            if (wc.Ball != pkm.Ball)
            {
                return(false);
            }
            if (wc.OT_Gender < 3 && wc.OT_Gender != pkm.OT_Gender)
            {
                return(false);
            }
            if (wc.PID == 1 && pkm.IsShiny)
            {
                return(false);
            }
            if (wc.Gender != 3 && wc.Gender != pkm.Gender)
            {
                return(false);
            }

            if (pkm.IsContestBelow(wc))
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 5
0
        private static bool IsEncounterTradeValid(PKM pkm, EncounterTrade z, int lvl)
        {
            if (z.IVs != null)
            {
                for (int i = 0; i < 6; i++)
                {
                    if (z.IVs[i] != -1 && z.IVs[i] != pkm.IVs[i])
                    {
                        return(false);
                    }
                }
            }

            if (z is EncounterTradePID p)
            {
                if (p.PID != pkm.EncryptionConstant)
                {
                    return(false);
                }
                if (z.Nature != Nature.Random && (int)z.Nature != pkm.Nature) // gen5 BW only
                {
                    return(false);
                }
            }
            else
            {
                if (!z.Shiny.IsValid(pkm))
                {
                    return(false);
                }
                if (z.Nature != Nature.Random && (int)z.Nature != pkm.Nature)
                {
                    return(false);
                }
                if (z.Gender != -1 && z.Gender != pkm.Gender)
                {
                    return(false);
                }
            }
            if (z.TID != pkm.TID)
            {
                return(false);
            }
            if (z.SID != pkm.SID)
            {
                return(false);
            }
            if (pkm.HasOriginalMetLocation)
            {
                var loc = z.Location > 0 ? z.Location : EncounterTrade.DefaultMetLocation[z.Generation - 1];
                if (loc != pkm.Met_Location)
                {
                    return(false);
                }
                if (pkm.Format < 5)
                {
                    if (z.Level > lvl)
                    {
                        return(false);
                    }
                }
                else if (z.Level != lvl)
                {
                    return(false);
                }
            }
            else if (z.Level > lvl)
            {
                return(false);
            }

            if (z.CurrentLevel != -1 && z.CurrentLevel > pkm.CurrentLevel)
            {
                return(false);
            }

            if (z.Form != pkm.AltForm && !IsFormChangeable(pkm, pkm.Species))
            {
                return(false);
            }
            if (z.OTGender != -1 && z.OTGender != pkm.OT_Gender)
            {
                return(false);
            }
            if (z.EggLocation != pkm.Egg_Location)
            {
                return(false);
            }
            // if (z.Ability == 4 ^ pkm.AbilityNumber == 4) // defer to Ability
            //    countinue;

            if (pkm.IsContestBelow(z))
            {
                return(false);
            }

            return(true);
        }