mizdra's blog

ぽよぐらみんぐ

第三世代用ポケモン図鑑npmモジュールを作った

以前公開していた@mizdra/jpn-pokedex@mizdra/gen3-jpn-pokedexへとリポジトリを移動し、@mizdra/jpn-pokedexの公開は終了しました。今後は@mizdra/gen3-jpn-pokedexをご利用下さい。

タイトル通りです。 モジュール名は「@mizdra/gen3-jpn-pokedex」です。

どんなモジュール?

Array.prototype.find()Array.prototype.filter()を用いてPokeDataクラスを取得できます。
npmモジュールですので、Node.js環境が必要です。
各自用意して下さい。

変更点

v1.0.0になりました。 - PokeData::idで種族・フォルム固有のidを取得出来るようになりました。 - PokeData::formNameでフォルムの名前を取得出来るようになりました。

ソース

www.npmjs.com github.com

インストール

$ npm install @mizdra/gen3-jpn-pokedex --save

使い方

var pokedex = require('@mizdra/gen3-jpn-pokedex');

var pokes = pokedex.filter(function(poke) {
  return poke.abilities.includes('かげふみ');
}).map(function(poke) {
  return poke.name;
});

console.log(pokes); // ['ソーナンス', 'ソーナノ']

ES6記法で書くと以下のようになります。

import pokedex from '@mizdra/gen3-jpn-pokedex';

let pokes = pokedex
  .filter(poke => poke.abilities.includes('かげふみ'))
  .map(poke => poke.name);

console.log(pokes); // ['ソーナンス', 'ソーナノ']

コードを見てお気づきになられた方もいると思いますが、pokedexの実態はArrayです。
Arrayの様々なメソッド*1 が使えますので、自分が必要とするデータを図鑑から取り出すことが出来ます。

pokedexの中身

pokedex.find()の戻り値はPokeDataクラスのインスタンスです。
PokeDataはポケモン図鑑jsonを取り込んだクラスで、そのjsongithubで確認することができます。

gen3-jpn-pokedex/pokedex.json at master · mizdra/gen3-jpn-pokedex · GitHub

また、PokeDataクラスの構造は以下の通りです。

class PokeData {
  constructor(json) {
    this.id= Number;
    this.nationalId = Number;
    this.name = String;
    this.formName = String | null;
    this.baseStats = [
      Number, // H
      Number, // A
      Number, // B
      Number, // S
      Number, // C
      Number  // D
    ];
    this.genderThreshold = Number;
    this.heldItems = {
      rse: {
        rarely: String | null,    // 5%
        sometimes: String | null, // 50%
        always: String | null     // 100%
      },
      frlg: {
        rarely: String | null,    // 5%
        sometimes: String | null, // 50%
        always: String | null     // 100%
      }
    };
    this.abilities = [String, String]; // [特性1, 特性2]
  }
}

jsonのスネークケースで書かれたプロパティはPokeDataクラスではローワーキャメルケースとして格納されてます。 種族値[H, A, B, S, C, D]の順です。

書き方の例

Array.prototype.find()はES6, Array.prototype.includes()はES7の機能です。
使用するにはPolyfillを用意して下さい。

import pokedex from '@mizdra/gen3-jpn-pokedex';

// idから取得
let poke1 = pokedex.find(poke => poke.id === 415).name;
console.log(poke1); // 'ジラーチ'

// 図鑑番号から取得
let poke2 = pokedex.find(poke => poke.nationalId === 1).name;
console.log(poke2); // 'フシギダネ'

// 種族名から取得
let poke3 = pokedex.find(poke => poke.name === 'キングドラ').name;
console.log(poke3); // 'キングドラ'

// フォルム名から取得
let poke4 = pokedex.find(poke => poke.formName === 'スピードフォルム').name;
console.log(poke4); // 'デオキシス'

// 種族値から取得
let poke5 = pokedex.find(poke =>
  poke.baseStats[3] >= 160
  && poke.baseStats[4] >= 90
).name;
console.log(poke5); // 'デオキシス'

// 特性から取得
let pokes1 = pokedex
  .filter(poke => poke.abilities.includes('かげふみ'))
  .map(poke => poke.name);
console.log(pokes1); // ['ソーナンス', 'ソーナノ']

// 持ち物から取得(filter)
let pokes2 = pokedex
  .filter(poke => poke.heldItems.frlg.rarely === 'ふといホネ')
  .map(poke => poke.name);
console.log(pokes2); // ['カラカラ', 'ガラガラ']

// ♂:♀=7:1のポケモンを取得(filter)
let pokes3 = pokedex
  .filter(poke => poke.genderThreshold === 31)
  .map(poke => poke.name);
console.log(pokes3); // ['フシギダネ', 'フシギソウ', ..., 'ジーランス']

今後について

重さ・高さ・タイプなどの情報の追加を予定してます。
乱数ツールを補助する目的で作っているので、今後もそれ関連の機能追加になります。