<commit_before>﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PokemonUnity;
using PokemonUnity.Attack;
using PokemonUnity.Inventory;
using PokemonUnity.Monster;
using PokemonUnity.Monster.Data;

namespace PokemonUnity.Monster
{
    public partial class Pokemon
    {
        #region Variables
		private Pokemons pokemons { get; set; }
        /// <summary>
        /// Current Total HP
        /// </summary>
        public int TotalHP
        {
            get
            {
				//Shedinja can be affected by HP-Up
                if (_base.BaseStatsHP == 1) return 1 + (EV[(int)Stats.HP] / 4);
                return //totalHP;
                    ((2 * _base.BaseStatsHP + IV[(int)Stats.HP] + (EV[(int)Stats.HP] / 4)) * Level) / 100 + Level + 10;
            }
        }
        /// <summary>
        /// Current HP
        /// </summary>
        private int hp { get; set; }
        /// <summary>
        /// Current Attack Stat
        /// </summary>
        public virtual int ATK
        {
            get
            {
                return (int)Math.Floor((((2 * _base.BaseStatsATK + IV[(int)Stats.ATTACK] + (EV[(int)Stats.ATTACK] / 4)) * Level) / 100 + 5) * Game.NatureData[Nature].ATK);
            }
        }
        /// <summary>
        /// Current Defense stat
        /// </summary>
        public virtual int DEF
        {
            get
            {
                return (int)Math.Floor((((2 * _base.BaseStatsDEF + IV[(int)Stats.DEFENSE] + (EV[(int)Stats.DEFENSE] / 4)) * Level) / 100 + 5) * Game.NatureData[Nature].DEF);
            }
        }
        /// <summary>
        /// Current Special Attack Stat
        /// </summary>
        public virtual int SPA
        {
            get
            {
                return (int)Math.Floor((((2 * _base.BaseStatsSPA + IV[(int)Stats.SPATK] + (EV[(int)Stats.SPATK] / 4)) * Level) / 100 + 5) * Game.NatureData[Nature].SPA);
            }
        }
        /// <summary>
        /// Current Special Defense Stat
        /// </summary>
        public virtual int SPD
        {
            get
            {
                return (int)Math.Floor((((2 * _base.BaseStatsSPD + IV[(int)Stats.SPDEF] + (EV[(int)Stats.SPDEF] / 4)) * Level) / 100 + 5) * Game.NatureData[Nature].SPD);
            }
        }
        /// <summary>
        /// Current Speed Stat
        /// </summary>
        public virtual int SPE
        {
            get
            {
                return (int)Math.Floor((((2 * _base.BaseStatsSPE + IV[(int)Stats.SPEED] + (EV[(int)Stats.SPEED] / 4)) * Level) / 100 + 5) * Game.NatureData[Nature].SPE);
            }
        }
        /// <summary>
        /// Array of 6 Individual Values for HP, Atk, Def, Speed, Sp Atk, and Sp Def
        /// </summary>
        public byte[] IV { get; private set; }
        /// <summary>
        /// Effort Values
        /// </summary>
        /// <see cref="EVSTATLIMIT"/>
        /// new int[6] = { 0, 0, 0, 0, 0, 0 }; //same thing
        public byte[] EV { get; private set; }
        /// <summary>
        /// Species (National Pokedex number)
        /// </summary>
        public Pokemons Species { get { return _base.ID; } }
        /// <summary>
        /// Held item
        /// </summary>
        public Items Item { get; private set; }
        /// <summary>
        /// Current experience points
        /// </summary>
        /// <example>
        /// lv1->lv2=5xp
        /// lv2->lv3=10xp
        /// if pokemon is lvl 3 and 0xp, it should have a total of 15xp
        /// but display counter should still say 0
        /// </example>
        /// <remarks>
        /// experience should accumulate accross past levels.
        /// Should also rename to "currentExp"?
        /// </remarks>
        public Experience Exp { get; private set; }
        /// <summary>
        /// Current happiness
        /// </summary>
        /// <remarks>
        /// This is the samething as "friendship";
        /// </remarks>
        public int Happiness { get; private set; }
        /// <summary>
        /// Status problem (PBStatuses)
        /// </summary>
        /// ToDo: Status Class
        public Status Status { get; set; }
        /// <summary>
        /// Sleep count/Toxic flag
        /// </summary>
        /// ToDo: Add to Status Class or StatusTurn() method
        public int StatusCount { get; protected set; }
        /// <summary>
        /// Steps to hatch egg, 0 if Pokemon is not an egg.
        /// Pokemon moves auto reset when egg counter reaches 0.
		/// Double as Friendship Meter after pokemon is hatched.
        /// </summary>
        /// ToDo: Sequence of events to occur when egg is hatching (roll dice for ability, moves, and animate hatching)
		/// ToDo: New variable for Friendship, Math.Abs(EggSteps)?
        public int EggSteps
        {
            get
            {
                return eggSteps;
            }
            private set
            {
                if (eggSteps > 0 && value == 0)
                {
                    this.Level = Core.EGGINITIALLEVEL;
					//if hatching, generate new moves to include egg moves 
					//and everything from current level to below
                    this.GenerateMoveset(egg: true);
                }
                eggSteps =
                    //if egg hatch counter is going up in positive count
                    //eggSteps + 
                    value > eggSteps
                    ? //return the same value
                        eggSteps
                    : //else return new value
                        value;
            }
        }
        private int eggSteps { get; set; }
        /// <summary>
        /// Moves (PBMove)
        /// </summary>
        /// ToDo Move class, not enum
        public Move[] moves { get; private set; }
        /// <summary>
        /// The moves known when this Pokemon was obtained
        /// </summary>
        private List<Moves> firstMoves = new List<Moves>();
        /// <summary>
        /// Ball used
        /// </summary>
        /// ToDo: Interface for Pokeball Only item?
        /// ToDo: None?
        public Items ballUsed { get; private set; }
        //public int[] EvolveLevels { get { return _base.Evolutions.} }
        //public IPokemonEvolution[] Evolutions { get { return _base.Evolutions; } }
        //protected PokemonData _base { get; private set; }
        protected Data.PokemonData _base { get { return Game.PokemonData[pokemons]; } }
        /// <summary>
        /// Max total EVs
        /// </summary>
        public const int EVLIMIT = 510;
        /// <summary>
        /// Max EVs that a single stat can have
        /// </summary>
        /// ToDo: use const instead?
        /// Can be referenced as [Attribute] if is a const value
        public const int EVSTATLIMIT = 252;
        /// <summary>
        /// Maximum length a Pokemon's nickname can be
        /// </summary>
        public const int NAMELIMIT = 10;
        #endregion

