10月 2014 archive

動かすところから始める WordPress プラグイン作成

IMG_0222

随分前に書くと言っていて書かなかったプラグイン作成について記事を書きます。
ただし、前回書いたことはいったん無視します。
プラグインファイルを作ったり色々面倒くさくて
プラグインはファイルを個別に用意したりとか、設定画面を作ったり色々手間が多いので
まず動くものを作ってからプラグインに切り出すという手順でやって行きたいと思います。

作ってるものって、動いてくれないとなかなかモチベーション維持できないですよね。
ですので、まずは簡単に動かす事から始ます。

動くものを作り、リファクタし、テストでチェックをしてまた動くように作る。
TDD(テスト駆動開発)での作業を目指しますっ
※テスト環境がまだないのがいかんですね。作らねば。
tdd

(画像は和田卓人さんのスライドからお借りしました。
プログラマにはためになるスライドが多いのでぜひチェックしてみてください)


1・目的、目標から作業内容を決める

自分ももっちゃんもマジック:ザ・ギャザリングが好きで、よくデッキを弄って遊んでいて
いろいろな人に自分たちの作ったデッキを見てもらいたいと思うのですが
そのデッキをこのブログで掲載するのが面倒くさい。
具体的には見栄えを良く見せるためのタグ打ちが面倒くさい。
せっかくWordpressのようなブログツールを使ってるのだから
面倒なく、自動的に整形してもらいたいのに…
(タグ打ちは嫌でござる)

と、言うことで
decklist
上の画像(公式サイトから引用)のように見えるよう、
カード名と枚数を書くだけで、綺麗なリストを表示するように
タグを自動挿入するプラグインを作ってみようと思います。

今回は動くものを出来るだけ簡単に作るのが目標です。
ですので、出来るだけ作業を小さくします。
具体的には

・関数をひとつ作る
・作った関数を記事表示時にフック(後述)

以上2点に抑えます。

それではやっていきましょう。


2・関数を作成

それでは、まず関数を作っていきます。

function MtgList($the_content){
	return $result;
}

と、こんな感じで、名前を MtgListにして、引数でコンテンツの本文を受け取るようにして、
返り値に整形したコンテンツの本文を返すようにします。

このままだと、本文全体をリストとして整形してしまうので、特定のタグに括られた箇所だけ整形するようにしましょう。

function MtgList($the_content){
	return preg_replace_callback(
		'/\[MTG\](.+)\[\/MTG\]/s',
		function ($matches) { return $matches[1]; },
		$the_content
	);
}

preg_replace_callback 関数と、その引数の正規表現についてはそれぞれ資料を確認してください。

ざっくり解説すると、

第1引数で、どんな文字列を置換するか決定してます。
ここでは [MTG] ~ [/MTG] の文字列を検索しています。

第2引数で、置き換えの方法を決定。
(今のところ、[MTG] ~ [/MTG] の 「~」部分だけを出力するようにしています)

第3引数が、置換元の文字列です。

このままだと、ちゃんと置換されたかわかりづらいので該当箇所を赤い太字にしてみましょう。

function ($matches) { return '<p style="color:red;font-weight:bold;">' . $matches[1] . '</p>'; },

こんな感じですね。
これで、関数作りは完了です。


3・記事表示時にフック

次は、この関数を記事表示時に呼び出し、記事の内容を整形します。
それにはフックという機能を使います。
フックとは

何かの処理の前に処理を割り込ませる機構・機能

の事だと思ってくれて大丈夫です。
今回は

記事表示処理 の前に 先ほど作った関数(処理) を割り込ませます。

WordPress には、add_filter という関数で実装されています。

具体的には

add_filter('the_content', 'MtgList');

こんな感じで使います。

第1引数で、どのタイミングに割り込ませるか決めて
第2引数で、どの処理を割り込ませるか決定します。

上の例だと

記事表示(the_content)の前に MtgList 関数を呼び出すという処理を行い、
MtgListの第1引数に、コンテンツ本文の値が格納されます。


4・使ってみよう

これらのコードを早速使ってみましょう。
プラグインファイルを用意するのは、若干手間がかかるので、
今回は functions.php の中に追記します。

functions.php は 外観→テーマ編集→テーマのための関数(functions.php)にあります。

hoge

本来はサイトの見栄えをよくする為の関数を記述するところなのですが、
後日切り出すということで、今回は functions.php の末尾に追記します。

