示例#1
0
        public virtual bool Validate()
        {
            // note that IsExchanged only becomes true after FlagTraded is
            // called, which currently happens right as the exchanged record
            // is written to the database. So both post.asp and exchange.asp
            // validation is with IsExchanged == 0.
            bool    isExchanged = IsExchanged != 0;
            ushort  species     = isExchanged ? RequestedSpecies : Species;
            Genders gender      = isExchanged ? RequestedGender : Gender;
            byte    minLevel    = isExchanged ? RequestedMinLevel : Level;
            byte    maxLevel    = isExchanged ? RequestedMaxLevel : Level;

            PokemonPartyBase thePokemon = Pokemon;

            if (thePokemon.IsEgg)
            {
                return(false);
            }
            if (thePokemon.SpeciesID != species)
            {
                return(false);
            }
            if (gender != Genders.Either && thePokemon.Gender != gender)
            {
                return(false);
            }
            if (!CheckLevels(minLevel, maxLevel, thePokemon.Level))
            {
                return(false);
            }

            // todo: move these checks to PokemonBase.Validate()
            if (thePokemon.IsBadEgg)
            {
                return(false);
            }
            if (thePokemon.Level > 100)
            {
                return(false);
            }
            if (thePokemon.EVs.ToArray().Select(i => (int)i).Sum() > 510)
            {
                return(false);
            }

            ValidationSummary summary = Pokemon.Validate();

            if (!summary.IsValid)
            {
                return(false);
            }

            return(true);
        }
示例#2
0
        protected override void Load(BinaryReader reader)
        {
            // header (unencrypted)
            Personality = reader.ReadUInt32();                           // 0000
            ushort zero     = reader.ReadUInt16();                       // 0004
            ushort checksum = reader.ReadUInt16();                       // 0006

            // read out the main payload, apply xor decryption
            byte[][] blocks = new byte[4][];
            for (int x = 0; x < 4; x++)                                  // 0008
            {
                blocks[x] = reader.ReadBytes(32);
            }

            DecryptBlocks(blocks, checksum);
            ShuffleBlocks(blocks, Personality, true);

            IsBadEgg = ComputeChecksum(blocks) != checksum;

            int ribbons1, ribbons2, ribbons3;

            {
                byte[] block = blocks[0];

                SpeciesID  = BitConverter.ToUInt16(block, 0);
                HeldItemID = BitConverter.ToUInt16(block, 2);
                TrainerID  = BitConverter.ToUInt32(block, 4);
                Experience = BitConverter.ToInt32(block, 8);
                Happiness  = block[12];
                AbilityID  = block[13];
                Markings   = (Markings)block[14];
                Language   = (Languages)block[15];
                EVs        = new ByteStatValues(block[16],
                                                block[17],
                                                block[18],
                                                block[19],
                                                block[20],
                                                block[21]);
                ContestStats = new ConditionValues(block[22],
                                                   block[23],
                                                   block[24],
                                                   block[25],
                                                   block[26],
                                                   block[27]);

                ribbons2 = BitConverter.ToInt32(block, 28);
            }

            {
                byte[] block = blocks[1];

                Moves[0] = new MoveSlot(m_pokedex, BitConverter.ToUInt16(block, 0), block[12], block[8]);
                Moves[1] = new MoveSlot(m_pokedex, BitConverter.ToUInt16(block, 2), block[13], block[9]);
                Moves[2] = new MoveSlot(m_pokedex, BitConverter.ToUInt16(block, 4), block[14], block[10]);
                Moves[3] = new MoveSlot(m_pokedex, BitConverter.ToUInt16(block, 6), block[15], block[11]);

                int ivs = BitConverter.ToInt32(block, 16);
                IVs         = new IvStatValues(ivs & 0x3fffffff);
                IsEgg       = (ivs & 0x40000000) != 0;
                HasNickname = (ivs & 0x80000000) != 0;

                ribbons1 = BitConverter.ToInt32(block, 20);

                byte forme = block[24];
                FatefulEncounter = (forme & 0x01) != 0;
                m_female         = (forme & 0x02) != 0;
                m_genderless     = (forme & 0x04) != 0;
                FormID           = (byte)(forme >> 3);

                ShinyLeaves = (ShinyLeaves)block[25];
                Unknown1    = BitConverter.ToUInt16(block, 26);

                EggLocationID_Plat = BitConverter.ToUInt16(block, 28);
                LocationID_Plat    = BitConverter.ToUInt16(block, 30);
            }

            {
                byte[] block = blocks[2];

                NicknameEncoded = new EncodedString4(block, 0, 22);
                Unknown2        = block[22];
                Version         = (Versions)block[23];
                ribbons3        = BitConverter.ToInt32(block, 24);
                Unknown3        = BitConverter.ToUInt32(block, 28);
            }

            {
                byte[] block = blocks[3];

                TrainerNameEncoded = new EncodedString4(block, 0, 16);

                // todo: store as DateTime
                EggDate = new byte[3];
                Array.Copy(block, 16, EggDate, 0, 3);
                Date = new byte[3];
                Array.Copy(block, 19, Date, 0, 3);

                EggLocationID = BitConverter.ToUInt16(block, 22);
                LocationID    = BitConverter.ToUInt16(block, 24);
                byte pokerusStatus = block[26];
                PokerusDaysLeft = (byte)(pokerusStatus & 0x0f);
                PokerusStrain   = (byte)(pokerusStatus >> 4);
                PokeBallID      = block[27];

                byte encounter_level = block[28];
                EncounterLevel = (byte)(encounter_level & 0x7f);
                bool trainerFemale = (encounter_level & 0x80) != 0;
                TrainerGender = trainerFemale ? TrainerGenders.Female : TrainerGenders.Male;

                EncounterType   = block[29];
                PokeBallID_Hgss = block[30];
                Unknown4        = block[31];
            }

            byte[] ribbons = new byte[12];
            Array.Copy(BitConverter.GetBytes(ribbons1), 0, ribbons, 0, 4);
            Array.Copy(BitConverter.GetBytes(ribbons2), 0, ribbons, 4, 4);
            Array.Copy(BitConverter.GetBytes(ribbons3), 0, ribbons, 8, 4);

            Ribbons.Clear();
            UnknownRibbons.Clear();

            IDictionary <int, Ribbon> allRibbons = m_pokedex.Ribbons(Generations.Generation4);

            for (int x = 0; x < 96; x++)
            {
                if (PokemonPartyBase.HasRibbon(ribbons, x))
                {
                    if (allRibbons.ContainsKey(x))
                    {
                        Ribbons.Add(allRibbons[x]);
                    }
                    else
                    {
                        UnknownRibbons.Add(x);
                    }
                }
            }
        }
 private static String PokemonImage2(PokemonPartyBase pokemon)
 {
     return PokemonImage2(pokemon.Form, pokemon.Gender);
 }
 public static String PokemonImageSmall(PokemonPartyBase pokemon)
 {
     // todo: shiny minis
     return (pokemon.IsShiny ? "~/images/pkmn-sm/" : "~/images/pkmn-sm/") +
         PokemonImage2(pokemon) + ".png";
 }
 public static String PokemonImageLarge(PokemonPartyBase pokemon)
 {
     return (pokemon.IsShiny ? "~/images/pkmn-lg-s/" : "~/images/pkmn-lg/") +
         PokemonImage2(pokemon) + ".png";
 }