        #region Constructor
        /// <summary>
        /// Uses PokemonData to initialize a Pokemon from base stats
        /// </summary>
        public Pokemon()
        {
            //_base = PokemonData.GetPokemon(Pokemons.NONE);
			pokemons = Pokemons.NONE;
            PersonalId = Core.Rand.Next(256);
            PersonalId |= Core.Rand.Next(256) << 8;
            PersonalId |= Core.Rand.Next(256) << 16;
            PersonalId |= Core.Rand.Next(256) << 24;
            Ability = Abilities.NONE;
            Nature = (Natures)new System.Random(Core.Seed()).Next(1, Game.NatureData.Count); //Monster.Nature.GetRandomNature()
			//ToDo: Maybe add TrainerId = <int> here, before isShiny()?
			//shinyFlag = IsShiny; //isShiny(); ToDo: Fix WildPokemon.TrainerId
			//Gender = isMale();
			//IV = new int[] { 10, 10, 10, 10, 10, 10 };
            IV = new byte[] { (byte)Core.Rand.Next(32), (byte)Core.Rand.Next(32), (byte)Core.Rand.Next(32), (byte)Core.Rand.Next(32), (byte)Core.Rand.Next(32), (byte)Core.Rand.Next(32) };
            EV = new byte[6];
            Contest = new byte[6];
            Exp = new Experience(GrowthRate);
			TempLevel = Level;
            moves = new Move[4] { new Move(Moves.NONE), new Move(Moves.NONE), new Move(Moves.NONE), new Move(Moves.NONE) };
            pokerus = new int[2];
            Markings = new bool[6]; //{ false, false, false, false, false, false };
            Status = Status.NONE;
            StatusCount = 0;
            ballUsed = Items.NONE;
            Item = Items.NONE;
            //calcStats();
        }

