これはチャットボット Advent Calendar 2016 15日目の記事です。
ポケモンGOと書きましたが、GO的要素はほぼ無いです(死
あらすじ
チームでbotを作ってみたはいいものの…なんかパッとしない…
リマインダーと、オススメのラーメン屋を教えてくれる機能しかない…
↓
PokemonGOがリリースされたから、ポケモンの面白機能を付けよう!そうしよう!
…というわけでブームにあやかってみたら、メンバーの皆がびっくりするくらい使ってくれた機能のご紹介です。
機能概要
うちのチームのbotの戸越くんです。
(※元ネタ:http://www.yurugp.jp/vote/detail.php?id=00000086)
get pokemon
というと、botがポケモンを捕まえに行ってくれます。
その後、捕まえたポケモンとそのCPを教えてくれます。
それだけです!(今のところ)
中身
- hubot
- ES2015
- pokeapi(http://pokeapi.co/)
- 翻訳用json(PonDad/pokemon.json)
- ポケモンのドット絵が掲載された海外のページのURL(※なんか色々グレーな気がしますが、割愛)
※APIから画像も返却されるんですがアニメーションgifの方が可愛かったので、外部のURLを参照してます。。
プログラムは至極単純です。
// configに最大値や、APIのURLなどを定義しておく
// 数値をランダム生成してリクエストURL定義
const pokeSelect = Math.floor(Math.random() * config.max) + 1;
options.url = config.api + pokeSelect + '/';
// APIにリクエスト
request.get(options, (err, response, body) => {
if (response.statusCode === 200) {
const pokeData = {
id: body.id,
name: translateData[body.id - 1].ja, // 翻訳jsonから該当するポケモンの日本語名を取得します
img: getUrl(body.id, body.name) // 返却値のidをもとにして、画像URLをつくります
};
// 数値をランダム生成してポケモンの強さ(CP)を定義
const cpMax = 2000;
const pokeCp = Math.floor(Math.random() * cpMax);
res.send('CP' + pokeCp + 'の' + pokeData.name + 'を捕まえたゴシ!\n' + pokeData.img);
// もしCPが1900よりも上だったら驚いてくれます
if (pokeCp > 1900) {
res.send('コイツはつよいゴシ!!');
}
} else {
// APIエラーだった場合は、捕まえてきてくれません
res.send('捕まえるの失敗したゴシ…。');
}
})
pokeapiは、ポケモン図鑑の番号に合わせてリクエストを送るとポケモンの情報を返してくれます。
なんか色々遊べそうなデータがいろいろありましたが、今回は名前とIDくらいしか使っていません。
なんか大人気
何がウケたのか定かではありませんが、1日1ゲットくらいの感覚でみんなポケモンを捕まえる習慣がついてきたように思えます。
ミュウとか出ると、やたらリアクションがついて盛り上がってます。
かわいい系のポケモンが出ると、一部の人がハートマークを付けてきます。
今後の拡張計画(夢)
捕まえたポケモンのデータを保持したい
現状は、APIからの返却に基づいて都度表示を返しているにすぎません。
ですが、やっぱりポケモントレーナーとしては「捕まえたい」ですよね!
そこで、ポケモンのデータを何かしらの方法で保持して以下のような情報蓄積をしたいと思ってます。
- いままでに捕まえたポケモンの種類(ポケモン図鑑だ!)
- 捕まえた同種ポケモンの中で一番高いCPがいくつなのか
zukan pokemon
で何%図鑑が埋まったのか見れたり、maxcp pokemon pikachu
でいままで捕まえたピカチュウの中で一番高いCPがいくつなのかを見れたりしたいです!
さらにデータが別にあるのなら、Webブラウザから参照できると面白いかも!
ユーザー情報を取り入れる
誰が何を捕まえたのかというデータがあれば、自分が捕まえたポケモンだけを使ってパーティが組める…!
add pokemonparty pikachu
remove pokemonparty pikachu
とか!
そうなってくると、対戦機能とかも付けたくなってきますね!(白目)
もっと失敗させる
現状はAPIからレスポンスさえあれば、ポケモンのゲットに成功します。
でもPokemonGOってもっとシビアですよね。
そこで、スーパーボールやハイパーボールを使うとゲット率に影響するみたいな仕組みも考えています。
そうすると…、じゃあユーザー毎の持ち物の管理とかも……?ハイパーボール投げ放題っていうのも、ゲーム性に欠けますよね…。
デバック方法なんとかしたい
基本的にはランダム要素なので、たとえばIDが100番未満のポケモンの場合にホニャララする、みたいなことをしたい場合、
ひたすら100番未満が出るまでモンスターボールを投げ続けないといけなくてつらみを感じています。