あひるをやっくのっはたのしいな♪
ある日あひるを焼いていると
あひる焼き
— 無い袖シェイカー (@toshi_a) November 23, 2014
怒られました。
@toshi_a 焼くな
— あひる@12/27東海道らぐ (@ahiru3net) November 23, 2014
どうも自動であひる焼きに反応するmikutterプラグインを書いたようです。mikutterプラグインを書きたいと言っている人は基本的に書かないので無害ですが、何も言わずにふっとプラグインを生み出す人間にろくな人は今まで居ませんでした。あひるさんもろくな人間ではないのでしょう。
https://github.com/Na0ki/ahiru_yakuna
うわぁ…。今見たらyamlファイルに反応バリエーションが出してあるし…。順調に腕を上げてますね。pull-reqも受け取って比較的活発に開発しているようなので、こういう人は早めに潰しておかなければなりません。
作った
帰ってきたあひる焼きゲーム!
https://github.com/toshia/ahiruyaki
あひる焼きをソーシャルゲームにしました。mikutterの機能をフル活用してあひる焼きを楽しみます。フロント側の機能はREADMEに書いているので、裏で何をしているかちょっと紹介します。
RANK_TABLE
あひる焼きランクは、経験値を溜めると上がっていきます。経験値は減ることはありません。次のランクに上がるために必要な経験値をグラフ化してみました。
途中からやたら経験値が要るようになりますね。計算式は謎めいたものを使っていますが、深い意味はありません。詳しくはソースの6行目あたりからですが、無駄にEnumeratorを使用しているのがポイントですね。こういうことをすると、Enumerable#find で、ある経験値だとランクいくつになるか、というのがわりと直感的に書けます。
Plugin::Ahiruyaki::RANK_TABLE.with_index.find{ |exp, _|
UserConfig[:ahiruyaki_exp] < exp }[1] + 1
だからどうした感が半端ない。効率はメモ化した再帰関数のほうが良さそうですが、一方でどう見てもボトルネックになるような処理ではありません。
スタミナ
ソーシャルゲームならスタミナがなければいけません。スタミナはランクアップで全回復して、行動によって消費し、時間経過で全回復します。また、スタミナには最大値があります。これはランクアップで上がっていくので、ランクから計算できます。更に、初めてゲームを遊んだ時はスタミナが最大になっているというのもポイントです。
今回はスタミナを数値で保持せず、スタミナが全回復する時刻を保持して、そこから現在のスタミナ値を決定しています。この方法のメリットは、スタミナ回復のことを常に考える必要がないことです。Time.now の戻り値を代入すれば即時回復できますし、mikutterを終了している間もスタミナが回復します。スタミナを消費した時は全回復時刻に加算すればいいだけですし、次回のスタミナ回復時刻が10秒後という時にスタミナを消費した時に、5分にリセットされるとかいうこともありません。
これはいい方法ですね。良い方法なので、多分本物のソーシャルゲームもだいたいこうなっているんじゃないか、という多分一生役に立たない知見を得ることができました。いや、思っただけなので知見でもないですね。本当に得るものがない。
また、 expend_stamina というメソッドは、消費スタミナ値を引数にとり、そのぶんだけスタミナを消費してブロックを実行します。スタミナが足りなければブロックが実行されないし、ブロックの処理途中で例外などで抜けたらスタミナが減らないので便利です。
イベント駆動
今回このプラグインを書くにあたっては、イベントをできるだけ使うようにしました。例えば、経験値は add_experience メソッドでのみ増加しますが、この経験値の増加でランクが上がると、ahiruyaki_rankup イベントが呼ばれます。最大スタミナ値などほとんどのものはランクから自動計算しているので、経験値が上がった瞬間自動的に上がりますが、スタミナの回復だけは処理してやらないといけないので、このイベントをキャッチすることで行ってます。
イベントはどのプラグインでも受け取ることができるため、あひる焼きゲームはMODの開発が簡単です。
とくに、スタミナが全快した時に発生するイベントは、全快したら自動であひるを焼くなど、さまざまな用途に使えそうです。
こういうことをしておくと、ユーザは予想外の意味不明な拡張をしてくるものです。mikutterで何度もそういうことを経験しました。何だよ、あひる焼くなプラグインって。
終わりに
結局、焼きあひるに油を注ぐ結果になっている感じがしてなりません。ゲームのアップデートもしたいのですが、忙しい時期なので、ほかのタスクに圧されて手がついていない状態です。
たまにこういう役に立たないものを書くと心がやすらぎますし、いろんなものを得た気になれるので(実際はそんなことはほぼない)、皆さんもやったら良いと思います。