        /// <summary>
        /// Uses PokemonData to initialize a Pokemon from base stats
        /// </summary>
        /// <param name="pokemon"></param>
        public Pokemon(Pokemons pokemon) : this()
        {
            //_base = PokemonData.GetPokemon(pokemon);
			pokemons = pokemon;
            Exp = new Experience(GrowthRate);
			TempLevel = Level;
			eggSteps = _base.HatchTime;
            Ability = abilityFlag;
            Gender = gender; //GenderRatio.//Pokemon.PokemonData.GetPokemon(pokemon).MaleRatio
			//ToDo: Undo comment
			//Item = (Items)_base.HeldItem[0,Core.pokemonGeneration];
            GenerateMoveset();

            //calcStats();
        }

		/// <summary>
		/// Instializes a new Pokemon, with values at default. 
		/// Pokemon is created at the lowest possible level, 
		/// with all stats randomly generated/assigned (new roll)
		/// </summary>
		/// <param name="pkmn">Pokemon being generated</param>
		/// <param name="isEgg">Whether or not this level 
		/// <see cref="Settings.EGGINITIALLEVEL"/> pokemon is hatched.</param>
        public Pokemon(Pokemons pkmn, bool isEgg) : this(pkmn) { if (!isEgg) EggSteps = 0; }

		/// <summary>
		/// Instializes a new Pokemon, with values at default. 
		/// Pokemon is created at the level assigned in parameter, 
		/// with all stats randomly generated/assigned (new roll)
		/// </summary>
		/// <param name="pkmn">Pokemon being generated</param>
		/// <param name="level">Level this pokemon start ats</param>
		/// <param name="isEgg">Whether or not this pokemon is hatched; 
		/// if pokemon <see cref="isEgg"/> is false, it loses benefits 
		/// of learning egg moves</param>
		public Pokemon(Pokemons pkmn, byte level, bool isEgg = false) : this(pkmn, isEgg) { Level = level; GenerateMoveset(); }

		/// <summary>
		/// Instializes a new Pokemon, with values at default. 
		/// Pokemon is created at the level assigned in parameter, 
		/// with all stats randomly generated/assigned (new roll).
		/// </summary>
		/// <param name="pkmn">Pokemon being generated</param>
		/// <param name="original">Assigns original <see cref="Trainer"/> 
		/// of this pokemon. 
		/// Affects ability to command pokemon, if player is not OT</param>
		/// <param name="level">Level this pokemon start ats</param>
		public Pokemon(Pokemons pkmn, Trainer original, byte level = Core.EGGINITIALLEVEL) : this(pkmn, level: level, isEgg: false) { OT = original; }

        public Pokemon(Pokemons TPSPECIES = Pokemons.NONE,
            byte TPLEVEL = 10,
            Items TPITEM = Items.NONE,
            Moves TPMOVE1 = Moves.NONE,
            Moves TPMOVE2 = Moves.NONE,
            Moves TPMOVE3 = Moves.NONE,
            Moves TPMOVE4 = Moves.NONE,
            Abilities TPABILITY = Abilities.NONE,
            int? TPGENDER = null,
            int TPFORM = 0,
            bool TPSHINY = false,
            Natures TPNATURE = Natures.UNSET,
            byte[] TPIV = null, //new int[6] { 10, 10, 10, 10, 10, 10 },
            int TPHAPPINESS = 70,
            string TPNAME = null,
            bool TPSHADOW = false,
            bool EGG = false,
            Items TPBALL = Items.NONE) : this(TPSPECIES, level: TPLEVEL, isEgg: EGG)
        {
            //Random rand = new Random(Core.Seed());//(int)TPSPECIES+TPLEVEL
            IV = TPIV ?? IV;
            //EV = new int[6];

            //calcStats();
        }