function MtgList($the_content){
	return preg_replace_callback(
		'/\[MTG\](.+)\[\/MTG\]/s',
		function ($matches) { return '<p style="color:red;font-weight:bold;">' . $matches[1] . '</p>'; },
		$the_content
	);
}

add_filter('the_content', 'MtgList');

さて、この状態で記事に下記文章を書いて表示すると…

[MTG]
3 沼
1 山
[/MTG]

3 沼
1 山

と、赤い太字で表示されます。

後は、4行目の処理を改良し
・行数分け
・枚数計算(土地・クリーチャー・その他・サイドボード)
・自動リンク
などを追加していけばOKです。


5・次回予告

来週は行数を分けて表示する機能を追加します。
改行コードでパースしてそれぞれにタグを付与するだけなので簡単だと思います。

それではっ

今、スタンダードでハンデスを使う。

wpid-kimg0093-1024x727

先週の日曜日にゲームデーに参加してきました。
赤緑モンスターとかアブザンデッキが多い印象を受ける中
私が持っていったデッキは時流とかすりもしない黒単メガハンデス

デッキ構成は下記のとおり。

【黒単メガハンデス】

土地 25枚

  • 沼     21
  • 光輝の泉 4

クリーチャー 3枚

  • 饗宴の主 3

そのほか呪文 32枚

  • 思考囲い     4
  • 蔑み        4
  • 精神腐敗      3
  • 無駄省き     4
  • リリアナ・ヴェス 4
  • 英雄の破滅    4
  • 胆汁病       3
  • 残忍な切断    2
  • 全希望の消滅   2
  • 奈落の総ざらい  1
  • 頭蓋書庫     1

サイドボード 15枚

  • 悲哀まみれ     3
  • 信者の沈黙      2
  • 精神染み       2
  • 闇の裏切り      4
  • ガラクの目覚め      1
  • 刺し傷         3

【デッキコンセプト】

リリアナ・ヴェスの大マイナスが使いたい!
無駄省きで墓地に落とした手札で自陣を豊かに安定させつつ大マイナス発動!

【デッキ展開】

1-2ターン目

・思考囲いや蔑みで対戦相手の手札をガン見する。デッキ内容を予想しつつ序盤のキーパーツとなりそうなカードを落とす。
無駄省きを設置し、ハンデスカードを待つ。
・序盤、手札から落としきれずに戦場に展開した厄介なクリーチャーは英雄の破滅や胆汁病で破壊する。

3-5ターン目

【プランA:相手のカード展開が予定通り遅れていてこちらが有利な戦況】

蔑みや精神腐敗で相手の手札を落としながら無駄省きの効果で自陣をすこしずつ豊かにする。

【プランB:相手のカード展開が速く、クリーチャー除去やハンデスでは対応しきれない。】

饗宴の主 登場!相手のライフを積極的に削る。

【プランC:クリーチャーは並ばないがライブラリを削られる。】

頭蓋書庫を早めに設置。饗宴の主を引けたらプランBで対応。奈落の総ざらいが引けたら今までにライブラリから落とされたカードを探査で追放して沢山のゾンビで殴りかかる

6-9ターン目

リリアナ・ヴェスを設置。相手の戦場にクリーチャーが並んでいれば忠誠値-2能力で全希望の消滅を持ってきて除去する。

【プランA:リリアナ・ヴェスを対処されない素敵な状況】

・忠誠値+1能力を起動し続ける。忠誠値8まで溜まったら爆発。対戦相手のクリーチャーで殴る。

【プランB:リリアナ・ヴェスの忠誠値がたまらない。】

・忠誠値-2能力で第2第3のリリアナを呼んでプランAに戻そうとしつつ、饗宴の主やゾンビで殴る。

無駄省きでアドバンテージをとりつつ、相手の手札が枯渇しても饗宴の主でドローさせ、リリアナ様の+1能力で自分のターンで確実1枚ずつ相手の手札を墓地へ落としていくのが理想的な展開です。
とにかくリリアナ様の大マイナスを発動させたいデッキなのでリリアナ様設置後は忠誠値を上げることが最優先です
それが叶わない状況であれば-2能力で新たなるリリアナ様を引っ張ってきて手札に囲いながら、クリーチャーが並んでいれば全希望の消滅で一掃(エンチャントクリーチャーばかりがいたら泣くしかない)。クリーチャーが並んでいなければ饗宴の主で意地でも5点クロックを刻みます。

