Exemplo n.º 1
0
        public Pokemon(Species species, uint level, uint form_id = 0, string nickname = "",
                       Nullable <int> ability_id = null, Nullable <Genders> gender    = null,
                       Nullable <Natures> nature = null, Nullable <bool> is_shiny     = null,
                       Items.Items ball_used     = Items.Items.PokeBall, Trainer ot   = null,
                       ObtainModes obtain_mode   = ObtainModes.Met)
        {
            // Trainer
            if (ot == null)
            {
                ot = GameObject.FindObjectOfType <PlayerTrainer>();
            }
            this.trainer_id              = ot.trainer_id;
            this.original_trainer        = ot.name;
            this.original_trainer_gender = ot.gender;

            // Form
            Form alt_form = Form.GetFormData(species, form_id);

            if (alt_form != null)
            {
                this.form_id = alt_form.form_id;
            }
            else
            {
                this.form_id = 0;
            }

            // Personal ID Creation
            this.personal_id = GeneratePokemonID();
            this.public_id   = this.personal_id & 0x0000FFFF;

            // Constant among species
            Specie specie = Specie.species[species];

            this.species = species;
            if (alt_form != null && alt_form.types.Length > 0)
            {
                this.types = alt_form.types;
            }
            else
            {
                this.types = specie.types;
            }

            // Level and experience
            this.level = level;
            this.exp   = Experience.GetLevelTotalExp(level, specie.growth_rate);

            // Nickname
            this.nickname = nickname;

            // Ability (determined by personal id)
            if (ability_id != null)
            {
                this.force_ability = ability_id;
                if (ability_id == 0)
                {
                    if (alt_form != null && alt_form.abilities.Length > 0)
                    {
                        this.ability = alt_form.abilities[0];
                    }
                    else
                    {
                        this.ability = specie.abilities[0];
                    }
                }
                else if (ability_id == 1)
                {
                    if (alt_form != null && alt_form.abilities.Length > 1)
                    {
                        this.ability = alt_form.abilities[1];
                    }
                    else if (specie.abilities.Length > 1)
                    {
                        this.ability = specie.abilities[1];
                    }
                    else
                    {
                        this.ability = Ability.GetAbilityFromID(this.personal_id, specie.abilities);
                    }
                }
                else if (ability_id == 2)
                {
                    if (alt_form != null && alt_form.hidden_ability.Length > 0)
                    {
                        this.ability = alt_form.hidden_ability[0];
                    }
                    else if (specie.hidden_ability.Length > 0)
                    {
                        this.ability = specie.hidden_ability[0];
                    }
                    else
                    {
                        this.ability = Ability.GetAbilityFromID(this.personal_id, specie.abilities);
                    }
                }
                else
                {
                    this.ability = Ability.GetAbilityFromID(this.personal_id, specie.abilities);
                }
            }
            else
            {
                if (alt_form != null && alt_form.abilities.Length > 0)
                {
                    this.ability = Ability.GetAbilityFromID(this.personal_id, alt_form.abilities);
                }
                else
                {
                    this.ability = Ability.GetAbilityFromID(this.personal_id, specie.abilities);
                }
            }

            // Gender (determined by personal id)
            if (gender != null)
            {
                this.force_gender = (Genders)gender;
                if (gender == Genders.Male && specie.gender_rate != GenderRates.Genderless &&
                    specie.gender_rate != GenderRates.AlwaysFemale)
                {
                    this.gender = (Genders)gender;
                }
                else if (gender == Genders.Female && specie.gender_rate != GenderRates.Genderless &&
                         specie.gender_rate != GenderRates.AlwaysMale)
                {
                    this.gender = (Genders)gender;
                }
                else
                {
                    this.gender = Breeding.GetGenderFromID(this.personal_id, specie.gender_rate);
                }
            }
            else
            {
                this.gender = Breeding.GetGenderFromID(this.personal_id, specie.gender_rate);
            }

            // Nature (determined by personal id)
            if (nature != null)
            {
                this.force_nature = nature;
                if ((int)nature >= 0 && (int)nature < 25)
                {
                    this.nature = (Natures)nature;
                }
                else
                {
                    this.nature = Nature.GetNatureFromID(this.personal_id);
                }
            }
            else
            {
                this.nature = Nature.GetNatureFromID(this.personal_id);
            }

            // Shininess (determined by personal id and trainer id)
            if (is_shiny != null)
            {
                this.force_shiny = is_shiny;
                this.is_shiny    = (bool)is_shiny;
            }
            else
            {
                this.is_shiny = GetShininessFromIDs(this.personal_id, ot.trainer_id, ot.secret_id);
            }

            // IVs and EVs
            StatArray ivs = Stat.GenerateRandomIVs();

            this.ivs = ivs;
            StatArray evs = new StatArray();

            this.evs = evs;

            // Stats
            if (alt_form != null && alt_form.base_stats.HP > 0)
            {
                this.stats = Stat.CalculateStats(alt_form.base_stats, ivs, evs, level, this.nature);
            }
            else
            {
                this.stats = Stat.CalculateStats(specie.base_stats, ivs, evs, level, this.nature);
            }

            // Current HP
            this.current_HP = this.stats.HP;

            // Friendship
            if (alt_form != null && alt_form.happiness != 0 && alt_form.happiness != specie.happiness)
            {
                // TODO: If alt form has set happiness of 0 this doesn't work...
                // don't think this ever comes up though
                this.happiness = alt_form.happiness;
            }
            else
            {
                this.happiness = specie.happiness;
            }

            // Status Condition
            this.status           = Statuses.None;
            this.status_parameter = 0;

            // Egg Steps
            this.egg_steps = 0;

            // Set Moves
            if (alt_form != null && alt_form.moves.Length > 0)
            {
                this.moves = Move.GeneratePokemonMoveSlots(alt_form.moves, level);
            }

            else
            {
                this.moves = Move.GeneratePokemonMoveSlots(specie.moves, level);
            }

            // Ball Used and Held Item
            this.ball_used = ball_used;
            this.held_item = Items.Items.None;
            this.mail      = null;

            // Pokerus Status
            this.pokerus_status = 0;

            // Fused Pokemon
            this.fused_pokemon = null;

            // Contest Stats
            this.contest_stats = new ContestStatArray();

            // Markings
            this.markings = new bool[Constants.NUM_MARKINGS];

            // Ribbons
            this.ribbons = new bool[Ribbons.NUM_RIBBONS];

            // Obtain info
            this.obtain_mode  = obtain_mode;
            this.obtain_date  = DateTime.Now;
            this.obtain_map   = null; // TODO: Implement this
            this.obtain_level = level;
            this.hatched_map  = null;
            this.obtain_text  = null;

            // Language
            this.language = Languages.English; // TODO: Implement different options
        }