		/// <summary>
		/// This is used SPECIFICALLY for regenerating a pokemon from 
		/// <see cref="PokemonUnity.Saving.SerializableClasses.SeriPokemon"/>
		/// </summary>
		/// <param name="species"></param>
		/// <param name="original"></param>
		/// <param name="nickName"></param>
		/// <param name="form"></param>
		/// <param name="ability"></param>
		/// <param name="nature"></param>
		/// <param name="isShiny"></param>
		/// <param name="gender"></param>
		/// <param name="pokerus"></param>
		/// <param name="ishyper"></param>
		/// <param name="shadowLevel"></param>
		/// <param name="currentHp"></param><commit_msg>Update Pokemon.cs<commit_after>﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PokemonUnity;
using PokemonUnity.Attack;
using PokemonUnity.Inventory;
using PokemonUnity.Monster;
using PokemonUnity.Monster.Data;

namespace PokemonUnity.Monster
{
    public partial class Pokemon
    {
        #region Variables
		private Pokemons pokemons { get; set; }
        /// <summary>
        /// Current Total HP
        /// </summary>
        public int TotalHP
        {
            get
            {
				//Shedinja can be affected by HP-Up
                if (_base.BaseStatsHP == 1) return 1 + (EV[(int)Stats.HP] / 4);
                return //totalHP;
                    ((2 * _base.BaseStatsHP + IV[(int)Stats.HP] + (EV[(int)Stats.HP] / 4)) * Level) / 100 + Level + 10;
            }
        }
        /// <summary>
        /// Current HP
        /// </summary>
        private int hp { get; set; }
        /// <summary>
        /// Current Attack Stat
        /// </summary>
        public virtual int ATK
        {
            get
            {
                return (int)Math.Floor((((2 * _base.BaseStatsATK + IV[(int)Stats.ATTACK] + (EV[(int)Stats.ATTACK] / 4)) * Level) / 100 + 5) * Game.NatureData[Nature].ATK);
            }
        }
        /// <summary>
        /// Current Defense stat
        /// </summary>
        public virtual int DEF
        {
            get
            {
                return (int)Math.Floor((((2 * _base.BaseStatsDEF + IV[(int)Stats.DEFENSE] + (EV[(int)Stats.DEFENSE] / 4)) * Level) / 100 + 5) * Game.NatureData[Nature].DEF);
            }
        }
        /// <summary>
        /// Current Special Attack Stat
        /// </summary>
        public virtual int SPA
        {
            get
            {
                return (int)Math.Floor((((2 * _base.BaseStatsSPA + IV[(int)Stats.SPATK] + (EV[(int)Stats.SPATK] / 4)) * Level) / 100 + 5) * Game.NatureData[Nature].SPA);
            }
        }
        /// <summary>
        /// Current Special Defense Stat
        /// </summary>
        public virtual int SPD
        {
            get
            {
                return (int)Math.Floor((((2 * _base.BaseStatsSPD + IV[(int)Stats.SPDEF] + (EV[(int)Stats.SPDEF] / 4)) * Level) / 100 + 5) * Game.NatureData[Nature].SPD);
            }
        }
        /// <summary>
        /// Current Speed Stat
        /// </summary>
        public virtual int SPE
        {
            get
            {
                return (int)Math.Floor((((2 * _base.BaseStatsSPE + IV[(int)Stats.SPEED] + (EV[(int)Stats.SPEED] / 4)) * Level) / 100 + 5) * Game.NatureData[Nature].SPE);
            }
        }
        /// <summary>
        /// Array of 6 Individual Values for HP, Atk, Def, Speed, Sp Atk, and Sp Def
        /// </summary>
        public byte[] IV { get; private set; }
        /// <summary>
        /// Effort Values
        /// </summary>
        /// <see cref="EVSTATLIMIT"/>
        /// new int[6] = { 0, 0, 0, 0, 0, 0 }; //same thing
        public byte[] EV { get; private set; }
        /// <summary>
        /// Species (National Pokedex number)
        /// </summary>
        public Pokemons Species { get { return _base.ID; } }
        /// <summary>
        /// Held item
        /// </summary>
        public Items Item { get; private set; }
        /// <summary>
        /// Current experience points
        /// </summary>
        /// <example>
        /// lv1->lv2=5xp
        /// lv2->lv3=10xp
        /// if pokemon is lvl 3 and 0xp, it should have a total of 15xp
        /// but display counter should still say 0
        /// </example>
        /// <remarks>
        /// experience should accumulate accross past levels.
        /// Should also rename to "currentExp"?
        /// </remarks>
        public Experience Exp { get; private set; }
        /// <summary>
        /// Current happiness
        /// </summary>
        /// <remarks>
        /// This is the samething as "friendship";
        /// </remarks>
        public int Happiness { get; private set; }
        /// <summary>
        /// Status problem (PBStatuses)
        /// </summary>
        /// ToDo: Status Class
        public Status Status { get; set; }
        /// <summary>
        /// Sleep count/Toxic flag
        /// </summary>
        /// ToDo: Add to Status Class or StatusTurn() method
        public int StatusCount { get; protected set; }
        /// <summary>
        /// Steps to hatch egg, 0 if Pokemon is not an egg.
        /// Pokemon moves auto reset when egg counter reaches 0.
		/// Double as Friendship Meter after pokemon is hatched.
        /// </summary>
        /// ToDo: Sequence of events to occur when egg is hatching (roll dice for ability, moves, and animate hatching)
		/// ToDo: New variable for Friendship, Math.Abs(EggSteps)?
        public int EggSteps
        {
            get
            {
                return eggSteps;
            }
            private set
            {
                if (eggSteps > 0 && value == 0)
                {
                    this.Level = Core.EGGINITIALLEVEL;
					//if hatching, generate new moves to include egg moves 
					//and everything from current level to below
                    this.GenerateMoveset(egg: true);
                }
                eggSteps =
                    //if egg hatch counter is going up in positive count
                    //eggSteps + 
                    value > eggSteps
                    ? //return the same value
                        eggSteps
                    : //else return new value
                        value;
            }
        }
        private int eggSteps { get; set; }
        /// <summary>
        /// Moves (PBMove)
        /// </summary>
        /// ToDo Move class, not enum
        public Move[] moves { get; private set; }
        /// <summary>
        /// The moves known when this Pokemon was obtained
        /// </summary>
        private List<Moves> firstMoves = new List<Moves>();
        /// <summary>
        /// Ball used
        /// </summary>
        /// ToDo: Interface for Pokeball Only item?
        /// ToDo: None?
        public Items ballUsed { get; private set; }
        //public int[] EvolveLevels { get { return _base.Evolutions.} }
        //public IPokemonEvolution[] Evolutions { get { return _base.Evolutions; } }
        //protected PokemonData _base { get; private set; }
        protected Data.PokemonData _base { get { return Game.PokemonData[pokemons]; } }
        /// <summary>
        /// Max total EVs
        /// </summary>
        public const int EVLIMIT = 510;
        /// <summary>
        /// Max EVs that a single stat can have
        /// </summary>
        /// ToDo: use const instead?
        /// Can be referenced as [Attribute] if is a const value
        public const int EVSTATLIMIT = 252;
        /// <summary>
        /// Maximum length a Pokemon's nickname can be
        /// </summary>
        public const int NAMELIMIT = 10;
        #endregion

