diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..520a863 --- /dev/null +++ b/.gitignore @@ -0,0 +1,55 @@ +# Built application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# Intellij +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/dictionaries +.idea/libraries + +# Keystore files +*.jks + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..a6cb5d5 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..3b31283 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..b0a270f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..3190ef1 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..008156c --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,36 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 26 + buildToolsVersion "26.0.1" + defaultConfig { + applicationId "com.example.nzp.pokedex" + minSdkVersion 15 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + + compile 'com.android.support:appcompat-v7:26.0.0-alpha1' + compile 'com.android.support.constraint:constraint-layout:1.0.2' + compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' + compile 'com.android.support:cardview-v7:26.0.0-alpha1' + compile 'com.squareup.picasso:picasso:2.5.2' + testCompile 'junit:junit:4.12' + compile 'com.squareup.picasso:picasso:2.5.2' + compile fileTree(dir: 'libs', include: ['*.jar']) +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..a194be9 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/nzp/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/example/nzp/pokedex/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/nzp/pokedex/ExampleInstrumentedTest.java new file mode 100644 index 0000000..46c5f26 --- /dev/null +++ b/app/src/androidTest/java/com/example/nzp/pokedex/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.nzp.pokedex; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.example.nzp.pokedex", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ccf1c94 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/nzp/pokedex/DisplayStyle.java b/app/src/main/java/com/example/nzp/pokedex/DisplayStyle.java new file mode 100644 index 0000000..f6a3c77 --- /dev/null +++ b/app/src/main/java/com/example/nzp/pokedex/DisplayStyle.java @@ -0,0 +1,30 @@ +package com.example.nzp.pokedex; + +/** + * Created by nzp on 9/19/17. + * + * An enum representing the possible styles to display the list of Pokemon, LIST and GRID. + */ + +public enum DisplayStyle { + + LIST, + GRID; + + /* Gets the other style. */ + public static DisplayStyle other(DisplayStyle thisStyle) { + if (thisStyle == LIST) { + return GRID; + } + return LIST; + } + + /* Return string representation. */ + @Override + public String toString() { + if (this == LIST) { + return "Grid"; + } + return "List"; + } +} diff --git a/app/src/main/java/com/example/nzp/pokedex/FilterActivity.java b/app/src/main/java/com/example/nzp/pokedex/FilterActivity.java new file mode 100644 index 0000000..2d79862 --- /dev/null +++ b/app/src/main/java/com/example/nzp/pokedex/FilterActivity.java @@ -0,0 +1,143 @@ +package com.example.nzp.pokedex; + +import android.content.DialogInterface; +import android.content.Intent; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.SeekBar; +import android.widget.TextView; + +import java.util.ArrayList; + +public class FilterActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener, View.OnClickListener { + + SeekBar seekBarAtk, seekBarDef, seekBarHP; + TextView minAtkText, minDefText, minHPText; + CheckBox[] checkBoxes; + CheckBox checkAll; + Button saveButton; + + int[] checkBoxIds = { + R.id.bugCheckBox, R.id.darkCheckBox, R.id.dragonCheckBox, R.id.electricCheckBox, + R.id.fairyCheckBox, R.id.fightingCheckBox, R.id.fireCheckBox, R.id.flyingCheckBox, + R.id.ghostCheckBox, R.id.grassCheckBox, R.id.groundCheckBox, R.id.iceCheckBox, + R.id.normalCheckBox, R.id.poisonCheckBox, R.id.psychicCheckBox, R.id.rockCheckBox, + R.id.steelCheckBox, R.id.waterCheckBox + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_filter); + + //Initialize ALL the views, what fun + minAtkText = (TextView) (findViewById(R.id.minAtkText)); + minDefText = (TextView) (findViewById(R.id.minDefText)); + minHPText = (TextView) (findViewById(R.id.minHPText)); + seekBarAtk = (SeekBar) (findViewById(R.id.seekBarAtk)); + seekBarDef = (SeekBar) (findViewById(R.id.seekBarDef)); + seekBarHP = (SeekBar) (findViewById(R.id.seekBarHP)); + + //Ready the SeekBars + seekBarAtk.setMax(Pokemon.HIGHEST_ATK); + seekBarDef.setMax(Pokemon.HIGHEST_DEF); + seekBarHP.setMax(Pokemon.HIGHEST_HP); + seekBarAtk.setOnSeekBarChangeListener(this); + seekBarDef.setOnSeekBarChangeListener(this); + seekBarHP.setOnSeekBarChangeListener(this); + + //Initialize the checkboxes + checkBoxes = new CheckBox[Pokemon.NUM_TYPES]; + for (int i = 0; i < checkBoxes.length; i += 1) { + checkBoxes[i] = (CheckBox) (findViewById(checkBoxIds[i])); + } + + //Check all and save button + checkAll = (CheckBox) (findViewById(R.id.checkAll)); + saveButton = (Button) (findViewById(R.id.saveButton)); + checkAll.setOnClickListener(this); + saveButton.setOnClickListener(this); + } + + private void changeCheckBoxes(boolean toWhat) { + for (CheckBox c : checkBoxes) { + c.setChecked(toWhat); + } + } + + @Override + public void onBackPressed() { + new AlertDialog.Builder(this).setMessage("Discard this filter?") + .setPositiveButton("Discard", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + discard(); + } + }) + .setNegativeButton("Cancel", null).show(); + } + + private void discard() { + Intent intent = new Intent(); + setResult(RESULT_CANCELED, intent); + finish(); + } + + private void save() { + Intent intent = new Intent(); + + //Put stats + intent.putExtra("atk", seekBarAtk.getProgress()); + intent.putExtra("def", seekBarDef.getProgress()); + intent.putExtra("hp", seekBarHP.getProgress()); + + //Put types (only if they are checked) + ArrayList allowedTypes = new ArrayList<>(); + for (int i = 0; i < checkBoxes.length; i += 1) { + if (checkBoxes[i].isChecked()) { + allowedTypes.add(Pokemon.TYPES[i]); + } + } + intent.putStringArrayListExtra("types", allowedTypes); + + //Finish intent + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + switch (seekBar.getId()) { + case R.id.seekBarAtk: + minAtkText.setText(String.format(getString(R.string.min_atk), i)); + break; + case R.id.seekBarDef: + minDefText.setText(String.format(getString(R.string.min_def), i)); + break; + case R.id.seekBarHP: + minHPText.setText(String.format(getString(R.string.min_hp), i)); + break; + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) {} + + @Override + public void onStopTrackingTouch(SeekBar seekBar) {} + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.checkAll: + changeCheckBoxes(checkAll.isChecked()); + break; + case R.id.saveButton: + save(); + } + } +} diff --git a/app/src/main/java/com/example/nzp/pokedex/MainActivity.java b/app/src/main/java/com/example/nzp/pokedex/MainActivity.java new file mode 100644 index 0000000..0271751 --- /dev/null +++ b/app/src/main/java/com/example/nzp/pokedex/MainActivity.java @@ -0,0 +1,166 @@ +package com.example.nzp.pokedex; + +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.SearchView; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.ArrayList; + +public class MainActivity extends AppCompatActivity implements View.OnClickListener { + + private static final int GRID_COLUMNS = 3; + private static final int NUM_RANDOM_POKEMON = 20; + + //RecyclerView variables + private RecyclerView recyclerView; + private PokedexAdapter adapter; + private DisplayStyle displayStyle = DisplayStyle.LIST; + + //Menu variables + private Menu menu; + private SearchView searchView; + + //Filter view variables + private View filterInfoView; + private TextView filterText; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + //Init RecyclerView + recyclerView = (RecyclerView) findViewById(R.id.recyclerView); + changeDisplayStyle(displayStyle); + + //Filtering stuff + filterInfoView = findViewById(R.id.filterInfoView); + filterText = (TextView) findViewById(R.id.filterText); + filterInfoView.setVisibility(View.GONE); + ImageView removeFilterImage = (ImageView) findViewById(R.id.removeFilterImage); + removeFilterImage.setOnClickListener(this); + + } + + private void changeDisplayStyle(DisplayStyle style) { + //Create and set the layout manager + if (style == DisplayStyle.LIST) { + recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); + } else if (style == DisplayStyle.GRID){ + recyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(), GRID_COLUMNS)); + } else { + throw new IllegalArgumentException("Invalid style."); + } + + //Create and set the adapter + if (adapter == null) { + adapter = new PokedexAdapter(this, null, null, style); + } else { + adapter = new PokedexAdapter(this, adapter.getFilteredPokemon(), adapter.getTruePokemon(), style); + } + recyclerView.setAdapter(adapter); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + this.menu = menu; + getMenuInflater().inflate(R.menu.main_menu, menu); + searchView = (SearchView) menu.findItem(R.id.searchButton).getActionView(); + return true; + } + + private void setSearch() { + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + adapter.getFilter().filter(newText); + return true; + } + }); + } + + private void clearSearch() { + searchView.setOnQueryTextListener(null); + (menu.findItem(R.id.searchButton)).collapseActionView(); + } + + private void setFilterText(String text) { + if (text == null) { + filterInfoView.setVisibility(View.GONE); + return; + } + filterText.setText(text); + filterInfoView.setVisibility(View.VISIBLE); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + menu.findItem(R.id.displayMenuButton).setTitle(String.format("%s %s", getString(R.string.display_as), displayStyle)); + return super.onPrepareOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.displayMenuButton: + displayStyle = DisplayStyle.other(displayStyle); + changeDisplayStyle(displayStyle); + return true; + case R.id.randomButton: + int numPokemon = adapter.getRandomPokemon(NUM_RANDOM_POKEMON); + setFilterText("Showing " + numPokemon + " random pokemon."); + clearSearch(); + break; + case R.id.filterButton: + startActivityForResult(new Intent(this, FilterActivity.class), 1); + break; + case R.id.searchButton: + setSearch(); + break; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.removeFilterImage: + PokedexFilter allFilter = new PokedexFilter(); + adapter.filterPokemon(allFilter); + setFilterText(null); + break; + } + } + + /* Receiving from filtering activity */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == 1) { + if (resultCode == RESULT_OK) { + int atk = data.getIntExtra("atk", -1); + int def = data.getIntExtra("def", -1); + int hp = data.getIntExtra("hp", -1); + ArrayList allowedTypes = data.getStringArrayListExtra("types"); + PokedexFilter filter = new PokedexFilter(allowedTypes, atk, def, hp); + adapter.filterPokemon(filter); + setFilterText(filter.toString()); + clearSearch(); + } + } + } +} diff --git a/app/src/main/java/com/example/nzp/pokedex/Pokedex.java b/app/src/main/java/com/example/nzp/pokedex/Pokedex.java new file mode 100644 index 0000000..65be146 --- /dev/null +++ b/app/src/main/java/com/example/nzp/pokedex/Pokedex.java @@ -0,0 +1,35 @@ +package com.example.nzp.pokedex; + +import android.util.Log; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Iterator; + +/** + * Created by aneeshjindal on 9/21/16. + */ +public class Pokedex { + + public ArrayList getPokemon() { + ArrayList pokemons = new ArrayList<>(); + try { + String data = "{\"Abomasnow\":{\"#\":\" 460\",\"Attack\":\"92\",\"Defense\":\"75\",\"FlavorText\":\"\",\"HP\":\"90\",\"Sp. Atk\":\"92\",\"Sp. Def\":\"85\",\"Species\":\"Frost Tree Pokémon\",\"Speed\":\"60\",\"Total\":\"494\",\"Type\":[\"Grass\",\"Ice\"]},\"Abomasnow ( Mega Abomasnow )\":{\"#\":\" 460\",\"Attack\":\"132\",\"Defense\":\"105\",\"FlavorText\":\"\",\"HP\":\"90\",\"Sp. Atk\":\"132\",\"Sp. Def\":\"105\",\"Species\":\"\",\"Speed\":\"30\",\"Total\":\"594\",\"Type\":[\"Grass\",\"Ice\"]},\"Abra\":{\"#\":\" 063\",\"Attack\":\"20\",\"Defense\":\"15\",\"FlavorText\":\"\",\"HP\":\"25\",\"Sp. Atk\":\"105\",\"Sp. Def\":\"55\",\"Species\":\"Psi Pokémon\",\"Speed\":\"90\",\"Total\":\"310\",\"Type\":[\"Psychic\"]},\"Absol\":{\"#\":\" 359\",\"Attack\":\"130\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"65\",\"Sp. Atk\":\"75\",\"Sp. Def\":\"60\",\"Species\":\"Disaster Pokémon\",\"Speed\":\"75\",\"Total\":\"465\",\"Type\":[\"Dark\"]},\"Absol ( Mega Absol )\":{\"#\":\" 359\",\"Attack\":\"150\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"65\",\"Sp. Atk\":\"115\",\"Sp. Def\":\"60\",\"Species\":\"\",\"Speed\":\"115\",\"Total\":\"565\",\"Type\":[\"Dark\"]},\"Accelgor\":{\"#\":\" 617\",\"Attack\":\"70\",\"Defense\":\"40\",\"FlavorText\":\"When its body dries out, it weakens. So, to prevent dehydration, it wraps itself in many layers of thin membrane.\",\"HP\":\"80\",\"Sp. Atk\":\"100\",\"Sp. Def\":\"60\",\"Species\":\"Shell Out Pokémon\",\"Speed\":\"145\",\"Total\":\"495\",\"Type\":[\"bug\"]},\"Aegislash ( Blade Forme )\":{\"#\":\" 681\",\"Attack\":\"150\",\"Defense\":\"50\",\"FlavorText\":\"\",\"HP\":\"60\",\"Sp. Atk\":\"150\",\"Sp. Def\":\"50\",\"Species\":\"\",\"Speed\":\"60\",\"Total\":\"520\",\"Type\":[\"Steel\",\"Ghost\"]},\"Aegislash ( Shield Forme )\":{\"#\":\" 681\",\"Attack\":\"50\",\"Defense\":\"150\",\"FlavorText\":\"\",\"HP\":\"60\",\"Sp. Atk\":\"50\",\"Sp. Def\":\"150\",\"Species\":\"\",\"Speed\":\"60\",\"Total\":\"520\",\"Type\":[\"Steel\",\"Ghost\"]},\"Aerodactyl\":{\"#\":\" 142\",\"Attack\":\"105\",\"Defense\":\"65\",\"FlavorText\":\"\",\"HP\":\"80\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"75\",\"Species\":\"Fossil Pokémon\",\"Speed\":\"130\",\"Total\":\"515\",\"Type\":[\"Rock\",\"Flying\"]},\"Aerodactyl ( Mega Aerodactyl )\":{\"#\":\" 142\",\"Attack\":\"135\",\"Defense\":\"85\",\"FlavorText\":\"\",\"HP\":\"80\",\"Sp. Atk\":\"70\",\"Sp. Def\":\"95\",\"Species\":\"\",\"Speed\":\"150\",\"Total\":\"615\",\"Type\":[\"Rock\",\"Flying\"]},\"Aggron\":{\"#\":\" 306\",\"Attack\":\"110\",\"Defense\":\"180\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"60\",\"Species\":\"Iron Armor Pokémon\",\"Speed\":\"50\",\"Total\":\"530\",\"Type\":[\"Steel\",\"Rock\"]},\"Aggron ( Mega Aggron )\":{\"#\":\" 306\",\"Attack\":\"140\",\"Defense\":\"230\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"80\",\"Species\":\"\",\"Speed\":\"50\",\"Total\":\"630\",\"Type\":[\"Steel\"]},\"Aipom\":{\"#\":\" 190\",\"Attack\":\"70\",\"Defense\":\"55\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"40\",\"Sp. Def\":\"55\",\"Species\":\"Long Tail Pokémon\",\"Speed\":\"85\",\"Total\":\"360\",\"Type\":[\"Normal\"]},\"Alakazam\":{\"#\":\" 065\",\"Attack\":\"50\",\"Defense\":\"45\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"135\",\"Sp. Def\":\"95\",\"Species\":\"Psi Pokémon\",\"Speed\":\"120\",\"Total\":\"500\",\"Type\":[\"Psychic\"]},\"Alakazam ( Mega Alakazam )\":{\"#\":\" 065\",\"Attack\":\"50\",\"Defense\":\"65\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"175\",\"Sp. Def\":\"95\",\"Species\":\"\",\"Speed\":\"150\",\"Total\":\"590\",\"Type\":[\"Psychic\"]},\"Alomomola\":{\"#\":\" 594\",\"Attack\":\"75\",\"Defense\":\"80\",\"FlavorText\":\"It gently holds injured and weak Pokémon in its fins. Its special membrane heals their wounds.\",\"HP\":\"165\",\"Sp. Atk\":\"40\",\"Sp. Def\":\"45\",\"Species\":\"Caring Pokémon\",\"Speed\":\"65\",\"Total\":\"470\",\"Type\":[\"Water\"]},\"Altaria\":{\"#\":\" 334\",\"Attack\":\"70\",\"Defense\":\"90\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"70\",\"Sp. Def\":\"105\",\"Species\":\"Humming Pokémon\",\"Speed\":\"80\",\"Total\":\"490\",\"Type\":[\"Dragon\",\"Flying\"]},\"Altaria ( Mega Altaria )\":{\"#\":\" 334\",\"Attack\":\"110\",\"Defense\":\"110\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"110\",\"Sp. Def\":\"105\",\"Species\":\"\",\"Speed\":\"80\",\"Total\":\"590\",\"Type\":[\"Dragon\",\"Fairy\"]},\"Amaura\":{\"#\":\" 698\",\"Attack\":\"59\",\"Defense\":\"50\",\"FlavorText\":\"\",\"HP\":\"77\",\"Sp. Atk\":\"67\",\"Sp. Def\":\"63\",\"Species\":\"Tundra Pokémon\",\"Speed\":\"46\",\"Total\":\"362\",\"Type\":[\"Rock\",\"Ice\"]},\"Ambipom\":{\"#\":\" 424\",\"Attack\":\"100\",\"Defense\":\"66\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"66\",\"Species\":\"Long Tail Pokémon\",\"Speed\":\"115\",\"Total\":\"482\",\"Type\":[\"Normal\"]},\"Amoonguss\":{\"#\":\" 591\",\"Attack\":\"85\",\"Defense\":\"70\",\"FlavorText\":\"\",\"HP\":\"114\",\"Sp. Atk\":\"85\",\"Sp. Def\":\"80\",\"Species\":\"Mushroom Pokémon\",\"Speed\":\"30\",\"Total\":\"464\",\"Type\":[\"Grass\",\"Poison\"]},\"Ampharos\":{\"#\":\" 181\",\"Attack\":\"75\",\"Defense\":\"85\",\"FlavorText\":\"\",\"HP\":\"90\",\"Sp. Atk\":\"115\",\"Sp. Def\":\"90\",\"Species\":\"Light Pokémon\",\"Speed\":\"55\",\"Total\":\"510\",\"Type\":[\"Electric\"]},\"Ampharos ( Mega Ampharos )\":{\"#\":\" 181\",\"Attack\":\"95\",\"Defense\":\"105\",\"FlavorText\":\"\",\"HP\":\"90\",\"Sp. Atk\":\"165\",\"Sp. Def\":\"110\",\"Species\":\"\",\"Speed\":\"45\",\"Total\":\"610\",\"Type\":[\"Electric\",\"Dragon\"]},\"Anorith\":{\"#\":\" 347\",\"Attack\":\"95\",\"Defense\":\"50\",\"FlavorText\":\"\",\"HP\":\"45\",\"Sp. Atk\":\"40\",\"Sp. Def\":\"50\",\"Species\":\"Old Shrimp Pokémon\",\"Speed\":\"75\",\"Total\":\"355\",\"Type\":[\"Rock\",\"bug\"]},\"Arbok\":{\"#\":\" 024\",\"Attack\":\"85\",\"Defense\":\"69\",\"FlavorText\":\"\",\"HP\":\"60\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"79\",\"Species\":\"Cobra Pokémon\",\"Speed\":\"80\",\"Total\":\"438\",\"Type\":[\"Poison\"]},\"Arcanine\":{\"#\":\" 059\",\"Attack\":\"110\",\"Defense\":\"80\",\"FlavorText\":\"\",\"HP\":\"90\",\"Sp. Atk\":\"100\",\"Sp. Def\":\"80\",\"Species\":\"Legendary Pokémon\",\"Speed\":\"95\",\"Total\":\"555\",\"Type\":[\"Fire\"]},\"Arceus\":{\"#\":\" 493\",\"Attack\":\"120\",\"Defense\":\"120\",\"FlavorText\":\"\",\"HP\":\"120\",\"Sp. Atk\":\"120\",\"Sp. Def\":\"120\",\"Species\":\"Alpha Pokémon\",\"Speed\":\"120\",\"Total\":\"720\",\"Type\":[\"Normal\"]},\"Archen\":{\"#\":\" 566\",\"Attack\":\"112\",\"Defense\":\"45\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"74\",\"Sp. Def\":\"45\",\"Species\":\"First Bird Pokémon\",\"Speed\":\"70\",\"Total\":\"401\",\"Type\":[\"Rock\",\"Flying\"]},\"Archeops\":{\"#\":\" 567\",\"Attack\":\"140\",\"Defense\":\"65\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"112\",\"Sp. Def\":\"65\",\"Species\":\"First Bird Pokémon\",\"Speed\":\"110\",\"Total\":\"567\",\"Type\":[\"Rock\",\"Flying\"]},\"Ariados\":{\"#\":\" 168\",\"Attack\":\"90\",\"Defense\":\"70\",\"FlavorText\":\"Its feet are tipped with tiny hooked claws that enable it to scuttle on ceilings and vertical walls. It constricts its foe with thin and strong silk webbing.\",\"HP\":\"70\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"60\",\"Species\":\"Long Leg Pokémon\",\"Speed\":\"40\",\"Total\":\"390\",\"Type\":[\"bug\",\"Poison\"]},\"Armaldo\":{\"#\":\" 348\",\"Attack\":\"125\",\"Defense\":\"100\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"70\",\"Sp. Def\":\"80\",\"Species\":\"Plate Pokémon\",\"Speed\":\"45\",\"Total\":\"495\",\"Type\":[\"Rock\",\"bug\"]},\"Aromatisse\":{\"#\":\" 683\",\"Attack\":\"72\",\"Defense\":\"72\",\"FlavorText\":\"\",\"HP\":\"101\",\"Sp. Atk\":\"99\",\"Sp. Def\":\"89\",\"Species\":\"Fragrance Pokémon\",\"Speed\":\"29\",\"Total\":\"462\",\"Type\":[\"Fairy\"]},\"Aron\":{\"#\":\" 304\",\"Attack\":\"70\",\"Defense\":\"100\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"40\",\"Sp. Def\":\"40\",\"Species\":\"Iron Armor Pokémon\",\"Speed\":\"30\",\"Total\":\"330\",\"Type\":[\"Steel\",\"Rock\"]},\"Articuno\":{\"#\":\" 144\",\"Attack\":\"85\",\"Defense\":\"100\",\"FlavorText\":\"Legendary bird POKéMON. As it flies through the sky, it cools the air, causing snow to fall.\",\"HP\":\"90\",\"Sp. Atk\":\"95\",\"Sp. Def\":\"125\",\"Species\":\"Freeze Pokémon\",\"Speed\":\"85\",\"Total\":\"580\",\"Type\":[\"Ice\",\"Flying\"]},\"Audino\":{\"#\":\" 531\",\"Attack\":\"60\",\"Defense\":\"86\",\"FlavorText\":\"\",\"HP\":\"103\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"86\",\"Species\":\"Hearing Pokémon\",\"Speed\":\"50\",\"Total\":\"445\",\"Type\":[\"Normal\"]},\"Audino ( Mega Audino )\":{\"#\":\" 531\",\"Attack\":\"60\",\"Defense\":\"126\",\"FlavorText\":\"\",\"HP\":\"103\",\"Sp. Atk\":\"80\",\"Sp. Def\":\"126\",\"Species\":\"\",\"Speed\":\"50\",\"Total\":\"545\",\"Type\":[\"Normal\",\"Fairy\"]},\"Aurorus\":{\"#\":\" 699\",\"Attack\":\"77\",\"Defense\":\"72\",\"FlavorText\":\"\",\"HP\":\"123\",\"Sp. Atk\":\"99\",\"Sp. Def\":\"92\",\"Species\":\"Tundra Pokémon\",\"Speed\":\"58\",\"Total\":\"521\",\"Type\":[\"Rock\",\"Ice\"]},\"Avalugg\":{\"#\":\" 713\",\"Attack\":\"117\",\"Defense\":\"184\",\"FlavorText\":\"\",\"HP\":\"95\",\"Sp. Atk\":\"44\",\"Sp. Def\":\"46\",\"Species\":\"Iceberg Pokémon\",\"Speed\":\"28\",\"Total\":\"514\",\"Type\":[\"Ice\"]},\"Axew\":{\"#\":\" 610\",\"Attack\":\"87\",\"Defense\":\"60\",\"FlavorText\":\"They mark their territory by leaving gashes in trees with their tusks. If a tusk breaks, a new one grows in quickly.\",\"HP\":\"46\",\"Sp. Atk\":\"30\",\"Sp. Def\":\"40\",\"Species\":\"Tusk Pokémon\",\"Speed\":\"57\",\"Total\":\"320\",\"Type\":[\"Dragon\"]},\"Azelf\":{\"#\":\" 482\",\"Attack\":\"125\",\"Defense\":\"70\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"125\",\"Sp. Def\":\"70\",\"Species\":\"Willpower Pokémon\",\"Speed\":\"115\",\"Total\":\"580\",\"Type\":[\"Psychic\"]},\"Azumarill\":{\"#\":\" 184\",\"Attack\":\"50\",\"Defense\":\"80\",\"FlavorText\":\"\",\"HP\":\"100\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"80\",\"Species\":\"Aqua Rabbit Pokémon\",\"Speed\":\"50\",\"Total\":\"420\",\"Type\":[\"Water\",\"Fairy\"]},\"Azurill\":{\"#\":\" 298\",\"Attack\":\"20\",\"Defense\":\"40\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"20\",\"Sp. Def\":\"40\",\"Species\":\"Polka Dot Pokémon\",\"Speed\":\"20\",\"Total\":\"190\",\"Type\":[\"Normal\",\"Fairy\"]},\"Bagon\":{\"#\":\" 371\",\"Attack\":\"75\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"45\",\"Sp. Atk\":\"40\",\"Sp. Def\":\"30\",\"Species\":\"Rock Head Pokémon\",\"Speed\":\"50\",\"Total\":\"300\",\"Type\":[\"Dragon\"]},\"Baltoy\":{\"#\":\" 343\",\"Attack\":\"40\",\"Defense\":\"55\",\"FlavorText\":\"\",\"HP\":\"40\",\"Sp. Atk\":\"40\",\"Sp. Def\":\"70\",\"Species\":\"Clay Doll Pokémon\",\"Speed\":\"55\",\"Total\":\"300\",\"Type\":[\"Ground\",\"Psychic\"]},\"Banette\":{\"#\":\" 354\",\"Attack\":\"115\",\"Defense\":\"65\",\"FlavorText\":\"\",\"HP\":\"64\",\"Sp. Atk\":\"83\",\"Sp. Def\":\"63\",\"Species\":\"Marionette Pokémon\",\"Speed\":\"65\",\"Total\":\"455\",\"Type\":[\"Ghost\"]},\"Banette ( Mega Banette )\":{\"#\":\" 354\",\"Attack\":\"165\",\"Defense\":\"75\",\"FlavorText\":\"\",\"HP\":\"64\",\"Sp. Atk\":\"93\",\"Sp. Def\":\"83\",\"Species\":\"\",\"Speed\":\"75\",\"Total\":\"555\",\"Type\":[\"Ghost\"]},\"Barbaracle\":{\"#\":\" 689\",\"Attack\":\"105\",\"Defense\":\"115\",\"FlavorText\":\"\",\"HP\":\"72\",\"Sp. Atk\":\"54\",\"Sp. Def\":\"86\",\"Species\":\"Collective Pokémon\",\"Speed\":\"68\",\"Total\":\"500\",\"Type\":[\"Rock\",\"Water\"]},\"Barboach\":{\"#\":\" 339\",\"Attack\":\"48\",\"Defense\":\"43\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"46\",\"Sp. Def\":\"41\",\"Species\":\"Whiskers Pokémon\",\"Speed\":\"60\",\"Total\":\"288\",\"Type\":[\"Water\",\"Ground\"]},\"Basculin\":{\"#\":\" 550\",\"Attack\":\"92\",\"Defense\":\"65\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"80\",\"Sp. Def\":\"55\",\"Species\":\"Hostile Pokémon\",\"Speed\":\"98\",\"Total\":\"460\",\"Type\":[\"Water\"]},\"Bastiodon\":{\"#\":\" 411\",\"Attack\":\"52\",\"Defense\":\"168\",\"FlavorText\":\"\",\"HP\":\"60\",\"Sp. Atk\":\"47\",\"Sp. Def\":\"138\",\"Species\":\"Shield Pokémon\",\"Speed\":\"30\",\"Total\":\"495\",\"Type\":[\"Rock\",\"Steel\"]},\"Bayleef\":{\"#\":\" 153\",\"Attack\":\"62\",\"Defense\":\"80\",\"FlavorText\":\"\",\"HP\":\"60\",\"Sp. Atk\":\"63\",\"Sp. Def\":\"80\",\"Species\":\"Leaf Pokémon\",\"Speed\":\"60\",\"Total\":\"405\",\"Type\":[\"Grass\"]},\"Beartic\":{\"#\":\" 614\",\"Attack\":\"110\",\"Defense\":\"80\",\"FlavorText\":\"\",\"HP\":\"95\",\"Sp. Atk\":\"70\",\"Sp. Def\":\"80\",\"Species\":\"Freezing Pokémon\",\"Speed\":\"50\",\"Total\":\"485\",\"Type\":[\"Ice\"]},\"Beautifly\":{\"#\":\" 267\",\"Attack\":\"70\",\"Defense\":\"50\",\"FlavorText\":\"Despite its looks, it is aggressive. It jabs with its long, thin mouth if disturbed while collecting pollen.\",\"HP\":\"60\",\"Sp. Atk\":\"100\",\"Sp. Def\":\"50\",\"Species\":\"Butterfly Pokémon\",\"Speed\":\"65\",\"Total\":\"395\",\"Type\":[\"bug\",\"Flying\"]},\"Beedrill\":{\"#\":\" 015\",\"Attack\":\"90\",\"Defense\":\"40\",\"FlavorText\":\"\",\"HP\":\"65\",\"Sp. Atk\":\"45\",\"Sp. Def\":\"80\",\"Species\":\"Poison Bee Pokémon\",\"Speed\":\"75\",\"Total\":\"395\",\"Type\":[\"bug\",\"Poison\"]},\"Beedrill ( Mega Beedrill )\":{\"#\":\" 015\",\"Attack\":\"150\",\"Defense\":\"40\",\"FlavorText\":\"\",\"HP\":\"65\",\"Sp. Atk\":\"15\",\"Sp. Def\":\"80\",\"Species\":\"\",\"Speed\":\"145\",\"Total\":\"495\",\"Type\":[\"bug\",\"Poison\"]},\"Beheeyem\":{\"#\":\" 606\",\"Attack\":\"75\",\"Defense\":\"75\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"125\",\"Sp. Def\":\"95\",\"Species\":\"Cerebral Pokémon\",\"Speed\":\"40\",\"Total\":\"485\",\"Type\":[\"Psychic\"]},\"Beldum\":{\"#\":\" 374\",\"Attack\":\"55\",\"Defense\":\"80\",\"FlavorText\":\"\",\"HP\":\"40\",\"Sp. Atk\":\"35\",\"Sp. Def\":\"60\",\"Species\":\"Iron Ball Pokémon\",\"Speed\":\"30\",\"Total\":\"300\",\"Type\":[\"Steel\",\"Psychic\"]},\"Bellossom\":{\"#\":\" 182\",\"Attack\":\"80\",\"Defense\":\"95\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"90\",\"Sp. Def\":\"100\",\"Species\":\"Flower Pokémon\",\"Speed\":\"50\",\"Total\":\"490\",\"Type\":[\"Grass\"]},\"Bellsprout\":{\"#\":\" 069\",\"Attack\":\"75\",\"Defense\":\"35\",\"FlavorText\":\"If it notices anything that moves, it immediately flings its vine at the object.\",\"HP\":\"50\",\"Sp. Atk\":\"70\",\"Sp. Def\":\"30\",\"Species\":\"Flower Pokémon\",\"Speed\":\"40\",\"Total\":\"300\",\"Type\":[\"Grass\",\"Poison\"]},\"Bergmite\":{\"#\":\" 712\",\"Attack\":\"69\",\"Defense\":\"85\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"32\",\"Sp. Def\":\"35\",\"Species\":\"Ice Chunk Pokémon\",\"Speed\":\"28\",\"Total\":\"304\",\"Type\":[\"Ice\"]},\"Bibarel\":{\"#\":\" 400\",\"Attack\":\"85\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"79\",\"Sp. Atk\":\"55\",\"Sp. Def\":\"60\",\"Species\":\"Beaver Pokémon\",\"Speed\":\"71\",\"Total\":\"410\",\"Type\":[\"Normal\",\"Water\"]},\"Bidoof\":{\"#\":\" 399\",\"Attack\":\"45\",\"Defense\":\"40\",\"FlavorText\":\"\",\"HP\":\"59\",\"Sp. Atk\":\"35\",\"Sp. Def\":\"40\",\"Species\":\"Plump Mouse Pokémon\",\"Speed\":\"31\",\"Total\":\"250\",\"Type\":[\"Normal\"]},\"Binacle\":{\"#\":\" 688\",\"Attack\":\"52\",\"Defense\":\"67\",\"FlavorText\":\"\",\"HP\":\"42\",\"Sp. Atk\":\"39\",\"Sp. Def\":\"56\",\"Species\":\"Two-Handed Pokémon\",\"Speed\":\"50\",\"Total\":\"306\",\"Type\":[\"Rock\",\"Water\"]},\"Bisharp\":{\"#\":\" 625\",\"Attack\":\"125\",\"Defense\":\"100\",\"FlavorText\":\"Bisharp pursues prey in the company of a large group of Pawniard. Then Bisharp finishes off the prey.\",\"HP\":\"65\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"70\",\"Species\":\"Sword Blade Pokémon\",\"Speed\":\"70\",\"Total\":\"490\",\"Type\":[\"Dark\",\"Steel\"]},\"Blastoise\":{\"#\":\" 009\",\"Attack\":\"83\",\"Defense\":\"100\",\"FlavorText\":\"\",\"HP\":\"79\",\"Sp. Atk\":\"85\",\"Sp. Def\":\"105\",\"Species\":\"Shellfish Pokémon\",\"Speed\":\"78\",\"Total\":\"530\",\"Type\":[\"Water\"]},\"Blastoise ( Mega Blastoise )\":{\"#\":\" 009\",\"Attack\":\"103\",\"Defense\":\"120\",\"FlavorText\":\"\",\"HP\":\"79\",\"Sp. Atk\":\"135\",\"Sp. Def\":\"115\",\"Species\":\"\",\"Speed\":\"78\",\"Total\":\"630\",\"Type\":[\"Water\"]},\"Blaziken\":{\"#\":\" 257\",\"Attack\":\"120\",\"Defense\":\"70\",\"FlavorText\":\"\",\"HP\":\"80\",\"Sp. Atk\":\"110\",\"Sp. Def\":\"70\",\"Species\":\"Blaze Pokémon\",\"Speed\":\"80\",\"Total\":\"530\",\"Type\":[\"Fire\",\"Fighting\"]},\"Blaziken ( Mega Blaziken )\":{\"#\":\" 257\",\"Attack\":\"160\",\"Defense\":\"80\",\"FlavorText\":\"\",\"HP\":\"80\",\"Sp. Atk\":\"130\",\"Sp. Def\":\"80\",\"Species\":\"\",\"Speed\":\"100\",\"Total\":\"630\",\"Type\":[\"Fire\",\"Fighting\"]},\"Blissey\":{\"#\":\" 242\",\"Attack\":\"10\",\"Defense\":\"10\",\"FlavorText\":\"\",\"HP\":\"255\",\"Sp. Atk\":\"75\",\"Sp. Def\":\"135\",\"Species\":\"Happiness Pokémon\",\"Speed\":\"55\",\"Total\":\"540\",\"Type\":[\"Normal\"]},\"Blitzle\":{\"#\":\" 522\",\"Attack\":\"60\",\"Defense\":\"32\",\"FlavorText\":\"\",\"HP\":\"45\",\"Sp. Atk\":\"50\",\"Sp. Def\":\"32\",\"Species\":\"Electrified Pokémon\",\"Speed\":\"76\",\"Total\":\"295\",\"Type\":[\"Electric\"]},\"Boldore\":{\"#\":\" 525\",\"Attack\":\"105\",\"Defense\":\"105\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"50\",\"Sp. Def\":\"40\",\"Species\":\"Ore Pokémon\",\"Speed\":\"20\",\"Total\":\"390\",\"Type\":[\"Rock\"]},\"Bonsly\":{\"#\":\" 438\",\"Attack\":\"80\",\"Defense\":\"95\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"10\",\"Sp. Def\":\"45\",\"Species\":\"Bonsai Pokémon\",\"Speed\":\"10\",\"Total\":\"290\",\"Type\":[\"Rock\"]},\"Bouffalant\":{\"#\":\" 626\",\"Attack\":\"110\",\"Defense\":\"95\",\"FlavorText\":\"\",\"HP\":\"95\",\"Sp. Atk\":\"40\",\"Sp. Def\":\"95\",\"Species\":\"Bash Buffalo Pokémon\",\"Speed\":\"55\",\"Total\":\"490\",\"Type\":[\"Normal\"]},\"Braixen\":{\"#\":\" 654\",\"Attack\":\"59\",\"Defense\":\"58\",\"FlavorText\":\"\",\"HP\":\"59\",\"Sp. Atk\":\"90\",\"Sp. Def\":\"70\",\"Species\":\"Fox Pokémon\",\"Speed\":\"73\",\"Total\":\"409\",\"Type\":[\"Fire\"]},\"Braviary\":{\"#\":\" 628\",\"Attack\":\"123\",\"Defense\":\"75\",\"FlavorText\":\"\",\"HP\":\"100\",\"Sp. Atk\":\"57\",\"Sp. Def\":\"75\",\"Species\":\"Valiant Pokémon\",\"Speed\":\"80\",\"Total\":\"510\",\"Type\":[\"Normal\",\"Flying\"]},\"Breloom\":{\"#\":\" 286\",\"Attack\":\"130\",\"Defense\":\"80\",\"FlavorText\":\"\",\"HP\":\"60\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"60\",\"Species\":\"Mushroom Pokémon\",\"Speed\":\"70\",\"Total\":\"460\",\"Type\":[\"Grass\",\"Fighting\"]},\"Bronzong\":{\"#\":\" 437\",\"Attack\":\"89\",\"Defense\":\"116\",\"FlavorText\":\"\",\"HP\":\"67\",\"Sp. Atk\":\"79\",\"Sp. Def\":\"116\",\"Species\":\"Bronze Bell Pokémon\",\"Speed\":\"33\",\"Total\":\"500\",\"Type\":[\"Steel\",\"Psychic\"]},\"Bronzor\":{\"#\":\" 436\",\"Attack\":\"24\",\"Defense\":\"86\",\"FlavorText\":\"\",\"HP\":\"57\",\"Sp. Atk\":\"24\",\"Sp. Def\":\"86\",\"Species\":\"Bronze Pokémon\",\"Speed\":\"23\",\"Total\":\"300\",\"Type\":[\"Steel\",\"Psychic\"]},\"Budew\":{\"#\":\" 406\",\"Attack\":\"30\",\"Defense\":\"35\",\"FlavorText\":\"\",\"HP\":\"40\",\"Sp. Atk\":\"50\",\"Sp. Def\":\"70\",\"Species\":\"Bud Pokémon\",\"Speed\":\"55\",\"Total\":\"280\",\"Type\":[\"Grass\",\"Poison\"]},\"Buizel\":{\"#\":\" 418\",\"Attack\":\"65\",\"Defense\":\"35\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"30\",\"Species\":\"Sea Weasel Pokémon\",\"Speed\":\"85\",\"Total\":\"330\",\"Type\":[\"Water\"]},\"Bulbasaur\":{\"#\":\" 001\",\"Attack\":\"49\",\"Defense\":\"49\",\"FlavorText\":\"While it is young, it uses the nutrients that are stored in the seeds on its back in order to grow.\",\"HP\":\"45\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"65\",\"Species\":\"Seed Pokémon\",\"Speed\":\"45\",\"Total\":\"318\",\"Type\":[\"Grass\",\"Poison\"]},\"Buneary\":{\"#\":\" 427\",\"Attack\":\"66\",\"Defense\":\"44\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"44\",\"Sp. Def\":\"56\",\"Species\":\"Rabbit Pokémon\",\"Speed\":\"85\",\"Total\":\"350\",\"Type\":[\"Normal\"]},\"Bunnelby\":{\"#\":\" 659\",\"Attack\":\"36\",\"Defense\":\"38\",\"FlavorText\":\"\",\"HP\":\"38\",\"Sp. Atk\":\"32\",\"Sp. Def\":\"36\",\"Species\":\"Digging Pokémon\",\"Speed\":\"57\",\"Total\":\"237\",\"Type\":[\"Normal\"]},\"Burmy\":{\"#\":\" 412\",\"Attack\":\"29\",\"Defense\":\"45\",\"FlavorText\":\"\",\"HP\":\"40\",\"Sp. Atk\":\"29\",\"Sp. Def\":\"45\",\"Species\":\"Bagworm Pokémon\",\"Speed\":\"36\",\"Total\":\"224\",\"Type\":[\"bug\"]},\"Butterfree\":{\"#\":\" 012\",\"Attack\":\"45\",\"Defense\":\"50\",\"FlavorText\":\"It flits from flower to flower, collecting honey. It can even identify distant flowers in bloom.\",\"HP\":\"60\",\"Sp. Atk\":\"90\",\"Sp. Def\":\"80\",\"Species\":\"Butterfly Pokémon\",\"Speed\":\"70\",\"Total\":\"395\",\"Type\":[\"bug\",\"Flying\"]},\"Cacnea\":{\"#\":\" 331\",\"Attack\":\"85\",\"Defense\":\"40\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"85\",\"Sp. Def\":\"40\",\"Species\":\"Cactus Pokémon\",\"Speed\":\"35\",\"Total\":\"335\",\"Type\":[\"Grass\"]},\"Cacturne\":{\"#\":\" 332\",\"Attack\":\"115\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"115\",\"Sp. Def\":\"60\",\"Species\":\"Scarecrow Pokémon\",\"Speed\":\"55\",\"Total\":\"475\",\"Type\":[\"Grass\",\"Dark\"]},\"Camerupt\":{\"#\":\" 323\",\"Attack\":\"100\",\"Defense\":\"70\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"105\",\"Sp. Def\":\"75\",\"Species\":\"Eruption Pokémon\",\"Speed\":\"40\",\"Total\":\"460\",\"Type\":[\"Fire\",\"Ground\"]},\"Camerupt ( Mega Camerupt )\":{\"#\":\" 323\",\"Attack\":\"120\",\"Defense\":\"100\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"145\",\"Sp. Def\":\"105\",\"Species\":\"\",\"Speed\":\"20\",\"Total\":\"560\",\"Type\":[\"Fire\",\"Ground\"]},\"Carbink\":{\"#\":\" 703\",\"Attack\":\"50\",\"Defense\":\"150\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"50\",\"Sp. Def\":\"150\",\"Species\":\"Jewel Pokémon\",\"Speed\":\"50\",\"Total\":\"500\",\"Type\":[\"Rock\",\"Fairy\"]},\"Carnivine\":{\"#\":\" 455\",\"Attack\":\"100\",\"Defense\":\"72\",\"FlavorText\":\"\",\"HP\":\"74\",\"Sp. Atk\":\"90\",\"Sp. Def\":\"72\",\"Species\":\"bug Catcher Pokémon\",\"Speed\":\"46\",\"Total\":\"454\",\"Type\":[\"Grass\"]},\"Carracosta\":{\"#\":\" 565\",\"Attack\":\"108\",\"Defense\":\"133\",\"FlavorText\":\"\",\"HP\":\"74\",\"Sp. Atk\":\"83\",\"Sp. Def\":\"65\",\"Species\":\"Prototurtle Pokémon\",\"Speed\":\"32\",\"Total\":\"495\",\"Type\":[\"Water\",\"Rock\"]},\"Carvanha\":{\"#\":\" 318\",\"Attack\":\"90\",\"Defense\":\"20\",\"FlavorText\":\"\",\"HP\":\"45\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"20\",\"Species\":\"Savage Pokémon\",\"Speed\":\"65\",\"Total\":\"305\",\"Type\":[\"Water\",\"Dark\"]},\"Cascoon\":{\"#\":\" 268\",\"Attack\":\"35\",\"Defense\":\"55\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"25\",\"Sp. Def\":\"25\",\"Species\":\"Cocoon Pokémon\",\"Speed\":\"15\",\"Total\":\"205\",\"Type\":[\"bug\"]},\"Castform\":{\"#\":\" 351\",\"Attack\":\"70\",\"Defense\":\"70\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"70\",\"Sp. Def\":\"70\",\"Species\":\"Weather Pokémon\",\"Speed\":\"70\",\"Total\":\"420\",\"Type\":[\"Normal\"]},\"Caterpie\":{\"#\":\" 010\",\"Attack\":\"30\",\"Defense\":\"35\",\"FlavorText\":\"It crawls into foliage where it camouflages itself among leaves that are the same color as its body.\",\"HP\":\"45\",\"Sp. Atk\":\"20\",\"Sp. Def\":\"20\",\"Species\":\"Worm Pokémon\",\"Speed\":\"45\",\"Total\":\"195\",\"Type\":[\"bug\"]},\"Celebi\":{\"#\":\" 251\",\"Attack\":\"100\",\"Defense\":\"100\",\"FlavorText\":\"\",\"HP\":\"100\",\"Sp. Atk\":\"100\",\"Sp. Def\":\"100\",\"Species\":\"Time Travel Pokémon\",\"Speed\":\"100\",\"Total\":\"600\",\"Type\":[\"Psychic\",\"Grass\"]},\"Chandelure\":{\"#\":\" 609\",\"Attack\":\"55\",\"Defense\":\"90\",\"FlavorText\":\"The spirits burned up in its ominous flame lose their way and wander this world forever.\",\"HP\":\"60\",\"Sp. Atk\":\"145\",\"Sp. Def\":\"90\",\"Species\":\"Luring Pokémon\",\"Speed\":\"80\",\"Total\":\"520\",\"Type\":[\"Ghost\",\"Fire\"]},\"Chansey\":{\"#\":\" 113\",\"Attack\":\"5\",\"Defense\":\"5\",\"FlavorText\":\"\",\"HP\":\"250\",\"Sp. Atk\":\"35\",\"Sp. Def\":\"105\",\"Species\":\"Egg Pokémon\",\"Speed\":\"50\",\"Total\":\"450\",\"Type\":[\"Normal\"]},\"Charizard\":{\"#\":\" 006\",\"Attack\":\"84\",\"Defense\":\"78\",\"FlavorText\":\"\",\"HP\":\"78\",\"Sp. Atk\":\"109\",\"Sp. Def\":\"85\",\"Species\":\"Flame Pokémon\",\"Speed\":\"100\",\"Total\":\"534\",\"Type\":[\"Fire\",\"Flying\"]},\"Charizard ( Mega Charizard X )\":{\"#\":\" 006\",\"Attack\":\"130\",\"Defense\":\"111\",\"FlavorText\":\"\",\"HP\":\"78\",\"Sp. Atk\":\"130\",\"Sp. Def\":\"85\",\"Species\":\"\",\"Speed\":\"100\",\"Total\":\"634\",\"Type\":[\"Fire\",\"Dragon\"]},\"Charizard ( Mega Charizard Y )\":{\"#\":\" 006\",\"Attack\":\"104\",\"Defense\":\"78\",\"FlavorText\":\"\",\"HP\":\"78\",\"Sp. Atk\":\"159\",\"Sp. Def\":\"115\",\"Species\":\"\",\"Speed\":\"100\",\"Total\":\"634\",\"Type\":[\"Fire\",\"Flying\"]},\"Charmander\":{\"#\":\" 004\",\"Attack\":\"52\",\"Defense\":\"43\",\"FlavorText\":\"If it's healthy, the flame on the tip of its tail will burn vigorously, even if it gets a bit wet.\",\"HP\":\"39\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"50\",\"Species\":\"Lizard Pokémon\",\"Speed\":\"65\",\"Total\":\"309\",\"Type\":[\"Fire\"]},\"Charmeleon\":{\"#\":\" 005\",\"Attack\":\"64\",\"Defense\":\"58\",\"FlavorText\":\"If it becomes agitated during battle, it spouts intense flames, incinerating its surroundings.\",\"HP\":\"58\",\"Sp. Atk\":\"80\",\"Sp. Def\":\"65\",\"Species\":\"Flame Pokémon\",\"Speed\":\"80\",\"Total\":\"405\",\"Type\":[\"Fire\"]},\"Chatot\":{\"#\":\" 441\",\"Attack\":\"65\",\"Defense\":\"45\",\"FlavorText\":\"\",\"HP\":\"76\",\"Sp. Atk\":\"92\",\"Sp. Def\":\"42\",\"Species\":\"Music Note Pokémon\",\"Speed\":\"91\",\"Total\":\"411\",\"Type\":[\"Normal\",\"Flying\"]},\"Cherrim\":{\"#\":\" 421\",\"Attack\":\"60\",\"Defense\":\"70\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"87\",\"Sp. Def\":\"78\",\"Species\":\"Blossom Pokémon\",\"Speed\":\"85\",\"Total\":\"450\",\"Type\":[\"Grass\"]},\"Cherubi\":{\"#\":\" 420\",\"Attack\":\"35\",\"Defense\":\"45\",\"FlavorText\":\"\",\"HP\":\"45\",\"Sp. Atk\":\"62\",\"Sp. Def\":\"53\",\"Species\":\"Cherry Pokémon\",\"Speed\":\"35\",\"Total\":\"275\",\"Type\":[\"Grass\"]},\"Chesnaught\":{\"#\":\" 652\",\"Attack\":\"107\",\"Defense\":\"122\",\"FlavorText\":\"\",\"HP\":\"88\",\"Sp. Atk\":\"74\",\"Sp. Def\":\"75\",\"Species\":\"Spiny Armor Pokémon\",\"Speed\":\"64\",\"Total\":\"530\",\"Type\":[\"Grass\",\"Fighting\"]},\"Chespin\":{\"#\":\" 650\",\"Attack\":\"61\",\"Defense\":\"65\",\"FlavorText\":\"\",\"HP\":\"56\",\"Sp. Atk\":\"48\",\"Sp. Def\":\"45\",\"Species\":\"Spiny Nut Pokémon\",\"Speed\":\"38\",\"Total\":\"313\",\"Type\":[\"Grass\"]},\"Chikorita\":{\"#\":\" 152\",\"Attack\":\"49\",\"Defense\":\"65\",\"FlavorText\":\"\",\"HP\":\"45\",\"Sp. Atk\":\"49\",\"Sp. Def\":\"65\",\"Species\":\"Leaf Pokémon\",\"Speed\":\"45\",\"Total\":\"318\",\"Type\":[\"Grass\"]},\"Chimchar\":{\"#\":\" 390\",\"Attack\":\"58\",\"Defense\":\"44\",\"FlavorText\":\"\",\"HP\":\"44\",\"Sp. Atk\":\"58\",\"Sp. Def\":\"44\",\"Species\":\"Chimp Pokémon\",\"Speed\":\"61\",\"Total\":\"309\",\"Type\":[\"Fire\"]},\"Chimecho\":{\"#\":\" 358\",\"Attack\":\"50\",\"Defense\":\"70\",\"FlavorText\":\"Its cries echo inside its hollow body to emerge as beautiful notes for startling and repelling foes.\",\"HP\":\"65\",\"Sp. Atk\":\"95\",\"Sp. Def\":\"80\",\"Species\":\"Wind Chime Pokémon\",\"Speed\":\"65\",\"Total\":\"425\",\"Type\":[\"Psychic\"]},\"Chinchou\":{\"#\":\" 170\",\"Attack\":\"38\",\"Defense\":\"38\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"56\",\"Sp. Def\":\"56\",\"Species\":\"Angler Pokémon\",\"Speed\":\"67\",\"Total\":\"330\",\"Type\":[\"Water\",\"Electric\"]},\"Chingling\":{\"#\":\" 433\",\"Attack\":\"30\",\"Defense\":\"50\",\"FlavorText\":\"\",\"HP\":\"45\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"50\",\"Species\":\"Bell Pokémon\",\"Speed\":\"45\",\"Total\":\"285\",\"Type\":[\"Psychic\"]},\"Cinccino\":{\"#\":\" 573\",\"Attack\":\"95\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"60\",\"Species\":\"Scarf Pokémon\",\"Speed\":\"115\",\"Total\":\"470\",\"Type\":[\"Normal\"]},\"Clamperl\":{\"#\":\" 366\",\"Attack\":\"64\",\"Defense\":\"85\",\"FlavorText\":\"\",\"HP\":\"35\",\"Sp. Atk\":\"74\",\"Sp. Def\":\"55\",\"Species\":\"Bivalve Pokémon\",\"Speed\":\"32\",\"Total\":\"345\",\"Type\":[\"Water\"]},\"Clauncher\":{\"#\":\" 692\",\"Attack\":\"53\",\"Defense\":\"62\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"58\",\"Sp. Def\":\"63\",\"Species\":\"Water Gun Pokémon\",\"Speed\":\"44\",\"Total\":\"330\",\"Type\":[\"Water\"]},\"Clawitzer\":{\"#\":\" 693\",\"Attack\":\"73\",\"Defense\":\"88\",\"FlavorText\":\"\",\"HP\":\"71\",\"Sp. Atk\":\"120\",\"Sp. Def\":\"89\",\"Species\":\"Howitzer Pokémon\",\"Speed\":\"59\",\"Total\":\"500\",\"Type\":[\"Water\"]},\"Claydol\":{\"#\":\" 344\",\"Attack\":\"70\",\"Defense\":\"105\",\"FlavorText\":\"\",\"HP\":\"60\",\"Sp. Atk\":\"70\",\"Sp. Def\":\"120\",\"Species\":\"Clay Doll Pokémon\",\"Speed\":\"75\",\"Total\":\"500\",\"Type\":[\"Ground\",\"Psychic\"]},\"Clefable\":{\"#\":\" 036\",\"Attack\":\"70\",\"Defense\":\"73\",\"FlavorText\":\"\",\"HP\":\"95\",\"Sp. Atk\":\"95\",\"Sp. Def\":\"90\",\"Species\":\"Fairy Pokémon\",\"Speed\":\"60\",\"Total\":\"483\",\"Type\":[\"Fairy\"]},\"Clefairy\":{\"#\":\" 035\",\"Attack\":\"45\",\"Defense\":\"48\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"65\",\"Species\":\"Fairy Pokémon\",\"Speed\":\"35\",\"Total\":\"323\",\"Type\":[\"Fairy\"]},\"Cleffa\":{\"#\":\" 173\",\"Attack\":\"25\",\"Defense\":\"28\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"45\",\"Sp. Def\":\"55\",\"Species\":\"Star Shape Pokémon\",\"Speed\":\"15\",\"Total\":\"218\",\"Type\":[\"Fairy\"]},\"Cloyster\":{\"#\":\" 091\",\"Attack\":\"95\",\"Defense\":\"180\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"85\",\"Sp. Def\":\"45\",\"Species\":\"Bivalve Pokémon\",\"Speed\":\"70\",\"Total\":\"525\",\"Type\":[\"Water\",\"Ice\"]},\"Cobalion\":{\"#\":\" 638\",\"Attack\":\"90\",\"Defense\":\"129\",\"FlavorText\":\"\",\"HP\":\"91\",\"Sp. Atk\":\"90\",\"Sp. Def\":\"72\",\"Species\":\"Iron Will Pokémon\",\"Speed\":\"108\",\"Total\":\"580\",\"Type\":[\"Steel\",\"Fighting\"]},\"Cofagrigus\":{\"#\":\" 563\",\"Attack\":\"50\",\"Defense\":\"145\",\"FlavorText\":\"\",\"HP\":\"58\",\"Sp. Atk\":\"95\",\"Sp. Def\":\"105\",\"Species\":\"Coffin Pokémon\",\"Speed\":\"30\",\"Total\":\"483\",\"Type\":[\"Ghost\"]},\"Combee\":{\"#\":\" 415\",\"Attack\":\"30\",\"Defense\":\"42\",\"FlavorText\":\"\",\"HP\":\"30\",\"Sp. Atk\":\"30\",\"Sp. Def\":\"42\",\"Species\":\"Tiny Bee Pokémon\",\"Speed\":\"70\",\"Total\":\"244\",\"Type\":[\"bug\",\"Flying\"]},\"Combusken\":{\"#\":\" 256\",\"Attack\":\"85\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"60\",\"Sp. Atk\":\"85\",\"Sp. Def\":\"60\",\"Species\":\"Young Fowl Pokémon\",\"Speed\":\"55\",\"Total\":\"405\",\"Type\":[\"Fire\",\"Fighting\"]},\"Conkeldurr\":{\"#\":\" 534\",\"Attack\":\"140\",\"Defense\":\"95\",\"FlavorText\":\"Rather than rely on force, they master moves that utilize the centrifugal force of spinning concrete.\",\"HP\":\"105\",\"Sp. Atk\":\"55\",\"Sp. Def\":\"65\",\"Species\":\"Muscular Pokémon\",\"Speed\":\"45\",\"Total\":\"505\",\"Type\":[\"Fighting\"]},\"Corphish\":{\"#\":\" 341\",\"Attack\":\"80\",\"Defense\":\"65\",\"FlavorText\":\"\",\"HP\":\"43\",\"Sp. Atk\":\"50\",\"Sp. Def\":\"35\",\"Species\":\"Ruffian Pokémon\",\"Speed\":\"35\",\"Total\":\"308\",\"Type\":[\"Water\"]},\"Corsola\":{\"#\":\" 222\",\"Attack\":\"55\",\"Defense\":\"85\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"85\",\"Species\":\"Coral Pokémon\",\"Speed\":\"35\",\"Total\":\"380\",\"Type\":[\"Water\",\"Rock\"]},\"Cottonee\":{\"#\":\" 546\",\"Attack\":\"27\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"40\",\"Sp. Atk\":\"37\",\"Sp. Def\":\"50\",\"Species\":\"Cotton Puff Pokémon\",\"Speed\":\"66\",\"Total\":\"280\",\"Type\":[\"Grass\",\"Fairy\"]},\"Cradily\":{\"#\":\" 346\",\"Attack\":\"81\",\"Defense\":\"97\",\"FlavorText\":\"\",\"HP\":\"86\",\"Sp. Atk\":\"81\",\"Sp. Def\":\"107\",\"Species\":\"Barnacle Pokémon\",\"Speed\":\"43\",\"Total\":\"495\",\"Type\":[\"Rock\",\"Grass\"]},\"Cranidos\":{\"#\":\" 408\",\"Attack\":\"125\",\"Defense\":\"40\",\"FlavorText\":\"\",\"HP\":\"67\",\"Sp. Atk\":\"30\",\"Sp. Def\":\"30\",\"Species\":\"Head Butt Pokémon\",\"Speed\":\"58\",\"Total\":\"350\",\"Type\":[\"Rock\"]},\"Crawdaunt\":{\"#\":\" 342\",\"Attack\":\"120\",\"Defense\":\"85\",\"FlavorText\":\"\",\"HP\":\"63\",\"Sp. Atk\":\"90\",\"Sp. Def\":\"55\",\"Species\":\"Rogue Pokémon\",\"Speed\":\"55\",\"Total\":\"468\",\"Type\":[\"Water\",\"Dark\"]},\"Cresselia\":{\"#\":\" 488\",\"Attack\":\"70\",\"Defense\":\"120\",\"FlavorText\":\"\",\"HP\":\"120\",\"Sp. Atk\":\"75\",\"Sp. Def\":\"130\",\"Species\":\"Lunar Pokémon\",\"Speed\":\"85\",\"Total\":\"600\",\"Type\":[\"Psychic\"]},\"Croagunk\":{\"#\":\" 453\",\"Attack\":\"61\",\"Defense\":\"40\",\"FlavorText\":\"\",\"HP\":\"48\",\"Sp. Atk\":\"61\",\"Sp. Def\":\"40\",\"Species\":\"Toxic Mouth Pokémon\",\"Speed\":\"50\",\"Total\":\"300\",\"Type\":[\"Poison\",\"Fighting\"]},\"Crobat\":{\"#\":\" 169\",\"Attack\":\"90\",\"Defense\":\"80\",\"FlavorText\":\"\",\"HP\":\"85\",\"Sp. Atk\":\"70\",\"Sp. Def\":\"80\",\"Species\":\"Bat Pokémon\",\"Speed\":\"130\",\"Total\":\"535\",\"Type\":[\"Poison\",\"Flying\"]},\"Croconaw\":{\"#\":\" 159\",\"Attack\":\"80\",\"Defense\":\"80\",\"FlavorText\":\"\",\"HP\":\"65\",\"Sp. Atk\":\"59\",\"Sp. Def\":\"63\",\"Species\":\"Big Jaw Pokémon\",\"Speed\":\"58\",\"Total\":\"405\",\"Type\":[\"Water\"]},\"Crustle\":{\"#\":\" 558\",\"Attack\":\"95\",\"Defense\":\"125\",\"FlavorText\":\"Competing for territory, Crustle fight viciously. The one whose boulder is broken is the loser of the battle.\",\"HP\":\"70\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"75\",\"Species\":\"Stone Home Pokémon\",\"Speed\":\"45\",\"Total\":\"475\",\"Type\":[\"bug\",\"Rock\"]},\"Cryogonal\":{\"#\":\" 615\",\"Attack\":\"50\",\"Defense\":\"30\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"95\",\"Sp. Def\":\"135\",\"Species\":\"Crystallizing Pokémon\",\"Speed\":\"105\",\"Total\":\"485\",\"Type\":[\"Ice\"]},\"Cubchoo\":{\"#\":\" 613\",\"Attack\":\"70\",\"Defense\":\"40\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"40\",\"Species\":\"Chill Pokémon\",\"Speed\":\"40\",\"Total\":\"305\",\"Type\":[\"Ice\"]},\"Cubone\":{\"#\":\" 104\",\"Attack\":\"50\",\"Defense\":\"95\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"40\",\"Sp. Def\":\"50\",\"Species\":\"Lonely Pokémon\",\"Speed\":\"35\",\"Total\":\"320\",\"Type\":[\"Ground\"]},\"Cyndaquil\":{\"#\":\" 155\",\"Attack\":\"52\",\"Defense\":\"43\",\"FlavorText\":\"\",\"HP\":\"39\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"50\",\"Species\":\"Fire Mouse Pokémon\",\"Speed\":\"65\",\"Total\":\"309\",\"Type\":[\"Fire\"]},\"Darkrai\":{\"#\":\" 491\",\"Attack\":\"90\",\"Defense\":\"90\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"135\",\"Sp. Def\":\"90\",\"Species\":\"Pitch-Black Pokémon\",\"Speed\":\"125\",\"Total\":\"600\",\"Type\":[\"Dark\"]},\"Darmanitan ( Standard Mode )\":{\"#\":\" 555\",\"Attack\":\"140\",\"Defense\":\"55\",\"FlavorText\":\"\",\"HP\":\"105\",\"Sp. Atk\":\"30\",\"Sp. Def\":\"55\",\"Species\":\"\",\"Speed\":\"95\",\"Total\":\"480\",\"Type\":[\"Fire\"]},\"Darmanitan ( Zen Mode )\":{\"#\":\" 555\",\"Attack\":\"30\",\"Defense\":\"105\",\"FlavorText\":\"\",\"HP\":\"105\",\"Sp. Atk\":\"140\",\"Sp. Def\":\"105\",\"Species\":\"\",\"Speed\":\"55\",\"Total\":\"540\",\"Type\":[\"Fire\",\"Psychic\"]},\"Darumaka\":{\"#\":\" 554\",\"Attack\":\"90\",\"Defense\":\"45\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"15\",\"Sp. Def\":\"45\",\"Species\":\"Zen Charm Pokémon\",\"Speed\":\"50\",\"Total\":\"315\",\"Type\":[\"Fire\"]},\"Dedenne\":{\"#\":\" 702\",\"Attack\":\"58\",\"Defense\":\"57\",\"FlavorText\":\"\",\"HP\":\"67\",\"Sp. Atk\":\"81\",\"Sp. Def\":\"67\",\"Species\":\"Antenna Pokémon\",\"Speed\":\"101\",\"Total\":\"431\",\"Type\":[\"Electric\",\"Fairy\"]},\"Deerling\":{\"#\":\" 585\",\"Attack\":\"60\",\"Defense\":\"50\",\"FlavorText\":\"\",\"HP\":\"60\",\"Sp. Atk\":\"40\",\"Sp. Def\":\"50\",\"Species\":\"Season Pokémon\",\"Speed\":\"75\",\"Total\":\"335\",\"Type\":[\"Normal\",\"Grass\"]},\"Deino\":{\"#\":\" 633\",\"Attack\":\"65\",\"Defense\":\"50\",\"FlavorText\":\"\",\"HP\":\"52\",\"Sp. Atk\":\"45\",\"Sp. Def\":\"50\",\"Species\":\"Irate Pokémon\",\"Speed\":\"38\",\"Total\":\"300\",\"Type\":[\"Dark\",\"Dragon\"]},\"Delcatty\":{\"#\":\" 301\",\"Attack\":\"65\",\"Defense\":\"65\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"55\",\"Sp. Def\":\"55\",\"Species\":\"Prim Pokémon\",\"Speed\":\"70\",\"Total\":\"380\",\"Type\":[\"Normal\"]},\"Delibird\":{\"#\":\" 225\",\"Attack\":\"55\",\"Defense\":\"45\",\"FlavorText\":\"\",\"HP\":\"45\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"45\",\"Species\":\"Delivery Pokémon\",\"Speed\":\"75\",\"Total\":\"330\",\"Type\":[\"Ice\",\"Flying\"]},\"Delphox\":{\"#\":\" 655\",\"Attack\":\"69\",\"Defense\":\"72\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"114\",\"Sp. Def\":\"100\",\"Species\":\"Fox Pokémon\",\"Speed\":\"104\",\"Total\":\"534\",\"Type\":[\"Fire\",\"Psychic\"]},\"Deoxys ( Attack Forme )\":{\"#\":\" 386\",\"Attack\":\"180\",\"Defense\":\"20\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"180\",\"Sp. Def\":\"20\",\"Species\":\"\",\"Speed\":\"150\",\"Total\":\"600\",\"Type\":[\"Psychic\"]},\"Deoxys ( Defense Forme )\":{\"#\":\" 386\",\"Attack\":\"70\",\"Defense\":\"160\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"70\",\"Sp. Def\":\"160\",\"Species\":\"\",\"Speed\":\"90\",\"Total\":\"600\",\"Type\":[\"Psychic\"]},\"Deoxys ( Normal Forme )\":{\"#\":\" 386\",\"Attack\":\"150\",\"Defense\":\"50\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"150\",\"Sp. Def\":\"50\",\"Species\":\"\",\"Speed\":\"150\",\"Total\":\"600\",\"Type\":[\"Psychic\"]},\"Deoxys ( Speed Forme )\":{\"#\":\" 386\",\"Attack\":\"95\",\"Defense\":\"90\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"95\",\"Sp. Def\":\"90\",\"Species\":\"\",\"Speed\":\"180\",\"Total\":\"600\",\"Type\":[\"Psychic\"]},\"Dewgong\":{\"#\":\" 087\",\"Attack\":\"70\",\"Defense\":\"80\",\"FlavorText\":\"\",\"HP\":\"90\",\"Sp. Atk\":\"70\",\"Sp. Def\":\"95\",\"Species\":\"Sea Lion Pokémon\",\"Speed\":\"70\",\"Total\":\"475\",\"Type\":[\"Water\",\"Ice\"]},\"Dewott\":{\"#\":\" 502\",\"Attack\":\"75\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"83\",\"Sp. Def\":\"60\",\"Species\":\"Discipline Pokémon\",\"Speed\":\"60\",\"Total\":\"413\",\"Type\":[\"Water\"]},\"Dialga\":{\"#\":\" 483\",\"Attack\":\"120\",\"Defense\":\"120\",\"FlavorText\":\"\",\"HP\":\"100\",\"Sp. Atk\":\"150\",\"Sp. Def\":\"100\",\"Species\":\"Temporal Pokémon\",\"Speed\":\"90\",\"Total\":\"680\",\"Type\":[\"Steel\",\"Dragon\"]},\"Diancie\":{\"#\":\" 719\",\"Attack\":\"100\",\"Defense\":\"150\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"100\",\"Sp. Def\":\"150\",\"Species\":\"Jewel Pokémon\",\"Speed\":\"50\",\"Total\":\"600\",\"Type\":[\"Rock\",\"Fairy\"]},\"Diancie ( Mega Diancie )\":{\"#\":\" 719\",\"Attack\":\"160\",\"Defense\":\"110\",\"FlavorText\":\"\",\"HP\":\"50\",\"Sp. Atk\":\"160\",\"Sp. Def\":\"110\",\"Species\":\"\",\"Speed\":\"110\",\"Total\":\"700\",\"Type\":[\"Rock\",\"Fairy\"]},\"Diggersby\":{\"#\":\" 660\",\"Attack\":\"56\",\"Defense\":\"77\",\"FlavorText\":\"\",\"HP\":\"85\",\"Sp. Atk\":\"50\",\"Sp. Def\":\"77\",\"Species\":\"Digging Pokémon\",\"Speed\":\"78\",\"Total\":\"423\",\"Type\":[\"Normal\",\"Ground\"]},\"Diglett\":{\"#\":\" 050\",\"Attack\":\"55\",\"Defense\":\"25\",\"FlavorText\":\"\",\"HP\":\"10\",\"Sp. Atk\":\"35\",\"Sp. Def\":\"45\",\"Species\":\"Mole Pokémon\",\"Speed\":\"95\",\"Total\":\"265\",\"Type\":[\"Ground\"]},\"Ditto\":{\"#\":\" 132\",\"Attack\":\"48\",\"Defense\":\"48\",\"FlavorText\":\"\",\"HP\":\"48\",\"Sp. Atk\":\"48\",\"Sp. Def\":\"48\",\"Species\":\"Transform Pokémon\",\"Speed\":\"48\",\"Total\":\"288\",\"Type\":[\"Normal\"]},\"Dodrio\":{\"#\":\" 085\",\"Attack\":\"110\",\"Defense\":\"70\",\"FlavorText\":\"\",\"HP\":\"60\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"60\",\"Species\":\"Triple Bird Pokémon\",\"Speed\":\"100\",\"Total\":\"460\",\"Type\":[\"Normal\",\"Flying\"]},\"Doduo\":{\"#\":\" 084\",\"Attack\":\"85\",\"Defense\":\"45\",\"FlavorText\":\"\",\"HP\":\"35\",\"Sp. Atk\":\"35\",\"Sp. Def\":\"35\",\"Species\":\"Twin Bird Pokémon\",\"Speed\":\"75\",\"Total\":\"310\",\"Type\":[\"Normal\",\"Flying\"]},\"Donphan\":{\"#\":\" 232\",\"Attack\":\"120\",\"Defense\":\"120\",\"FlavorText\":\"\",\"HP\":\"90\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"60\",\"Species\":\"Armor Pokémon\",\"Speed\":\"50\",\"Total\":\"500\",\"Type\":[\"Ground\"]},\"Doublade\":{\"#\":\" 680\",\"Attack\":\"110\",\"Defense\":\"150\",\"FlavorText\":\"\",\"HP\":\"59\",\"Sp. Atk\":\"45\",\"Sp. Def\":\"49\",\"Species\":\"Sword Pokémon\",\"Speed\":\"35\",\"Total\":\"448\",\"Type\":[\"Steel\",\"Ghost\"]},\"Dragalge\":{\"#\":\" 691\",\"Attack\":\"75\",\"Defense\":\"90\",\"FlavorText\":\"\",\"HP\":\"65\",\"Sp. Atk\":\"97\",\"Sp. Def\":\"123\",\"Species\":\"Mock Kelp Pokémon\",\"Speed\":\"44\",\"Total\":\"494\",\"Type\":[\"Poison\",\"Dragon\"]},\"Dragonair\":{\"#\":\" 148\",\"Attack\":\"84\",\"Defense\":\"65\",\"FlavorText\":\"It is called the divine POKéMON. When its entire body brightens slightly, the weather changes.\",\"HP\":\"61\",\"Sp. Atk\":\"70\",\"Sp. Def\":\"70\",\"Species\":\"Dragon Pokémon\",\"Speed\":\"70\",\"Total\":\"420\",\"Type\":[\"Dragon\"]},\"Dragonite\":{\"#\":\" 149\",\"Attack\":\"134\",\"Defense\":\"95\",\"FlavorText\":\"It is said that somewhere in the ocean lies an island where these gather. Only they live there.\",\"HP\":\"91\",\"Sp. Atk\":\"100\",\"Sp. Def\":\"100\",\"Species\":\"Dragon Pokémon\",\"Speed\":\"80\",\"Total\":\"600\",\"Type\":[\"Dragon\",\"Flying\"]},\"Drapion\":{\"#\":\" 452\",\"Attack\":\"90\",\"Defense\":\"110\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"75\",\"Species\":\"Ogre Scorp Pokémon\",\"Speed\":\"95\",\"Total\":\"500\",\"Type\":[\"Poison\",\"Dark\"]},\"Dratini\":{\"#\":\" 147\",\"Attack\":\"64\",\"Defense\":\"45\",\"FlavorText\":\"It sheds many layers of skin as it grows larger. During this process, it is protected by a rapid waterfall.\",\"HP\":\"41\",\"Sp. Atk\":\"50\",\"Sp. Def\":\"50\",\"Species\":\"Dragon Pokémon\",\"Speed\":\"50\",\"Total\":\"300\",\"Type\":[\"Dragon\"]},\"Drifblim\":{\"#\":\" 426\",\"Attack\":\"80\",\"Defense\":\"44\",\"FlavorText\":\"\",\"HP\":\"150\",\"Sp. Atk\":\"90\",\"Sp. Def\":\"54\",\"Species\":\"Blimp Pokémon\",\"Speed\":\"80\",\"Total\":\"498\",\"Type\":[\"Ghost\",\"Flying\"]},\"Drifloon\":{\"#\":\" 425\",\"Attack\":\"50\",\"Defense\":\"34\",\"FlavorText\":\"\",\"HP\":\"90\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"44\",\"Species\":\"Balloon Pokémon\",\"Speed\":\"70\",\"Total\":\"348\",\"Type\":[\"Ghost\",\"Flying\"]},\"Drilbur\":{\"#\":\" 529\",\"Attack\":\"85\",\"Defense\":\"40\",\"FlavorText\":\"\",\"HP\":\"60\",\"Sp. Atk\":\"30\",\"Sp. Def\":\"45\",\"Species\":\"Mole Pokémon\",\"Speed\":\"68\",\"Total\":\"328\",\"Type\":[\"Ground\"]},\"Drowzee\":{\"#\":\" 096\",\"Attack\":\"48\",\"Defense\":\"45\",\"FlavorText\":\"When it twitches its nose, it can tell where someone is sleeping and what that person is dreaming about.\",\"HP\":\"60\",\"Sp. Atk\":\"43\",\"Sp. Def\":\"90\",\"Species\":\"Hypnosis Pokémon\",\"Speed\":\"42\",\"Total\":\"328\",\"Type\":[\"Psychic\"]},\"Druddigon\":{\"#\":\" 621\",\"Attack\":\"120\",\"Defense\":\"90\",\"FlavorText\":\"It warms its body by absorbing sunlight with its wings. When its body temperature falls, it can no longer move.\",\"HP\":\"77\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"90\",\"Species\":\"Cave Pokémon\",\"Speed\":\"48\",\"Total\":\"485\",\"Type\":[\"Dragon\"]},\"Ducklett\":{\"#\":\" 580\",\"Attack\":\"44\",\"Defense\":\"50\",\"FlavorText\":\"They are better at swimming than flying, and they happily eat their favorite food, peat moss, as they dive underwater.\",\"HP\":\"62\",\"Sp. Atk\":\"44\",\"Sp. Def\":\"50\",\"Species\":\"Water Bird Pokémon\",\"Speed\":\"55\",\"Total\":\"305\",\"Type\":[\"Water\",\"Flying\"]},\"Dugtrio\":{\"#\":\" 051\",\"Attack\":\"80\",\"Defense\":\"50\",\"FlavorText\":\"\",\"HP\":\"35\",\"Sp. Atk\":\"50\",\"Sp. Def\":\"70\",\"Species\":\"Mole Pokémon\",\"Speed\":\"120\",\"Total\":\"405\",\"Type\":[\"Ground\"]},\"Dunsparce\":{\"#\":\" 206\",\"Attack\":\"70\",\"Defense\":\"70\",\"FlavorText\":\"\",\"HP\":\"100\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"65\",\"Species\":\"Land Snake Pokémon\",\"Speed\":\"45\",\"Total\":\"415\",\"Type\":[\"Normal\"]},\"Duosion\":{\"#\":\" 578\",\"Attack\":\"40\",\"Defense\":\"50\",\"FlavorText\":\"When their two divided brains think the same thoughts, their psychic power is maximized.\",\"HP\":\"65\",\"Sp. Atk\":\"125\",\"Sp. Def\":\"60\",\"Species\":\"Mitosis Pokémon\",\"Speed\":\"30\",\"Total\":\"370\",\"Type\":[\"Psychic\"]},\"Durant\":{\"#\":\" 632\",\"Attack\":\"109\",\"Defense\":\"112\",\"FlavorText\":\"They attack in groups, covering themselves in steel armor to protect themselves from Heatmor.\",\"HP\":\"58\",\"Sp. Atk\":\"48\",\"Sp. Def\":\"48\",\"Species\":\"Iron Ant Pokémon\",\"Speed\":\"109\",\"Total\":\"484\",\"Type\":[\"bug\",\"Steel\"]},\"Dusclops\":{\"#\":\" 356\",\"Attack\":\"70\",\"Defense\":\"130\",\"FlavorText\":\"\",\"HP\":\"40\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"130\",\"Species\":\"Beckon Pokémon\",\"Speed\":\"25\",\"Total\":\"455\",\"Type\":[\"Ghost\"]},\"Dusknoir\":{\"#\":\" 477\",\"Attack\":\"100\",\"Defense\":\"135\",\"FlavorText\":\"\",\"HP\":\"45\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"135\",\"Species\":\"Gripper Pokémon\",\"Speed\":\"45\",\"Total\":\"525\",\"Type\":[\"Ghost\"]},\"Duskull\":{\"#\":\" 355\",\"Attack\":\"40\",\"Defense\":\"90\",\"FlavorText\":\"\",\"HP\":\"20\",\"Sp. Atk\":\"30\",\"Sp. Def\":\"90\",\"Species\":\"Requiem Pokémon\",\"Speed\":\"25\",\"Total\":\"295\",\"Type\":[\"Ghost\"]},\"Dustox\":{\"#\":\" 269\",\"Attack\":\"50\",\"Defense\":\"70\",\"FlavorText\":\"Toxic powder is scattered with each flap. At night, it is known to strip leaves off trees lining boulevards.\",\"HP\":\"60\",\"Sp. Atk\":\"50\",\"Sp. Def\":\"90\",\"Species\":\"Poison Moth Pokémon\",\"Speed\":\"65\",\"Total\":\"385\",\"Type\":[\"bug\",\"Poison\"]},\"Dwebble\":{\"#\":\" 557\",\"Attack\":\"65\",\"Defense\":\"85\",\"FlavorText\":\"When it finds a stone of a suitable size, it secretes a liquid from its mouth to open up a hole to crawl into.\",\"HP\":\"50\",\"Sp. Atk\":\"35\",\"Sp. Def\":\"35\",\"Species\":\"Rock Inn Pokémon\",\"Speed\":\"55\",\"Total\":\"325\",\"Type\":[\"bug\",\"Rock\"]},\"Eelektrik\":{\"#\":\" 603\",\"Attack\":\"85\",\"Defense\":\"70\",\"FlavorText\":\"\",\"HP\":\"65\",\"Sp. Atk\":\"75\",\"Sp. Def\":\"70\",\"Species\":\"EleFish Pokémon\",\"Speed\":\"40\",\"Total\":\"405\",\"Type\":[\"Electric\"]},\"Eelektross\":{\"#\":\" 604\",\"Attack\":\"115\",\"Defense\":\"80\",\"FlavorText\":\"\",\"HP\":\"85\",\"Sp. Atk\":\"105\",\"Sp. Def\":\"80\",\"Species\":\"EleFish Pokémon\",\"Speed\":\"50\",\"Total\":\"515\",\"Type\":[\"Electric\"]},\"Eevee\":{\"#\":\" 133\",\"Attack\":\"55\",\"Defense\":\"50\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"45\",\"Sp. Def\":\"65\",\"Species\":\"Evolution Pokémon\",\"Speed\":\"55\",\"Total\":\"325\",\"Type\":[\"Normal\"]},\"Ekans\":{\"#\":\" 023\",\"Attack\":\"60\",\"Defense\":\"44\",\"FlavorText\":\"\",\"HP\":\"35\",\"Sp. Atk\":\"40\",\"Sp. Def\":\"54\",\"Species\":\"Snake Pokémon\",\"Speed\":\"55\",\"Total\":\"288\",\"Type\":[\"Poison\"]},\"Electabuzz\":{\"#\":\" 125\",\"Attack\":\"83\",\"Defense\":\"57\",\"FlavorText\":\"\",\"HP\":\"65\",\"Sp. Atk\":\"95\",\"Sp. Def\":\"85\",\"Species\":\"Electric Pokémon\",\"Speed\":\"105\",\"Total\":\"490\",\"Type\":[\"Electric\"]},\"Electivire\":{\"#\":\" 466\",\"Attack\":\"123\",\"Defense\":\"67\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"95\",\"Sp. Def\":\"85\",\"Species\":\"Thunderbolt Pokémon\",\"Speed\":\"95\",\"Total\":\"540\",\"Type\":[\"Electric\"]},\"Electrike\":{\"#\":\" 309\",\"Attack\":\"45\",\"Defense\":\"40\",\"FlavorText\":\"It generates electricity using friction from the atmosphere. In seasons with especially arid air, its entire body blazes with violent showers of sparks.\",\"HP\":\"40\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"40\",\"Species\":\"Lightning Pokémon\",\"Speed\":\"65\",\"Total\":\"295\",\"Type\":[\"Electric\"]},\"Electrode\":{\"#\":\" 101\",\"Attack\":\"50\",\"Defense\":\"70\",\"FlavorText\":\"\",\"HP\":\"60\",\"Sp. Atk\":\"80\",\"Sp. Def\":\"80\",\"Species\":\"Ball Pokémon\",\"Speed\":\"140\",\"Total\":\"480\",\"Type\":[\"Electric\"]},\"Elekid\":{\"#\":\" 239\",\"Attack\":\"63\",\"Defense\":\"37\",\"FlavorText\":\"If it touches metal and discharges the electricity it has stored in its body, an ELEKID begins swinging its arms in circles to recharge itself.\",\"HP\":\"45\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"55\",\"Species\":\"Electric Pokémon\",\"Speed\":\"95\",\"Total\":\"360\",\"Type\":[\"Electric\"]},\"Elgyem\":{\"#\":\" 605\",\"Attack\":\"55\",\"Defense\":\"55\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"85\",\"Sp. Def\":\"55\",\"Species\":\"Cerebral Pokémon\",\"Speed\":\"30\",\"Total\":\"335\",\"Type\":[\"Psychic\"]},\"Emboar\":{\"#\":\" 500\",\"Attack\":\"123\",\"Defense\":\"65\",\"FlavorText\":\"\",\"HP\":\"110\",\"Sp. Atk\":\"100\",\"Sp. Def\":\"65\",\"Species\":\"Mega Fire Pig Pokémon\",\"Speed\":\"65\",\"Total\":\"528\",\"Type\":[\"Fire\",\"Fighting\"]},\"Emolga\":{\"#\":\" 587\",\"Attack\":\"75\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"75\",\"Sp. Def\":\"60\",\"Species\":\"Sky Squirrel Pokémon\",\"Speed\":\"103\",\"Total\":\"428\",\"Type\":[\"Electric\",\"Flying\"]},\"Empoleon\":{\"#\":\" 395\",\"Attack\":\"86\",\"Defense\":\"88\",\"FlavorText\":\"\",\"HP\":\"84\",\"Sp. Atk\":\"111\",\"Sp. Def\":\"101\",\"Species\":\"Emperor Pokémon\",\"Speed\":\"60\",\"Total\":\"530\",\"Type\":[\"Water\",\"Steel\"]},\"Entei\":{\"#\":\" 244\",\"Attack\":\"115\",\"Defense\":\"85\",\"FlavorText\":\"\",\"HP\":\"115\",\"Sp. Atk\":\"90\",\"Sp. Def\":\"75\",\"Species\":\"Volcano Pokémon\",\"Speed\":\"100\",\"Total\":\"580\",\"Type\":[\"Fire\"]},\"Escavalier\":{\"#\":\" 589\",\"Attack\":\"135\",\"Defense\":\"105\",\"FlavorText\":\"These Pokémon evolve by wearing the shell covering of a Shelmet. The steel armor protects their whole body.\",\"HP\":\"70\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"105\",\"Species\":\"Cavalry Pokémon\",\"Speed\":\"20\",\"Total\":\"495\",\"Type\":[\"bug\",\"Steel\"]},\"Espeon\":{\"#\":\" 196\",\"Attack\":\"65\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"65\",\"Sp. Atk\":\"130\",\"Sp. Def\":\"95\",\"Species\":\"Sun Pokémon\",\"Speed\":\"110\",\"Total\":\"525\",\"Type\":[\"Psychic\"]},\"Espurr\":{\"#\":\" 677\",\"Attack\":\"48\",\"Defense\":\"54\",\"FlavorText\":\"\",\"HP\":\"62\",\"Sp. Atk\":\"63\",\"Sp. Def\":\"60\",\"Species\":\"Restraint Pokémon\",\"Speed\":\"68\",\"Total\":\"355\",\"Type\":[\"Psychic\"]},\"Excadrill\":{\"#\":\" 530\",\"Attack\":\"135\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"110\",\"Sp. Atk\":\"50\",\"Sp. Def\":\"65\",\"Species\":\"Subterrene Pokémon\",\"Speed\":\"88\",\"Total\":\"508\",\"Type\":[\"Ground\",\"Steel\"]},\"Exeggcute\":{\"#\":\" 102\",\"Attack\":\"40\",\"Defense\":\"80\",\"FlavorText\":\"If even one is separated from the group, the energy bond between the six will make them rejoin instantly.\",\"HP\":\"60\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"45\",\"Species\":\"Egg Pokémon\",\"Speed\":\"40\",\"Total\":\"325\",\"Type\":[\"Grass\",\"Psychic\"]},\"Exeggutor\":{\"#\":\" 103\",\"Attack\":\"95\",\"Defense\":\"85\",\"FlavorText\":\"Living in a good environment makes it grow lots of heads. A head that drops off becomes an EXEGGCUTE.\",\"HP\":\"95\",\"Sp. Atk\":\"125\",\"Sp. Def\":\"65\",\"Species\":\"Coconut Pokémon\",\"Speed\":\"55\",\"Total\":\"520\",\"Type\":[\"Grass\",\"Psychic\"]},\"Exploud\":{\"#\":\" 295\",\"Attack\":\"91\",\"Defense\":\"63\",\"FlavorText\":\"\",\"HP\":\"104\",\"Sp. Atk\":\"91\",\"Sp. Def\":\"73\",\"Species\":\"Loud Noise Pokémon\",\"Speed\":\"68\",\"Total\":\"490\",\"Type\":[\"Normal\"]},\"Farfetch'd\":{\"#\":\" 083\",\"Attack\":\"65\",\"Defense\":\"55\",\"FlavorText\":\"\",\"HP\":\"52\",\"Sp. Atk\":\"58\",\"Sp. Def\":\"62\",\"Species\":\"\",\"Speed\":\"60\",\"Total\":\"352\",\"Type\":[\"Normal\",\"Flying\"]},\"Fearow\":{\"#\":\" 022\",\"Attack\":\"90\",\"Defense\":\"65\",\"FlavorText\":\"It uses its long beak to attack. It has a surprisingly long reach, so it must be treated with caution.\",\"HP\":\"65\",\"Sp. Atk\":\"61\",\"Sp. Def\":\"61\",\"Species\":\"Beak Pokémon\",\"Speed\":\"100\",\"Total\":\"442\",\"Type\":[\"Normal\",\"Flying\"]},\"Feebas\":{\"#\":\" 349\",\"Attack\":\"15\",\"Defense\":\"20\",\"FlavorText\":\"\",\"HP\":\"20\",\"Sp. Atk\":\"10\",\"Sp. Def\":\"55\",\"Species\":\"Fish Pokémon\",\"Speed\":\"80\",\"Total\":\"200\",\"Type\":[\"Water\"]},\"Fennekin\":{\"#\":\" 653\",\"Attack\":\"45\",\"Defense\":\"40\",\"FlavorText\":\"\",\"HP\":\"40\",\"Sp. Atk\":\"62\",\"Sp. Def\":\"60\",\"Species\":\"Fox Pokémon\",\"Speed\":\"60\",\"Total\":\"307\",\"Type\":[\"Fire\"]},\"Feraligatr\":{\"#\":\" 160\",\"Attack\":\"105\",\"Defense\":\"100\",\"FlavorText\":\"\",\"HP\":\"85\",\"Sp. Atk\":\"79\",\"Sp. Def\":\"83\",\"Species\":\"Big Jaw Pokémon\",\"Speed\":\"78\",\"Total\":\"530\",\"Type\":[\"Water\"]},\"Ferroseed\":{\"#\":\" 597\",\"Attack\":\"50\",\"Defense\":\"91\",\"FlavorText\":\"\",\"HP\":\"44\",\"Sp. Atk\":\"24\",\"Sp. Def\":\"86\",\"Species\":\"Thorn Seed Pokémon\",\"Speed\":\"10\",\"Total\":\"305\",\"Type\":[\"Grass\",\"Steel\"]},\"Ferrothorn\":{\"#\":\" 598\",\"Attack\":\"94\",\"Defense\":\"131\",\"FlavorText\":\"\",\"HP\":\"74\",\"Sp. Atk\":\"54\",\"Sp. Def\":\"116\",\"Species\":\"Thorn Pod Pokémon\",\"Speed\":\"20\",\"Total\":\"489\",\"Type\":[\"Grass\",\"Steel\"]},\"Finneon\":{\"#\":\" 456\",\"Attack\":\"49\",\"Defense\":\"56\",\"FlavorText\":\"\",\"HP\":\"49\",\"Sp. Atk\":\"49\",\"Sp. Def\":\"61\",\"Species\":\"Wing Fish Pokémon\",\"Speed\":\"66\",\"Total\":\"330\",\"Type\":[\"Water\"]},\"Flaaffy\":{\"#\":\" 180\",\"Attack\":\"55\",\"Defense\":\"55\",\"FlavorText\":\"Its fleece quality changes to generate strong static electricity with a small amount of wool. The bare, slick parts of its hide are shielded against electricity.\",\"HP\":\"70\",\"Sp. Atk\":\"80\",\"Sp. Def\":\"60\",\"Species\":\"Wool Pokémon\",\"Speed\":\"45\",\"Total\":\"365\",\"Type\":[\"Electric\"]},\"Flabébé\":{\"#\":\" 669\",\"Attack\":\"38\",\"Defense\":\"39\",\"FlavorText\":\"\",\"HP\":\"44\",\"Sp. Atk\":\"61\",\"Sp. Def\":\"79\",\"Species\":\"\",\"Speed\":\"42\",\"Total\":\"303\",\"Type\":[\"Fairy\"]},\"Flareon\":{\"#\":\" 136\",\"Attack\":\"130\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"65\",\"Sp. Atk\":\"95\",\"Sp. Def\":\"110\",\"Species\":\"Flame Pokémon\",\"Speed\":\"65\",\"Total\":\"525\",\"Type\":[\"Fire\"]},\"Fletchinder\":{\"#\":\" 662\",\"Attack\":\"73\",\"Defense\":\"55\",\"FlavorText\":\"\",\"HP\":\"62\",\"Sp. Atk\":\"56\",\"Sp. Def\":\"52\",\"Species\":\"Ember Pokémon\",\"Speed\":\"84\",\"Total\":\"382\",\"Type\":[\"Fire\",\"Flying\"]},\"Fletchling\":{\"#\":\" 661\",\"Attack\":\"50\",\"Defense\":\"43\",\"FlavorText\":\"\",\"HP\":\"45\",\"Sp. Atk\":\"40\",\"Sp. Def\":\"38\",\"Species\":\"Tiny Robin Pokémon\",\"Speed\":\"62\",\"Total\":\"278\",\"Type\":[\"Normal\",\"Flying\"]},\"Floatzel\":{\"#\":\" 419\",\"Attack\":\"105\",\"Defense\":\"55\",\"FlavorText\":\"\",\"HP\":\"85\",\"Sp. Atk\":\"85\",\"Sp. Def\":\"50\",\"Species\":\"Sea Weasel Pokémon\",\"Speed\":\"115\",\"Total\":\"495\",\"Type\":[\"Water\"]},\"Floette\":{\"#\":\" 670\",\"Attack\":\"45\",\"Defense\":\"47\",\"FlavorText\":\"\",\"HP\":\"54\",\"Sp. Atk\":\"75\",\"Sp. Def\":\"98\",\"Species\":\"Single Bloom Pokémon\",\"Speed\":\"52\",\"Total\":\"371\",\"Type\":[\"Fairy\"]},\"Florges\":{\"#\":\" 671\",\"Attack\":\"65\",\"Defense\":\"68\",\"FlavorText\":\"\",\"HP\":\"78\",\"Sp. Atk\":\"112\",\"Sp. Def\":\"154\",\"Species\":\"Garden Pokémon\",\"Speed\":\"75\",\"Total\":\"552\",\"Type\":[\"Fairy\"]},\"Flygon\":{\"#\":\" 330\",\"Attack\":\"100\",\"Defense\":\"80\",\"FlavorText\":\"\",\"HP\":\"80\",\"Sp. Atk\":\"80\",\"Sp. Def\":\"80\",\"Species\":\"Mystic Pokémon\",\"Speed\":\"100\",\"Total\":\"520\",\"Type\":[\"Ground\",\"Dragon\"]},\"Foongus\":{\"#\":\" 590\",\"Attack\":\"55\",\"Defense\":\"45\",\"FlavorText\":\"\",\"HP\":\"69\",\"Sp. Atk\":\"55\",\"Sp. Def\":\"55\",\"Species\":\"Mushroom Pokémon\",\"Speed\":\"15\",\"Total\":\"294\",\"Type\":[\"Grass\",\"Poison\"]},\"Forretress\":{\"#\":\" 205\",\"Attack\":\"90\",\"Defense\":\"140\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"60\",\"Species\":\"Bagworm Pokémon\",\"Speed\":\"40\",\"Total\":\"465\",\"Type\":[\"bug\",\"Steel\"]},\"Fraxure\":{\"#\":\" 611\",\"Attack\":\"117\",\"Defense\":\"70\",\"FlavorText\":\"A broken tusk will not grow back, so it diligently sharpens its tusks on river rocks after the end of a battle.\",\"HP\":\"66\",\"Sp. Atk\":\"40\",\"Sp. Def\":\"50\",\"Species\":\"Axe Jaw Pokémon\",\"Speed\":\"67\",\"Total\":\"410\",\"Type\":[\"Dragon\"]},\"Frillish\":{\"#\":\" 592\",\"Attack\":\"40\",\"Defense\":\"50\",\"FlavorText\":\"\",\"HP\":\"55\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"85\",\"Species\":\"Floating Pokémon\",\"Speed\":\"40\",\"Total\":\"335\",\"Type\":[\"Water\",\"Ghost\"]},\"Froakie\":{\"#\":\" 656\",\"Attack\":\"56\",\"Defense\":\"40\",\"FlavorText\":\"\",\"HP\":\"41\",\"Sp. Atk\":\"62\",\"Sp. Def\":\"44\",\"Species\":\"Bubble Frog Pokémon\",\"Speed\":\"71\",\"Total\":\"314\",\"Type\":[\"Water\"]},\"Frogadier\":{\"#\":\" 657\",\"Attack\":\"63\",\"Defense\":\"52\",\"FlavorText\":\"\",\"HP\":\"54\",\"Sp. Atk\":\"83\",\"Sp. Def\":\"56\",\"Species\":\"Bubble Frog Pokémon\",\"Speed\":\"97\",\"Total\":\"405\",\"Type\":[\"Water\"]},\"Froslass\":{\"#\":\" 478\",\"Attack\":\"80\",\"Defense\":\"70\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"80\",\"Sp. Def\":\"70\",\"Species\":\"Snow Land Pokémon\",\"Speed\":\"110\",\"Total\":\"480\",\"Type\":[\"Ice\",\"Ghost\"]},\"Furfrou\":{\"#\":\" 676\",\"Attack\":\"80\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"75\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"90\",\"Species\":\"Poodle Pokémon\",\"Speed\":\"102\",\"Total\":\"472\",\"Type\":[\"Normal\"]},\"Furret\":{\"#\":\" 162\",\"Attack\":\"76\",\"Defense\":\"64\",\"FlavorText\":\"A FURRET has a very slim build. When under attack, it can squirm through narrow spaces and get away. In spite of its short limbs, it is very nimble and fleet.\",\"HP\":\"85\",\"Sp. Atk\":\"45\",\"Sp. Def\":\"55\",\"Species\":\"Long Body Pokémon\",\"Speed\":\"90\",\"Total\":\"415\",\"Type\":[\"Normal\"]},\"Gabite\":{\"#\":\" 444\",\"Attack\":\"90\",\"Defense\":\"65\",\"FlavorText\":\"\",\"HP\":\"68\",\"Sp. Atk\":\"50\",\"Sp. Def\":\"55\",\"Species\":\"Cave Pokémon\",\"Speed\":\"82\",\"Total\":\"410\",\"Type\":[\"Dragon\",\"Ground\"]},\"Gallade\":{\"#\":\" 475\",\"Attack\":\"125\",\"Defense\":\"65\",\"FlavorText\":\"\",\"HP\":\"68\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"115\",\"Species\":\"Blade Pokémon\",\"Speed\":\"80\",\"Total\":\"518\",\"Type\":[\"Psychic\",\"Fighting\"]},\"Gallade ( Mega Gallade )\":{\"#\":\" 475\",\"Attack\":\"165\",\"Defense\":\"95\",\"FlavorText\":\"\",\"HP\":\"68\",\"Sp. Atk\":\"65\",\"Sp. Def\":\"115\",\"Species\":\"\",\"Speed\":\"110\",\"Total\":\"618\",\"Type\":[\"Psychic\",\"Fighting\"]},\"Galvantula\":{\"#\":\" 596\",\"Attack\":\"77\",\"Defense\":\"60\",\"FlavorText\":\"\",\"HP\":\"70\",\"Sp. Atk\":\"97\",\"Sp. Def\":\"60\",\"Species\":\"EleSpider Pokémon\",\"Speed\":\"108\",\"Total\":\"472\",\"Type\":[\"bug\",\"Electric\"]},\"Garbodor\":{\"#\":\" 569\",\"Attack\":\"95\",\"Defense\":\"82\",\"FlavorText\":\"Consuming garbage makes new kinds of poison gases and liquids inside their bodies.\",\"HP\":\"80\",\"Sp. Atk\":\"60\",\"Sp. Def\":\"82\",\"Species\":\"Trash Heap Pokémon\",\"Speed\":\"75\",\"Total\":\"474\",\"Type\":[\"Poison\"]},\"Garchomp\":{\"#\":\" 445\",\"Attack\":\"130\",\"Defense\":\"95\",\"FlavorText\":\"\",\"HP\":\"108\",\"Sp. Atk\":\"80\",\"Sp. Def\":\"85\",\"Species\":\"Mach Pokémon\",\"Speed\":\"102\",\"Total\":\"600\",\"Type\":[\"Dragon\",\"Ground\"]},\"Garchomp ( Mega Garchomp )\":{\"#\":\" 445\",\"Attack\":\"170\",\"Defense\":\"115\",\"FlavorText\":\"\",\"HP\":\"108\",\"Sp. Atk\":\"120\",\"Sp. Def\":\"95\",\"Species\":\"\",\"Speed\":\"92\",\"Total\":\"700\",\"Type\":[\"Dragon\",\"Ground\"]}}"; + JSONObject jsonObject = new JSONObject(data); + Iterator iterator = jsonObject.keys(); + while (iterator.hasNext()) { + String name = iterator.next(); + if (!name.contains("(")) { + pokemons.add(new Pokemon(name, jsonObject.getJSONObject(name))); + } + } + return pokemons; + } catch (JSONException e) { + Log.i("JSON error", "error parsing json data"); + } + return pokemons; + } + +} diff --git a/app/src/main/java/com/example/nzp/pokedex/PokedexAdapter.java b/app/src/main/java/com/example/nzp/pokedex/PokedexAdapter.java new file mode 100644 index 0000000..f2d6db3 --- /dev/null +++ b/app/src/main/java/com/example/nzp/pokedex/PokedexAdapter.java @@ -0,0 +1,132 @@ +package com.example.nzp.pokedex; + +import android.content.Context; +import android.content.Intent; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Filter; +import android.widget.Filterable; +import android.widget.ImageView; +import android.widget.TextView; + +import com.squareup.picasso.Picasso; + +import java.util.ArrayList; +import java.util.Collections; + +/** + * Created by nzp on 9/19/17. + * + * PokedexAdapter adapts the Pokemon data from Pokedex.java and makes it easy to display and filter + * in a RecyclerView. + */ + +public class PokedexAdapter extends RecyclerView.Adapter implements Filterable { + + + public static final ArrayList ALL_POKEMON = new Pokedex().getPokemon(); + + private Context context; + private ArrayList filteredPokemon; + private ArrayList truePokemon; + private DisplayStyle displayStyle; + + public PokedexAdapter(Context context, ArrayList filteredPokemon, ArrayList truePokemon, DisplayStyle displayStyle) { + this.context = context; + this.filteredPokemon = filteredPokemon == null ? new ArrayList<>(ALL_POKEMON) : filteredPokemon; + this.truePokemon = truePokemon == null ? new ArrayList<>(this.filteredPokemon) : truePokemon; + this.displayStyle = displayStyle; + } + + + @Override + public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + int layoutId = (displayStyle == DisplayStyle.LIST) ? R.layout.row_view : R.layout.grid_view; + View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false); + return new CustomViewHolder(view); + } + + @Override + public void onBindViewHolder(CustomViewHolder holder, int position) { + final Pokemon pokemon = truePokemon.get(position); + String filename = "http://assets.pokemon.com/assets/cms2/img/pokedex/full/" + pokemon.number + ".png"; + Picasso.with(context).load(filename).into(holder.listImageView); + holder.listTextView.setText(pokemon.name + " #" + pokemon.number); + holder.listParentView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(context, PokemonDisplay.class); + intent.putExtra("number", pokemon.number); + context.startActivity(intent); + } + }); + } + + @Override + public int getItemCount() { + return truePokemon.size(); + } + + @Override + public Filter getFilter() { + return new PokedexSearchFilter(this, filteredPokemon); + } + + public void filterPokemon(PokedexFilter filter) { + filteredPokemon = new ArrayList<>(); + for (Pokemon pokemon : ALL_POKEMON) { + int mAtk = Integer.valueOf(pokemon.attack); + int mDef = Integer.valueOf(pokemon.defense); + int mHP = Integer.valueOf(pokemon.hp); + if (mAtk >= filter.getMinAtk() && mDef >= filter.getMinDef() && mHP >= filter.getMinHP()) { + for (int i = 0; i < pokemon.type.length; i += 1) { + if (filter.getAllowedTypes().contains(pokemon.type[i])) { + filteredPokemon.add(pokemon); + break; + } + } + } + } + setData(filteredPokemon); + } + + public ArrayList getFilteredPokemon() { + return filteredPokemon; + } + + public ArrayList getTruePokemon() { + return truePokemon; + } + + public int getRandomPokemon(int n) { + ArrayList randomPokemon = new ArrayList<>(filteredPokemon); + Collections.shuffle(randomPokemon); + if (n >= randomPokemon.size()) { + n = randomPokemon.size(); + } + setData(new ArrayList<>(randomPokemon.subList(0, n))); + return n; + } + + public void setData(ArrayList newData) { + truePokemon = newData; + notifyDataSetChanged(); + } + + public class CustomViewHolder extends RecyclerView.ViewHolder { + + View listParentView; + ImageView listImageView; + TextView listTextView; + + public CustomViewHolder(View itemView) { + super(itemView); + listParentView = itemView.findViewById(R.id.listParentView); + listImageView = itemView.findViewById(R.id.listImageView); + listTextView = itemView.findViewById(R.id.listTextView); + + } + } +} diff --git a/app/src/main/java/com/example/nzp/pokedex/PokedexFilter.java b/app/src/main/java/com/example/nzp/pokedex/PokedexFilter.java new file mode 100644 index 0000000..eed1837 --- /dev/null +++ b/app/src/main/java/com/example/nzp/pokedex/PokedexFilter.java @@ -0,0 +1,96 @@ +package com.example.nzp.pokedex; + +import java.util.ArrayList; +import java.util.Arrays; + +import static com.example.nzp.pokedex.Pokemon.NUM_TYPES; + +/** + * Created by nzp on 9/19/17. + * + * Holds information about what the user whats to filter (whether or not they want each type, plus + * minimum ATK, DEF, and HP values. + * Also provides a 30 character (or less) description of the filter to display. + */ + +public class PokedexFilter { + + private ArrayList allowedTypes; + private int minAtk, minDef, minHP; + + /* Empty constructor filters nothing. */ + public PokedexFilter() { + this(new ArrayList<>(Arrays.asList(Pokemon.TYPES)), 0, 0, 0); + } + + public PokedexFilter(ArrayList allowedTypes, int minAtk, int minDef, int minHP) { + this.allowedTypes = allowedTypes; + this.minAtk = minAtk; + this.minDef = minDef; + this.minHP = minHP; + } + + public int getMinAtk() { + return minAtk; + } + + public int getMinDef() { + return minDef; + } + + public int getMinHP() { + return minHP; + } + + public ArrayList getAllowedTypes() { + return allowedTypes; + } + + @Override + public String toString() { + //If no filter, there is no string representation + StringBuilder builder = new StringBuilder(); + boolean atkFiltered = getMinAtk() > 0; + boolean defFiltered = getMinDef() > 0; + boolean hpFiltered = getMinHP() > 0; + int numTypes = getAllowedTypes().size(); + int numFilteredStats = (atkFiltered ? 1 : 0) + (defFiltered ? 1 : 0) + (hpFiltered ? 1 : 0); + + //Type filters + if (numTypes == 0) { + builder.append("Showing no types"); + } else if (numTypes == 1) { + String type = getAllowedTypes().get(0); + builder.append("Showing ").append(type).append(" types"); + } else if (numTypes == 2 && numFilteredStats < 2) { + builder.append("Showing ").append(getAllowedTypes().get(0)) + .append(" and ").append(getAllowedTypes().get(1)).append(" types"); + } else if (numTypes == NUM_TYPES) { + builder.append("Showing all types"); + } else { + builder.append("Showing ").append(numTypes).append(" types"); + } + + + //Handle ATK, DEF, and HP filters + if (numFilteredStats == 3) { //all 3 are true + builder.append(", filtered by 3 stats"); + } else if (numFilteredStats == 2) { //exactly 2 are true + builder.append(", filtered by 2 stats"); + } else if (atkFiltered) { + builder.append(", ATK ≥ ").append(getMinAtk()); + } else if (defFiltered) { + builder.append(", DEF ≥ ").append(getMinDef()); + } else if (hpFiltered) { + builder.append(", HP ≥ ").append(getMinHP()); + } + + builder.append("."); + + if (builder.toString().equals("Showing all types.")) { + return null; + } + return builder.toString(); + } + +} diff --git a/app/src/main/java/com/example/nzp/pokedex/PokedexSearchFilter.java b/app/src/main/java/com/example/nzp/pokedex/PokedexSearchFilter.java new file mode 100644 index 0000000..1386913 --- /dev/null +++ b/app/src/main/java/com/example/nzp/pokedex/PokedexSearchFilter.java @@ -0,0 +1,52 @@ +package com.example.nzp.pokedex; + +import android.widget.Filter; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by nzp on 9/19/17. + * + * Filters the Pokedex based on a CharSequence. + */ + +public class PokedexSearchFilter extends Filter { + + private PokedexAdapter adapter; + private ArrayList all; + private ArrayList filtered; + + public PokedexSearchFilter(PokedexAdapter adapter, ArrayList all) { + this.adapter = adapter; + this.all = all; + } + + @Override + protected FilterResults performFiltering(CharSequence charSequence) { + String charString = charSequence.toString(); + if (charString.isEmpty()) { + filtered = all; + } else { + //First pass gets most relevant pokemon + ArrayList filteredList = new ArrayList<>(); + for (Pokemon pokemon : all) { + //Add if number or name is similar + if (pokemon.name.toLowerCase().startsWith(charString.toLowerCase()) || pokemon.number.startsWith(charString)) { + filteredList.add(pokemon); + } + } + filtered = filteredList; + } + + FilterResults filterResults = new FilterResults(); + filterResults.values = filtered; + return filterResults; + } + + @Override + protected void publishResults(CharSequence charSequence, FilterResults filterResults) { + filtered = (ArrayList) filterResults.values; + adapter.setData(filtered); + } +} diff --git a/app/src/main/java/com/example/nzp/pokedex/Pokemon.java b/app/src/main/java/com/example/nzp/pokedex/Pokemon.java new file mode 100644 index 0000000..c6de468 --- /dev/null +++ b/app/src/main/java/com/example/nzp/pokedex/Pokemon.java @@ -0,0 +1,64 @@ +package com.example.nzp.pokedex; + +import android.util.Log; + +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Created by nzp on 9/19/17. + * + * The Pokemon class. Modified from the original from Pokedex.java. + */ + +public class Pokemon { + + public static final String[] TYPES = { + "Bug", "Dark", "Dragon", "Electric", "Fairy", "Fighting", "Fire", "Flying", "Ghost", + "Grass", "Ground", "Ice", "Normal", "Poison", "Psychic", "Rock", "Steel", "Water" + }; + public static final int NUM_TYPES = TYPES.length; + public static final int HIGHEST_ATK = 180; + public static final int HIGHEST_DEF = 230; + public static final int HIGHEST_HP = 255; + + String name; + String number; + String attack; + String defense; + String hp; + String species; + String specialAttack; + String specialDefense; + String speed; + String total; + String[] type; + + public Pokemon(String name, JSONObject jsonData) { + try { + this.name = name; + number = jsonData.getString("#").trim(); + attack = jsonData.getString("Attack").trim(); + defense = jsonData.getString("Defense").trim(); + hp = jsonData.getString("HP").trim(); + species = jsonData.getString("Species").trim(); + specialAttack = jsonData.getString("Sp. Atk").trim(); + specialDefense = jsonData.getString("Sp. Def").trim(); + speed = jsonData.getString("Speed").trim(); + total = jsonData.getString("Total").trim(); + + + //Additional code to support types + String types = jsonData.getString("Type").trim(); + type = types.substring(1, types.length() - 1).split(","); //split into array of type strings + for (int i = 0; i < type.length; i += 1) { + type[i] = type[i].substring(1, type[i].length() - 1); //remove "" around each type string + type[i] = type[i].substring(0, 1).toUpperCase() + type[i].substring(1).toLowerCase(); + } + + } catch (JSONException e) { + Log.i("JSON error", "error parsing json data"); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/nzp/pokedex/PokemonDisplay.java b/app/src/main/java/com/example/nzp/pokedex/PokemonDisplay.java new file mode 100644 index 0000000..27f714a --- /dev/null +++ b/app/src/main/java/com/example/nzp/pokedex/PokemonDisplay.java @@ -0,0 +1,97 @@ +package com.example.nzp.pokedex; + + +import android.content.Intent; +import android.net.Uri; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import com.squareup.picasso.Picasso; + +import java.util.ArrayList; +import java.util.Arrays; + +public class PokemonDisplay extends AppCompatActivity { + + TextView name; + TextView pokemonID; + TextView species; + TextView HP; + TextView attack; + TextView defense; + TextView specialAttack; + TextView specialDefense; + TextView speed; + TextView total; + TextView type; + ImageView image; + Button searchButton; + + Pokedex mPokedex; + ArrayList list; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_pokemon_display); + + name = (TextView) findViewById(R.id.name); + pokemonID = (TextView) findViewById(R.id.pokemonID); + species = (TextView) findViewById(R.id.species); + HP = (TextView) findViewById(R.id.HP); + attack = (TextView) findViewById(R.id.attack); + defense = (TextView) findViewById(R.id.defense); + specialAttack = (TextView) findViewById(R.id.specialAttack); + specialDefense = (TextView) findViewById(R.id.specialDefense); + speed = (TextView) findViewById(R.id.speed); + total = (TextView) findViewById(R.id.total); + type = (TextView) findViewById(R.id.type); + image = (ImageView) findViewById(R.id.pokemonPic); + searchButton = (Button)findViewById(R.id.searchButton); + + mPokedex = new Pokedex(); + list = mPokedex.getPokemon(); + + int j = 0; + String pokemonNumber = getIntent().getStringExtra("number"); + for (; j < list.size(); j += 1) { + if (list.get(j).number.equals(pokemonNumber)) { + break; + } + } + final int i = j; + + name.setText(list.get(i).name); + species.setText(list.get(i).species); + HP.setText(list.get(i).hp); + //name.setText(list.get(i).hp.toString()); + //HP.setText(list.get(i).hp); + attack.setText(list.get(i).attack); + defense.setText(list.get(i).defense); + pokemonID.setText(list.get(i).number); + specialAttack.setText(list.get(i).specialAttack); + specialDefense.setText(list.get(i).specialDefense); + speed.setText(list.get(i).speed); + total.setText(list.get(i).total); + type.setText(Arrays.toString(list.get(i).type)); + + //display the image of the pokemon + String filename = "http://assets.pokemon.com/assets/cms2/img/pokedex/full/" + list.get(i).number + ".png"; + Picasso.with(getApplicationContext()).load(filename).into(image); + + searchButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Uri uri = Uri.parse("http://www.google.com/#q="+list.get(i).name); + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + startActivity(intent); + } + }); + + } +} diff --git a/app/src/main/res/background 7.jpg b/app/src/main/res/background 7.jpg new file mode 100644 index 0000000..e5f03f3 Binary files /dev/null and b/app/src/main/res/background 7.jpg differ diff --git a/app/src/main/res/background1.jpg b/app/src/main/res/background1.jpg new file mode 100644 index 0000000..bb3bda1 Binary files /dev/null and b/app/src/main/res/background1.jpg differ diff --git a/app/src/main/res/background2.jpg b/app/src/main/res/background2.jpg new file mode 100644 index 0000000..9c0679e Binary files /dev/null and b/app/src/main/res/background2.jpg differ diff --git a/app/src/main/res/background3.jpg b/app/src/main/res/background3.jpg new file mode 100644 index 0000000..53af2b3 Binary files /dev/null and b/app/src/main/res/background3.jpg differ diff --git a/app/src/main/res/background4.jpg b/app/src/main/res/background4.jpg new file mode 100644 index 0000000..0ee922b Binary files /dev/null and b/app/src/main/res/background4.jpg differ diff --git a/app/src/main/res/background5.jpg b/app/src/main/res/background5.jpg new file mode 100644 index 0000000..6511a64 Binary files /dev/null and b/app/src/main/res/background5.jpg differ diff --git a/app/src/main/res/background6.jpg b/app/src/main/res/background6.jpg new file mode 100644 index 0000000..b4000bd Binary files /dev/null and b/app/src/main/res/background6.jpg differ diff --git a/app/src/main/res/drawable/ak4.jpg b/app/src/main/res/drawable/ak4.jpg new file mode 100644 index 0000000..42bc3c0 Binary files /dev/null and b/app/src/main/res/drawable/ak4.jpg differ diff --git a/app/src/main/res/drawable/attackicon.png b/app/src/main/res/drawable/attackicon.png new file mode 100644 index 0000000..020b3f0 Binary files /dev/null and b/app/src/main/res/drawable/attackicon.png differ diff --git a/app/src/main/res/drawable/background1.jpg b/app/src/main/res/drawable/background1.jpg new file mode 100644 index 0000000..bb3bda1 Binary files /dev/null and b/app/src/main/res/drawable/background1.jpg differ diff --git a/app/src/main/res/drawable/background10.jpg b/app/src/main/res/drawable/background10.jpg new file mode 100644 index 0000000..7889061 Binary files /dev/null and b/app/src/main/res/drawable/background10.jpg differ diff --git a/app/src/main/res/drawable/background11.jpg b/app/src/main/res/drawable/background11.jpg new file mode 100644 index 0000000..bcfe9e4 Binary files /dev/null and b/app/src/main/res/drawable/background11.jpg differ diff --git a/app/src/main/res/drawable/background12.jpg b/app/src/main/res/drawable/background12.jpg new file mode 100644 index 0000000..4d13457 Binary files /dev/null and b/app/src/main/res/drawable/background12.jpg differ diff --git a/app/src/main/res/drawable/background2.jpg b/app/src/main/res/drawable/background2.jpg new file mode 100644 index 0000000..9c0679e Binary files /dev/null and b/app/src/main/res/drawable/background2.jpg differ diff --git a/app/src/main/res/drawable/background3.jpg b/app/src/main/res/drawable/background3.jpg new file mode 100644 index 0000000..53af2b3 Binary files /dev/null and b/app/src/main/res/drawable/background3.jpg differ diff --git a/app/src/main/res/drawable/background4.jpg b/app/src/main/res/drawable/background4.jpg new file mode 100644 index 0000000..0ee922b Binary files /dev/null and b/app/src/main/res/drawable/background4.jpg differ diff --git a/app/src/main/res/drawable/background5.jpg b/app/src/main/res/drawable/background5.jpg new file mode 100644 index 0000000..6511a64 Binary files /dev/null and b/app/src/main/res/drawable/background5.jpg differ diff --git a/app/src/main/res/drawable/background6.jpg b/app/src/main/res/drawable/background6.jpg new file mode 100644 index 0000000..b4000bd Binary files /dev/null and b/app/src/main/res/drawable/background6.jpg differ diff --git a/app/src/main/res/drawable/background7.jpg b/app/src/main/res/drawable/background7.jpg new file mode 100644 index 0000000..e5f03f3 Binary files /dev/null and b/app/src/main/res/drawable/background7.jpg differ diff --git a/app/src/main/res/drawable/background8.jpg b/app/src/main/res/drawable/background8.jpg new file mode 100644 index 0000000..53f4903 Binary files /dev/null and b/app/src/main/res/drawable/background8.jpg differ diff --git a/app/src/main/res/drawable/background9.jpg b/app/src/main/res/drawable/background9.jpg new file mode 100644 index 0000000..0097c03 Binary files /dev/null and b/app/src/main/res/drawable/background9.jpg differ diff --git a/app/src/main/res/drawable/backgroundpokemon.jpg b/app/src/main/res/drawable/backgroundpokemon.jpg new file mode 100644 index 0000000..b55a3b1 Binary files /dev/null and b/app/src/main/res/drawable/backgroundpokemon.jpg differ diff --git a/app/src/main/res/drawable/boot.png b/app/src/main/res/drawable/boot.png new file mode 100644 index 0000000..6a54de4 Binary files /dev/null and b/app/src/main/res/drawable/boot.png differ diff --git a/app/src/main/res/drawable/bug.png b/app/src/main/res/drawable/bug.png new file mode 100644 index 0000000..6d364be Binary files /dev/null and b/app/src/main/res/drawable/bug.png differ diff --git a/app/src/main/res/drawable/crystal.png b/app/src/main/res/drawable/crystal.png new file mode 100644 index 0000000..0c577ed Binary files /dev/null and b/app/src/main/res/drawable/crystal.png differ diff --git a/app/src/main/res/drawable/defenseicon.png b/app/src/main/res/drawable/defenseicon.png new file mode 100644 index 0000000..8ec5c77 Binary files /dev/null and b/app/src/main/res/drawable/defenseicon.png differ diff --git a/app/src/main/res/drawable/greenpokeball.png b/app/src/main/res/drawable/greenpokeball.png new file mode 100644 index 0000000..78067eb Binary files /dev/null and b/app/src/main/res/drawable/greenpokeball.png differ diff --git a/app/src/main/res/drawable/healthicon.png b/app/src/main/res/drawable/healthicon.png new file mode 100644 index 0000000..68c5057 Binary files /dev/null and b/app/src/main/res/drawable/healthicon.png differ diff --git a/app/src/main/res/drawable/heart.png b/app/src/main/res/drawable/heart.png new file mode 100644 index 0000000..bed280d Binary files /dev/null and b/app/src/main/res/drawable/heart.png differ diff --git a/app/src/main/res/drawable/ic_search_black_24dp.xml b/app/src/main/res/drawable/ic_search_black_24dp.xml new file mode 100644 index 0000000..affc7ba --- /dev/null +++ b/app/src/main/res/drawable/ic_search_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/lightbackground.jpg b/app/src/main/res/drawable/lightbackground.jpg new file mode 100644 index 0000000..ad3244c Binary files /dev/null and b/app/src/main/res/drawable/lightbackground.jpg differ diff --git a/app/src/main/res/drawable/magicicon.png b/app/src/main/res/drawable/magicicon.png new file mode 100644 index 0000000..0da0d35 Binary files /dev/null and b/app/src/main/res/drawable/magicicon.png differ diff --git a/app/src/main/res/drawable/magicshield.png b/app/src/main/res/drawable/magicshield.png new file mode 100644 index 0000000..b09daf7 Binary files /dev/null and b/app/src/main/res/drawable/magicshield.png differ diff --git a/app/src/main/res/drawable/physicaldefense.png b/app/src/main/res/drawable/physicaldefense.png new file mode 100644 index 0000000..972231f Binary files /dev/null and b/app/src/main/res/drawable/physicaldefense.png differ diff --git a/app/src/main/res/drawable/pokeballblue.png b/app/src/main/res/drawable/pokeballblue.png new file mode 100644 index 0000000..fba9df2 Binary files /dev/null and b/app/src/main/res/drawable/pokeballblue.png differ diff --git a/app/src/main/res/drawable/pokeballgreen.png b/app/src/main/res/drawable/pokeballgreen.png new file mode 100644 index 0000000..bf00110 Binary files /dev/null and b/app/src/main/res/drawable/pokeballgreen.png differ diff --git a/app/src/main/res/drawable/pokeballlyellow.png b/app/src/main/res/drawable/pokeballlyellow.png new file mode 100644 index 0000000..b0fa335 Binary files /dev/null and b/app/src/main/res/drawable/pokeballlyellow.png differ diff --git a/app/src/main/res/drawable/pokeballocean.png b/app/src/main/res/drawable/pokeballocean.png new file mode 100644 index 0000000..9402f50 Binary files /dev/null and b/app/src/main/res/drawable/pokeballocean.png differ diff --git a/app/src/main/res/drawable/pokeballorange.png b/app/src/main/res/drawable/pokeballorange.png new file mode 100644 index 0000000..516b05e Binary files /dev/null and b/app/src/main/res/drawable/pokeballorange.png differ diff --git a/app/src/main/res/drawable/pokeballred.png b/app/src/main/res/drawable/pokeballred.png new file mode 100644 index 0000000..d8c4555 Binary files /dev/null and b/app/src/main/res/drawable/pokeballred.png differ diff --git a/app/src/main/res/drawable/pokeballyellow.png b/app/src/main/res/drawable/pokeballyellow.png new file mode 100644 index 0000000..f47c315 Binary files /dev/null and b/app/src/main/res/drawable/pokeballyellow.png differ diff --git a/app/src/main/res/drawable/pokemonbackground.jpg b/app/src/main/res/drawable/pokemonbackground.jpg new file mode 100644 index 0000000..dd59ec9 Binary files /dev/null and b/app/src/main/res/drawable/pokemonbackground.jpg differ diff --git a/app/src/main/res/drawable/pokemonbar.png b/app/src/main/res/drawable/pokemonbar.png new file mode 100644 index 0000000..f36c532 Binary files /dev/null and b/app/src/main/res/drawable/pokemonbar.png differ diff --git a/app/src/main/res/drawable/pokemonseries1.jpg b/app/src/main/res/drawable/pokemonseries1.jpg new file mode 100644 index 0000000..ec3b468 Binary files /dev/null and b/app/src/main/res/drawable/pokemonseries1.jpg differ diff --git a/app/src/main/res/drawable/speedicon.png b/app/src/main/res/drawable/speedicon.png new file mode 100644 index 0000000..7f82b6f Binary files /dev/null and b/app/src/main/res/drawable/speedicon.png differ diff --git a/app/src/main/res/drawable/speedicon2.png b/app/src/main/res/drawable/speedicon2.png new file mode 100644 index 0000000..b97700a Binary files /dev/null and b/app/src/main/res/drawable/speedicon2.png differ diff --git a/app/src/main/res/drawable/sword.png b/app/src/main/res/drawable/sword.png new file mode 100644 index 0000000..8cbe2bc Binary files /dev/null and b/app/src/main/res/drawable/sword.png differ diff --git a/app/src/main/res/drawable/trigger.png b/app/src/main/res/drawable/trigger.png new file mode 100644 index 0000000..f58eb3b Binary files /dev/null and b/app/src/main/res/drawable/trigger.png differ diff --git a/app/src/main/res/drawable/type.png b/app/src/main/res/drawable/type.png new file mode 100644 index 0000000..b7d5db6 Binary files /dev/null and b/app/src/main/res/drawable/type.png differ diff --git a/app/src/main/res/drawable/yellowbackground.jpg b/app/src/main/res/drawable/yellowbackground.jpg new file mode 100644 index 0000000..ec08285 Binary files /dev/null and b/app/src/main/res/drawable/yellowbackground.jpg differ diff --git a/app/src/main/res/layout/activity_filter.xml b/app/src/main/res/layout/activity_filter.xml new file mode 100644 index 0000000..2e1947f --- /dev/null +++ b/app/src/main/res/layout/activity_filter.xml @@ -0,0 +1,345 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +