オブジェクト設計 – オラクル解析 vol.1
さて、今回は開発的なお話なのですが、性質上かなり深く「MTG のルールについて紐解いていく」と言った内容になるため、実はプレイヤー的にもそれなりに読みごたえがあるのではないかと思い、シリーズ化する事にしました。
興味のある方は、是非お付き合いください!
仕様設計
ちまちま、本当にちまちまと、決して少なくない時間を費やし、ついにマスターズやマスピシリーズのような「再録のみで構成されたセット以外」のデータを取得する事が出来ました。
この時点でカードの種類は 44,413 枚、解析するべきは同名カードを除いた 25,134 枚となる。
いや、多すぎ。
中々やってる枚数ですが、取り合えず準備だけは整った形となりました。
初期段階ではシミュレータ上でオラクルを解析して、挙動のセットまでを行うつもりだったけど、解析部分がとんでもないボリュームになる事が確定的に明らかなため、リロードの度にそのコストがかかるのは設計的にどうよ?と。
てな訳で、予めオラクル解析を行った結果をデータベースに登録しておき、シミュレータには結果セットだけを返す仕様に変更。
そして検討の結果、シミュレータ(=javascript)に渡されるオブジェクトは、取り合えず以下のような形でやってみる事にしました。
{
name: string, // カード名
cmc: float, // マナ総量
manaCost: string, // マナコスト
layout: string, // 通常、分割、両面、など
colors: [string, ], // カードに含まれる色
supertypes: [string, ], // 基本、伝説の、など
types: [string, ], // 土地、クリーチャー、など
subtypes: [string, ], // ゴブリン、秘儀、など
power: float, // パワー
toughness: float, // タフネス
loyalty: float, // 忠誠値
ability: { // 能力
_spell: [{
effect: string // 効果
}],
_activated: [{
cost: string, // 起動コスト
effect: string, // 効果
instant: bool, // インスタントプレイ
instructions: [string, ] // 手札にある時、墓地にある時、など
}],
_triggered: [{
trigger: string, // 誘発条件
timing: string, // 発動タイミング
effect: string, // 効果
instructions: [string, ] // 手札にある時、墓地にある時、など
}],
_static: [{
effect: string, // 効果
instructions: [string, ] // 手札にある時、墓地にある時、など
}]
}
}
API より取得出来る「見たまんまのデータ」に加えて、オラクルを解析して得られる能力(=ability)のデータをまとめたものが、それぞれのカードにぶら下がるイメージ。
土地のルールについて
MTG と言うゲームにおいて、最も特徴的なルールを持つカードは、間違いなく「土地カード」だろう。
土地カードは原則、自分のターンに1度だけ、メインフェイズかつ、スタックが空の状態かつ、優先権を持っている時(いわゆるソーサリータイミング)のみプレイ可能なカード。
他のカードにより土地のプレイ回数が増えたりもするが、セットランド権なんて言葉があるように、他のカードとは明らかにルールが異なる。
本シミュレータ上では、アプリの本体側で「残りの土地セット回数」を保持しておき、types に Land を持つカードは土地として扱う事で、このルールを再現するつもりだ。
もしかしたらオラクル部分で「このカードは土地として扱う」みたいな事が書かれているカードが有るかも知れないけど、全く精査出来ていないので今の所不明。
情報提供は随時受け付けています(他力本願)
インスタントタイミングについて
土地の次に特徴的なのが「インスタントタイミング」のルールだろう。
原則 MTG はターン制であり、明確な自分のターン(=アクティブプレイヤー)が存在するゲームでありながら、相手(非アクティブプレイヤー)から干渉を受ける、またはその逆が可能なルールになっており、それが複雑かつ戦略的なプレイ体験を我々に提供してくれている。
テキストで書くとややこしい事この上ないが、要するにターンとか関係なく、プレイヤーが優先権さえ持っていればプレイ可能なカードがあると言う事です。
これは types に Instant を持っているか、オラクルに Flash のキーワード、即ち瞬速を持っているカードが該当する。
能力について
MTG における《能力/Ability》には、大きく4つの種類が存在します。
定型能力として1単語にまとめられた《キーワード能力/Keyword Ability》や、マナ能力、忠誠度能力なども定義されているが、これらは上記のどれかに当てはまる小分類となっている。
呪文能力
インスタントかソーサリーが解決される時に処理される能力で、起動型能力でも誘発型能力でも常在型能力でもない能力を指す。
は?
と言いそうになるが、例えばモダンでお馴染みの《暴力的な突発/Violent Outburst》とかが分かりやすい。
Violent Outburst / 暴力的な突発 (1)(赤)(緑)
インスタント
続唱(あなたがこの呪文を唱えたとき、あなたのライブラリーの一番上のカードを、コストがより低い土地でないカードが追放されるまで追放する。あなたはそれをそのマナ・コストを支払うことなく唱えてもよい。追放されたカードをあなたのライブラリーの一番下に無作為の順番で置く。)
ターン終了時まで、あなたがコントロールするクリーチャーは+1/+0の修整を受ける。
つまり《続唱/Cascade》は誘発型能力で、クリーチャーのパワー修正部分は呪文能力って事になる。
{
effect: string // 効果
}
てな訳で、オブジェクトにはシンプルに効果のみを持たせる事にした。
起動型能力
決められたコストを支払う事で起動する事が出来る能力を指し、テキストに「起動はソーサリーとしてのみ行う。」と書かれていない限りは、原則インスタントタイミングで起動可能となっている。(もちろんコストが支払えれば)
またその能力がマナ能力でなければ、呪文と同様にスタックに置かれて解決待ちの状態になる。(マナ能力はスタックを用いずに解決される)
これはパーマネントだけが持つ訳では無く、例えば《サイクリング/Cycling》や《忍術/Ninjutsu》は手札からしか起動出来ないし、《憑依された死体/Haunted Dead》みたいな能力は墓地からしか起動出来ないなど、多岐に渡って存在する。
{
cost: string, // 起動コスト
effect: string, // 効果
instant: bool, // インスタントプレイ
instructions: string // 手札にある時、墓地にある時、など
}
と言う訳で起動コストとインスタントプレイの可否、そして起動条件的な物を持たせたオブジェクトになった。
誘発型能力
特定の条件を満たすたびに誘発される能力を指し、条件は「~とき/when」「~たび/whenever」「~時に/at」で満たされる可能性がある。
よく見る誘発型能力だと「場に出た時」とか「死亡した時」がお馴染みですね。
また、誘発型能力もそれがマナ能力でなければスタックに置かれて解決待ちとなる。
{
trigger: string, // 誘発条件
timing: string, // 発動タイミング
effect: string, // 効果
instructions: string // 手札にある時、墓地にある時、など
}
誘発条件と、その効果がいつ発動するかと言うタイミング、そしてどこにある時に誘発条件を満たせるかなどの情報を持たせる事にした。
常在型能力
効果を発揮する領域に存在する限り、自動的に効果を持ち続ける能力を指す。
例外としてインスタントとソーサリーのみ、唱えてスタック上にある時にのみ効力を発揮する常在型能力が存在する。(打ち消されないとか)
変わった常在型能力と言えば《飢餓の潮流、グリスト/Grist, the Hunger Tide》なんかが記憶に新しいですね。
Grist, the Hunger Tide / 飢餓の潮流、グリスト (1)(黒)(緑)
伝説のプレインズウォーカー — グリスト(Grist)
飢餓の潮流、グリストが戦場に無いかぎり、これはこれの他のタイプに加えて1/1の昆虫(Insect)クリーチャーである。
[+1]:黒緑の1/1の昆虫クリーチャー・トークン1体を生成し、その後カード1枚を切削する。これにより昆虫カードが切削されたなら、飢餓の潮流、グリストの上に忠誠(loyalty)カウンター1個を置き、この手順を繰り返す。
[-2]:あなたはクリーチャー1体を生け贄に捧げてもよい。そうしたとき、クリーチャー1体かプレインズウォーカー1体を対象とし、それを破壊する。
[-5]:各対戦相手はそれぞれ、あなたの墓地にあるクリーチャー・カードの枚数に等しい点数のライフを失う。3
{
effect: string, // 効果
instructions: string // 手札にある時、墓地にある時、など
}
どうやってプログラミングすんねん、と言う懸念は置いておいて、効果と効果を発揮する場所を持たせる事にした。
あとがき
今回設計したオブジェクトは、あくまで「こんなデータが欲しいなぁ」ぐらいの、かなりざっくりとした仕分けしかされていないが、オラクル解析のとっかかりとしてはこんなもんだと思う。
早速データを突っ込んでみたい所ですが、先に呪禁とか発掘とか破壊不能などの、いわゆる「キーワード能力」を仕分ける仕組みを作る必要がありそうです。
それにしても MTG のルールって難しいね、ジャッジの方々は素直にリスペクトしちゃうわ。
ディスカッション
コメント一覧
まだ、コメントがありません