        #region Constructor
        /// <summary>
        /// Uses PokemonData to initialize a Pokemon from base stats
        /// </summary>
        public Pokemon()
        {
            //_base = PokemonData.GetPokemon(Pokemons.NONE);
			pokemons = Pokemons.NONE;
            PersonalId = Core.Rand.Next(256);
            PersonalId |= Core.Rand.Next(256) << 8;
            PersonalId |= Core.Rand.Next(256) << 16;
            PersonalId |= Core.Rand.Next(256) << 24;
            Ability = Abilities.NONE;
            Nature = (Natures)new System.Random(Core.Seed()).Next(1, Game.NatureData.Count); //Monster.Nature.GetRandomNature()
			//ToDo: Maybe add TrainerId = <int> here, before isShiny()?
			//shinyFlag = IsShiny; //isShiny(); ToDo: Fix WildPokemon.TrainerId
			//Gender = isMale();
			//IV = new int[] { 10, 10, 10, 10, 10, 10 };
            IV = new byte[] { (byte)Core.Rand.Next(32), (byte)Core.Rand.Next(32), (byte)Core.Rand.Next(32), (byte)Core.Rand.Next(32), (byte)Core.Rand.Next(32), (byte)Core.Rand.Next(32) };
            EV = new byte[6];
            Contest = new byte[6];
            Exp = new Experience(GrowthRate);
			TempLevel = Level;
            moves = new Move[4] { new Move(Moves.NONE), new Move(Moves.NONE), new Move(Moves.NONE), new Move(Moves.NONE) };
            pokerus = new int[2];
            Markings = new bool[6]; //{ false, false, false, false, false, false };
            Status = Status.NONE;
            StatusCount = 0;
            ballUsed = Items.NONE;
            Item = Items.NONE;
            //calcStats();
        }