インスタントやソーサリー呪文がほとんどなので探査が使いやすいため、除去カードに残忍な切断をいれています。奈落の総ざらいは無駄省きも饗宴の主もいないときに除去やハンデスで肥えた墓地を餌に殴れて守れるゾンビの壁を作る作戦です

 

 

何故そんなに、リリアナ様の大マイナスが使いたいのか。

私がMTGを始めたのはM14の頃からで、当初は右も左もわからず構築済みの緑白デッキを使って遊んでいました。
当ブログの共同管理人ゆうと何度も対戦していくうちに徐々に勝ち星がつきはじめ、調子に乗った私が次に対戦した相手のデッキがライブラリアウトのデッキでした。

当時の私は何も出来ないまま、自分のデッキの中身を隅々まで眺められ、ただただ自分のカードが墓地へと落とされていくのを指をくわえてみているしかありませんでした。

悔しかった・・・ただただ悔しかった。自分のデッキが全部使えなくなっていく・・・私はMTGをやる才能がないんじゃないか・・・と悲しみにくれました。

悔しい!このライブラリアウトに勝ちたい!墓地に落ちたカードをもう一度自分の元に戻せたら!
そんな中M14のパックを向いて出てきたレアがこちら。

m14_yaminoryouikinoryuusei
闇の領域の隆盛」です。当時の私は「墓地にある」と「あなたのコントロール下で戦場に出す」という言葉に希望を取り戻しました。
墓地に落ちたカードが戻ってくる!
しかもマナを払わずに戦場にくるんだ!
これでもう何も出来ずに負けることはない!
このカードでデッキを組もう!!!

すっかりこのカードの虜になり、デッキを組み始めた頃はすでにテーロスが出始めた頃。
エレボスの鞭があればいいところをアスフォデルの灰色商人を闇の領域の隆盛で釣ってくるという無茶をしていました。

 

M15で闇の領域の隆盛が再録されることを願っておりましたがそんなことはなく
少ししょんぼりしていたのですが、ゆうから「M15にリリアナ・ヴェスが再録されるから大丈夫じゃない?リリアナの大マイナス能力は闇の領域の隆盛と同じ効果だよ」と聞き思わずゆうの持っていたローウィンのリリアナ・ヴェスのカード内容を確認。

m14_lilianavess
あった!闇の領域の隆盛が出来る!!!
もうこれはリリアナ様が輝くデッキを組むことこそ生きる道だと思いました。
しかし、リリアナ様を設置させたとしてもリリアナ様の忠誠値を安定して貯めることが出来ないと意味がありません。出来ればあまり手間なく、少ないカードで盤面を安定させたい。と思ったときに同じくM15に収録されたこちらのカードに目がいきました。

m15_wastenot
無駄省きさえあればリリアナの+1能力で落とした手札でゾンビやマナが出る!リリアナ様をゾンビで守りつつ、忠誠値を貯められる!!と意気込みましたがゾンビじゃフライヤーがとまらない
さらに問題だったのがいくらハンデスカードやリリアナ様の能力があっても相手の手札が枯れてしまうとハンデスカードは手の中で腐り、無駄省きはただの置物となってしまうことでした
そんな悩んでいた時に、こちらのカードがパックからホイルで出てきてガッツポーズをしました。
jin_masterofthefeast

饗宴の主マン。3マナで出る5/5フライヤー。その強力なスペックに対するデメリットとして対戦相手にドローさせる能力をもっている悪魔。あなたのアップキープ開始時というテキストがやたらと煌いていたのは単にホイルだったからではないはず。これに相手が手札ないぜー!と余裕ぶられてもハンデスできるし無駄省きも仕事する!!最悪コイツで4回殴れば勝てる!!!

この3枚のカードをキーパーツに除去カードや土地カード量、サイドボードなどを調整して構築した今回のデッキ。ゲームデーでは1-4と惨敗の結果に終わりましたがデッキは好評価を頂けたので満足です。

まだまだ調整の余地がありますが、来週はティマレットデッキの調整をしたいので頭のなかは今からティマレットでいっぱいです
あとスゥルタイカラーを使いたいです。ラクシャーサの大臣とかラクシャーサの死与えとか使いたい。