0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MTGSDKの扱い方

Last updated at Posted at 2021-12-19

はじめに

多くの場合、先行結論型で話すのが理系だとはわかっている。
ただ今回は教科書的、メモ帳的に書くので目次だけで許してほしい。

  1. カード情報の入手(基本)

  2. 日本語カードの入手

  3. 特殊な事例

  4. 両面カード

  5. 分割カード

  6. 基本土地

カード情報の入手(基本)

まずmtgの公式sdk mtgsdkからデータをもらう

from mtgsdk import Card
cards = Card.all()

これで”カード情報”だけは手に入る。
筆記当時

>>>len(cards)
64521
>>>cards[0].name
‘Overtaker’

といったように手に入る。

日本語カードの入手

mtgsdkのCardクラスには、foreign_namesに他言語版のデータが入っている。

ktk(タルキール)のカードセットでは、

  • foreign_names[0]=’German’
  • foreign_names[1]=’Spanish’
  • foreign_names[2]=’French’
  • foreign_names[3]=’Italian’
  • foreign_names[4]=’Japanese’
  • …etc(計10言語)

のように格納されている。
格納自体は、

  • foreign_names
    • 言語
      • name
      • text
      • type
      • flavor
      • imageUrl
      • language
      • multiverseid
        のようになっている。

よって、

for i in range(0,1,len(card[].foreign_names)):
 if card[].foreign_names[i]['language']=='Japanese':
  print(card[].foreign_names[i]['name'])

のようにすれば日本語カードの情報を掘り当てられる。

特殊な事例

mtgはしばらくはやっていないが、特殊なギミックがあるカードたちは多い

  1. 両面カード
    変異や変身などで反転し別カードになる

  2. 分割カード
    2つの呪文が入っているカードたち、1つの面にそれぞれの名前が書いてある

  3. 各種基本土地
    同じ名前で同じ効果なのに同じパックで複数存在するカードたち

これらのカードはどのように処理されるのかを見てみる。

両面カード

両面カードなので当然カードの画像は2種類存在するし、
片面事に別カードである。
早速実験してみる。

#一応日本語カードがあるカードで選別
#フォーマットはイニストラード
card_isd=Card.where(set='isd').where(language='Japanese').all()

#まずは名前で調べる
name='Villagers of Estwald'
for i in range(1,len(card_isd)):
	if card_isd[i].name == name:
		print(i)
		print(card_isd[i].name)

上記の結果は

>>>

で何も表示されない。
次に、

#一応日本語カードがあるカードで選別
#フォーマットはイニストラード
card_isd=Card.where(set='isd').where(language='Japanese').all()

#調べてから表示してみる
print(card_isd[38].name)
print(card_isd[39].name)

結果は、

>>>38
>>>Thraben Sentry // Thraben Militia
>>>39
>>>Thraben Sentry // Thraben Militia

なんと連番で登録されており、かつ//で名前が分割されている。
検索の場合は、マッチングを利用してあげると検索でき、

#一応日本語カードがあるカードで選別
#フォーマットはイニストラード
card_isd=Card.where(set='isd').where(language='Japanese').all()

#名前をマッチングで調べる
name='Villagers of Estwald'
for i in range(1,len(card_isd)):
	if name in card_isd[i].name:
		print(i)
		print(card_isd[i].name)

結果は

>>>227
>>>Villagers of Estwald // Howlpack of Estwald
>>>228
>>>Villagers of Estwald // Howlpack of Estwald

とちゃんと表示される。

ちなみにどっちがどっちのカードかは、

>>> card_isd[227].text
'At the beginning of each upkeep, if no spells were cast last turn, transform Villagers of Estwald.'
>>> card_isd[228].text
'At the beginning of each upkeep, if a player cast two or more spells last turn, transform Howlpack of Estwald.'

の結果より、番号が小さい方が名前の左(表面)
番号が大きい方が名前の右(裏面)のようである。

分割カード

分割カードは両面カードの仕様とおそらくはほぼ同一だ。
早速実験してみる。

card_akh=Card.where(set='akh').where(language='Japanese').all()
#検索対象は徹頭+徹尾
name = 'Start'
for i in range(1,len(card_akh)):
    if card_akh[i].name == name:
          print(i)
          print(card_akh[i].name

まあ、お察しだろうが結果は

>>>

何も出ないので、マッチングさせて、結果だけ表示させていただくが、

>>>219
>>>Start // Finish
>>>220
>>>Start // Finish

である。
どちらがどちらというと

>>> card_akh[219].text
'Create two 1/1 white Warrior creature tokens with vigilance.'
>>> card_akh[220].text
'Aftermath (Cast this spell only from your graveyard. Then exile it.)\nAs an additional cost to cast Finish, sacrifice a creature.\nDestroy target creature.'

となるので、名前左が番号が小さい方、
名前右が番号が大きい方とわかる。

以上が2枚分のカード情報があるカードのmtgsdkでの扱いである。

基本土地

基本土地カードは、正直、検索がものすごく面倒なカードである。
とりあえず検索してみよう。

name = 'Forest'
for i in range(1,len(card_akh)):
     if name in card_akh[i].name:
             print(i)
             print(card_akh[i].name)

結果は、

>>>268
>>>Forest
>>>281
>>>Forest
>>>282
>>>Forest
>>>283
>>>Forest

正直、どれがどの柄のForestかはわからない。
一応見分けの付け方だけ(コードは自前で用意してほしい)書いておく。

  1. 調べたいカードの柄を用意(jpegなどで)

  2. opencvで画像のマッチングを行う

  3. 一致率を算出し最も近い画像を表示する。

となる。
これだけで探せるのでぜひ頑張ってほしい。

おわりに

とりあえず、mtgsdkで日本語カードを操作する方法の基礎は書いたつもりだ。
他のサイトを見ればCard.all()で取得したデータを保存しているが、
一時的な、セットを指定した操作ならすぐ終わるので、
セット毎に保存するのが一番賢いやり方だと思っている。
all()ですべて取得しても数ヶ月後には役に立たなくなるのも嫌な点だ。
更新か所は数か所で終わらすのがスマートな気がする。
mtgのカード量はここ数年で数万単位で増えている。
必要な個所だけ更新する術はmtgsdkを長く扱う上では必須項目であろう。

ではよいMTGライフを。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?