        /// <summary>
        /// Uses PokemonData to initialize a Pokemon from base stats
        /// </summary>
        /// <param name="pokemon"></param>
        public Pokemon(Pokemons pokemon) : this()
        {
            //_base = PokemonData.GetPokemon(pokemon);
			pokemons = pokemon;
            Exp = new Experience(GrowthRate);
			TempLevel = Level;
			eggSteps = _base.HatchTime;
            Ability = abilityFlag;
            Gender = gender; //GenderRatio.//Pokemon.PokemonData.GetPokemon(pokemon).MaleRatio
			//ToDo: Undo comment
			//Item = (Items)_base.HeldItem[0,Core.pokemonGeneration];
            GenerateMoveset();

            //calcStats();
        }

		/// <summary>
		/// Instializes a new Pokemon, with values at default. 
		/// Pokemon is created at the lowest possible level, 
		/// with all stats randomly generated/assigned (new roll)
		/// </summary>
		/// <param name="pkmn">Pokemon being generated</param>
		/// <param name="isEgg">Whether or not this level 
		/// <see cref="Settings.EGGINITIALLEVEL"/> pokemon is hatched.</param>
        public Pokemon(Pokemons pkmn, bool isEgg) : this(pkmn) { if (!isEgg) EggSteps = 0; }

		/// <summary>
		/// Instializes a new Pokemon, with values at default. 
		/// Pokemon is created at the level assigned in parameter, 
		/// with all stats randomly generated/assigned (new roll)
		/// </summary>
		/// <param name="pkmn">Pokemon being generated</param>
		/// <param name="level">Level this pokemon start ats</param>
		/// <param name="isEgg">Whether or not this pokemon is hatched; 
		/// if pokemon <see cref="isEgg"/> is false, it loses benefits 
		/// of learning egg moves</param>
		public Pokemon(Pokemons pkmn, byte level, bool isEgg = false) : this(pkmn, isEgg) { Level = level; GenerateMoveset(); }

		/// <summary>
		/// Instializes a new Pokemon, with values at default. 
		/// Pokemon is created at the level assigned in parameter, 
		/// with all stats randomly generated/assigned (new roll).
		/// </summary>
		/// <param name="pkmn">Pokemon being generated</param>
		/// <param name="original">Assigns original <see cref="Trainer"/> 
		/// of this pokemon. 
		/// Affects ability to command pokemon, if player is not OT</param>
		/// <param name="level">Level this pokemon start ats</param>
		public Pokemon(Pokemons pkmn, Trainer original, byte level = Core.EGGINITIALLEVEL) : this(pkmn, level: level, isEgg: false) { OT = original; }

