public BasePokemonMove(string n, RedLib.PokemonTypes t, byte bp, RedLib.physicalSpecial pS, Action moveFunc)
 {
     Name         = n;
     type         = t;
     basePower    = bp;
     moveFunction = moveFunc;
 }
 public BasePokemon(byte[] stats,
                    string[] ab,
                    Dictionary <int, BasePokemonMove> lS,
                    string n = "",
                    RedLib.PokemonTypes tP = RedLib.PokemonTypes.typeless,
                    RedLib.PokemonTypes tS = RedLib.PokemonTypes.typeless
                    )
 {
     Name       = n;
     types      = new Tuple <RedLib.PokemonTypes, RedLib.PokemonTypes>(tP, tS);
     statistics = stats;
     ability    = ab;
     learnSet   = lS;
 }
        public Tuple <RedLib.PokemonTypes, RedLib.PokemonTypes> getType()
        {
            //experimental score-based typing system

            /*Dictionary<RedLib.PokemonTypes, int> typescores = new Dictionary<RedLib.PokemonTypes, int>();
             * RedLib.PokemonTypes type1 = dexBase.headComponent.types.Item1;
             * RedLib.PokemonTypes type2 = (dexBase.fused ? dexBase.bodyComponent.types.Item2 : dexBase.headComponent.types.Item2);
             * if (dexBase.fused)
             * {
             *  typescores.Add(dexBase.headComponent.types.Item1, 2);
             *  if (dexBase.headComponent.types.Item2 != RedLib.PokemonTypes.typeless)
             *  {
             *      typescores.Add(dexBase.headComponent.types.Item2, 1);
             *  }
             *
             *  if (typescores.ContainsKey(dexBase.bodyComponent.types.Item1))
             *  {
             *      typescores[dexBase.bodyComponent.types.Item1]++;
             *  }
             *  else
             *  {
             *      typescores.Add(dexBase.bodyComponent.types.Item1, 1);
             *  }
             *
             *  if (dexBase.bodyComponent.types.Item2 != RedLib.PokemonTypes.typeless &&
             *      typescores.ContainsKey(dexBase.bodyComponent.types.Item2))
             *  {
             *      typescores[dexBase.bodyComponent.types.Item2]++;
             *  }
             *  else
             *  {
             *      typescores.Add(dexBase.bodyComponent.types.Item2, 2);
             *  }
             *
             *  foreach (var item in typescores)
             *  {
             *      if (item.Value > typescores[dexBase.headComponent.types.Item1])
             *      {
             *          type1 = item.Key;
             *      }
             *      if (item.Value > typescores[dexBase.bodyComponent.types.Item2])
             *      {
             *          type2 = item.Key;
             *      }
             *  }
             * }
             *
             *
             * return new Tuple<RedLib.PokemonTypes, RedLib.PokemonTypes>(type1, type2);*/

            // traditional priority-based typing system

            RedLib.PokemonTypes type1 = dexBase.headComponent.types.Item1;
            RedLib.PokemonTypes type2 = dexBase.fused ?
                                        (dexBase.bodyComponent.types.Item2 == RedLib.PokemonTypes.typeless ?
                                         dexBase.bodyComponent.types.Item1 :
                                         dexBase.bodyComponent.types.Item2):
                                        dexBase.headComponent.types.Item2;

            return(new Tuple <RedLib.PokemonTypes, RedLib.PokemonTypes>(type1, type2));
        }