25
14

More than 5 years have passed since last update.

MTG-SDKを使ってみた

Last updated at Posted at 2017-12-21

まず、タイトルを見て仕事を効率化できるかもと思ったそこのアナタ!
申し訳ありません。有益な情報は一切ございません。
そのMTGではないのです。回れ右。

どうも、3度のメシよりMTGが好きな@Hirotakuです。
ちなみにメシは一日に3度食べます。
朝食はお米派です。

え?だから、MTGって何かって?
そう、Magic The Gatheringです。
(以後、興味ある方のみ推奨。)

Magic The Gatheringって?

忠告をしたにも関わらず読み進んでくれたそこのアナタにざっくり説明。
Magic The Gathering( http://mtg-jp.com/ )は世界初のトレーディングカードゲームです。
世界中にプレイヤーがおり、ギネスにも登録されているとか。
93年の発売以来、業界のトップを走り続けています。尊敬しますね。
賞金制の大会が開催されているのも特徴です。

そんなMTGですが、数多のカード情報を提供するAPIが
なんと公式から提供されているのです。

これは何か作れそう!ということで、
今回はこのカード情報を取得できるAPIを触ってみました。

MTG Developers

https://magicthegathering.io/
なんとこんなしっかりしたページを公開してくれているのですね。
ふつーにすごい。
ドキュメントを見ると、これまた下手なサービスよりもしっかり書かれております。

そして何よりビックリだったのが、SDKが9つもの言語に対応していること!何でもありですね。
(Ruby, Python, Javascript, .NET, Java, PHP, Kotlin, Go, Swift)
わたくしは普段使っているPHPでやってみました。

データ取得

使い方はとってもシンプル。

        $cards = mtgsdk\Card::where(['set' => 'xln'])
            ->all();

ひとまず最新セットを。(300枚弱)
さすがにごっそり取りすぎたのか、そこそこ待つ。


 object(mtgsdk\Card) {
        [protected] data => [
            'name' => 'Adanto Vanguard',
            'manaCost' => '{1}{W}',
            'cmc' => (int) 2,
            'colors' => [
                (int) 0 => 'White'
            ],
            'colorIdentity' => [
                (int) 0 => 'W'
            ],
            'type' => 'Creature — Vampire Soldier',
            'types' => [
                (int) 0 => 'Creature'
            ],
            'subtypes' => [
                (int) 0 => 'Vampire',
                (int) 1 => 'Soldier'
            ],
            'rarity' => 'Uncommon',
            'set' => 'XLN',
            'setName' => 'Ixalan',
            'text' => 'As long as Adanto Vanguard is attacking, it gets +2/+0.
Pay 4 life: Adanto Vanguard gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.)',
            'artist' => 'Anna Steinbauer',
            'number' => '1',
            'power' => '1',
            'toughness' => '1',
            'layout' => 'normal',
            'multiverseid' => (int) 435152,
            'imageUrl' => 'http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=435152&type=card',
            'foreignNames' => [
                (int) 0 => [
                    'name' => 'Adanto-Vorhut',
                    'imageUrl' => 'http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=435451&type=card',
                    'language' => 'German',
                    'multiverseid' => (int) 435451
                ],
                (int) 1 => [
                    'name' => 'Avant-garde d'Adanto',
                    'imageUrl' => 'http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=435750&type=card',
                    'language' => 'French',
                    'multiverseid' => (int) 435750
                ],
                (int) 2 => [
                    'name' => 'Avanguardia di Adanto',
                    'imageUrl' => 'http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=436049&type=card',
                    'language' => 'Italian',
                    'multiverseid' => (int) 436049
                ],
                (int) 3 => [
                    'name' => 'アダントの先兵',
                    'imageUrl' => 'http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=436348&type=card',
                    'language' => 'Japanese',
                    'multiverseid' => (int) 436348
                ],
                (int) 4 => [
                    'name' => '아단토 선봉대',
                    'imageUrl' => 'http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=436647&type=card',
                    'language' => 'Korean',
                    'multiverseid' => (int) 436647
                ],
                (int) 5 => [
                    'name' => 'Vanguarda de Adanto',
                    'imageUrl' => 'http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=436946&type=card',
                    'language' => 'Portuguese (Brazil)',
                    'multiverseid' => (int) 436946
                ],
                (int) 6 => [
                    'name' => 'Авангард Аданто',
                    'imageUrl' => 'http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=437245&type=card',
                    'language' => 'Russian',
                    'multiverseid' => (int) 437245
                ],
                (int) 7 => [
                    'name' => 'Vanguardia de Adanto',
                    'imageUrl' => 'http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=437544&type=card',
                    'language' => 'Spanish',
                    'multiverseid' => (int) 437544
                ],
                (int) 8 => [
                    'name' => '艾唐托先锋',
                    'imageUrl' => 'http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=437843&type=card',
                    'language' => 'Chinese Simplified',
                    'multiverseid' => (int) 437843
                ],
                (int) 9 => [
                    'name' => '艾唐托先鋒',
                    'imageUrl' => 'http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=438142&type=card',
                    'language' => 'Chinese Traditional',
                    'multiverseid' => (int) 438142
                ]
            ],
            'printings' => [
                (int) 0 => 'XLN'
            ],
            'originalText' => 'As long as Adanto Vanguard is attacking, it gets +2/+0.
Pay 4 life: Adanto Vanguard gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.)',
            'originalType' => 'Creature — Vampire Soldier',
            'legalities' => [
                (int) 0 => [
                    'format' => 'Commander',
                    'legality' => 'Legal'
                ],
                (int) 1 => [
                    'format' => 'Ixalan Block',
                    'legality' => 'Legal'
                ],
                (int) 2 => [
                    'format' => 'Legacy',
                    'legality' => 'Legal'
                ],
                (int) 3 => [
                    'format' => 'Modern',
                    'legality' => 'Legal'
                ],
                (int) 4 => [
                    'format' => 'Standard',
                    'legality' => 'Legal'
                ],
                (int) 5 => [
                    'format' => 'Vintage',
                    'legality' => 'Legal'
                ]
            ],
            'id' => 'ccbc0aca09ec754dd5dc97081315dfdff1748132'
        ]
    },

すごい情報量来たw
カード1枚でこの量です。
しかしずいぶんと細かい情報まで取れる模様。
ちゃんと言語別の画像も取れていて、しっかりワールドワイドな対応してくれてます。

エキスパンション以外にも、一部の項目以外は検索条件にできる模様。
(日本語名で上手く検索できなかった。わたしだけではないと願いたい。)

今後の展望

サクッっとデータが取得できたので、まずはデッキビルダーの作成が進行中。
(さすがに毎回これ取ってくるのはアレなので、DBにぶち込みましたが。。)
ただ、あくまで日本語で提供されている情報は、
カード名と画像だけなので、テキストを取得できないのが残念。。
とはいえ、SDKの提供言語が多いので、
ブラウザでもアプリでもなんでもできそうですね!

加えて、ドキュメントの分かりやすさって大事だなと
改めて痛感させられた次第。分かりにくいとそれだけでハードル上がる。

いい感じに仕上がったら公開してみようかな~
(ニーズ?なにそれ?温かいの?

25
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
14