        public Pokemon(Pokemons TPSPECIES = Pokemons.NONE,
            byte TPLEVEL = 10,
            Items TPITEM = Items.NONE,
            Moves TPMOVE1 = Moves.NONE,
            Moves TPMOVE2 = Moves.NONE,
            Moves TPMOVE3 = Moves.NONE,
            Moves TPMOVE4 = Moves.NONE,
            Abilities TPABILITY = Abilities.NONE,
            int? TPGENDER = null,
            int TPFORM = 0,
            bool TPSHINY = false,
            Natures TPNATURE = Natures.UNSET,
            byte[] TPIV = null, //new int[6] { 10, 10, 10, 10, 10, 10 },
            int TPHAPPINESS = 70,
            string TPNAME = null,
            bool TPSHADOW = false,
            bool EGG = false,
            Items TPBALL = Items.NONE) : this(TPSPECIES, level: TPLEVEL, isEgg: EGG)
        {
            //Random rand = new Random(Core.Seed());//(int)TPSPECIES+TPLEVEL
            IV = TPIV ?? IV;
            //EV = new int[6];

			/*# Japanese Dream World Squirtle from http://projectpokemon.org/events
			blob = base64.b64decode('J2ZqBgAAICQHAAAAkOaKyTACAABGLAABAAAAAAAAAAAAAAAAA'
			'AAAACEAJwCRAG4AIx4eKAAAAAD171MHAAAAAAAAAQAAAAAAvDDLMKww4TD//wAAAAAAAA'
			'AAAAD//wAVAAAAAAAAAAAw/zD/T/9S/0f///8AAAAAAAAACgoOAABLAAAZCgAAAA==')
		{
			'ability': {'id': 44, 'name': u'Rain Dish'},
			'date met': '2010-10-14',
			'gender': 'male',
			'genes': {u'attack': 31,
					u'defense': 27,
					u'hp': 21,
					u'special attack': 21,
					u'special defense': 3,
					u'speed': 7},
			'happiness': 70,
			'level': 10,
			'met at level': 10,
			'met location': {'id_dp': 75, 'name': u'Spring Path'},
			'moves': [{'id': 33, 'name': u'Tackle', 'pp': 35},
					{'id': 39, 'name': u'Tail Whip', 'pp': 30},
					{'id': 145, 'name': u'Bubble', 'pp': 30},
					{'id': 110, 'name': u'Withdraw', 'pp': 40}],
			'nickname': u'ゼニガメ',
			'nickname trash': 'vDDLMKww4TD//wAAAAAAAAAAAAD//w==',
			'nicknamed': False,
			'oiginal trainer': {'gender': 'male',
								'id': 59024,
								'name': u'ＰＰｏｒｇ',
								'secret': 51594},
			'original country': 'jp',
			'original version': 21,
			'personality': 107636263,
			'pokeball': {'id_dppt': 25, 'name': u'Hyper Potion'},
			'species': {'id': 7, 'name': u'Squirtle'}
		}*/

			//calcStats();
		}

		/// <summary>
		/// This is used SPECIFICALLY for regenerating a pokemon from 
		/// <see cref="PokemonUnity.Saving.SerializableClasses.SeriPokemon"/>
		/// </summary>
		/// <param name="species"></param>
		/// <param name="original"></param>
		/// <param name="nickName"></param>
		/// <param name="form"></param>
		/// <param name="ability"></param>
		/// <param name="nature"></param>
		/// <param name="isShiny"></param>
		/// <param name="gender"></param>
		/// <param name="pokerus"></param>
		/// <param name="ishyper"></param>
		/// <param name="shadowLevel"></param>
		/// <param name="currentHp"></param>
{'fraction_non_alphanumeric': 0.14296520423600606, 'fraction_numerical': 0.014183055975794251, 'mean_word_length': 1.715239268843705, 'pattern_counts': {'":': 0, '<': 239, '<?xml version=': 0, '>': 235, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 6, 'word_list_counts': {'cursed_substrings.json': 4, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '915731', 'n_tokens_mistral': 8687, 'n_tokens_neox': 7813, 'n_words': 2197}