コアスクリプトを改造してみる

はいどーもニートです。
イベントを実装してみるでもコアスクリプトをいじりましたが、今回はもう少し実際のゲームでも役に立つかもしれない改造をしてみたいと思います。

ゴールドを失うたびにメッセージが表示されるシステム

例えば主人公は貯金が趣味で、毎日お金を見てニヤニヤと悦に入っているとします。
町に出かけるときも全財産を持ち歩き、やっぱりご満悦の笑顔です。

そんな主人公君ですがドジなところがありまして、町に出かけたとき、お金を落としてしまうことがあります。
このお金を落としたとき、ゲーム制作者であるあなたはメッセージを表示させたいとしましょう。
また、落とした回数によってメッセージを変化させたいとします。

さて、このシステムを実装するとき、あなたならどうしますか?
「今何回落としましたよ」というカウンタ変数を用意しますか?
それも一つの手でしょう。
ですが、例えばお金を落とした回数が5回に達したとき、メッセージをまた1から表示させたいとしたらどうでしょう?
「そんなのswitch文で判定して、カウンタ変数を0に戻せばいいじゃん」と思うかもしれません。
それも一つの手です。

あるいは
http://dixq.net/g/03_04.html
このサイトに書いてあるような計算式を用いてループさせてもよいでしょう。

が、今回は新しいことに挑戦したいという僕の欲望を満たすため、ジェネレーターを用いることにします。

ジェネレーターってアレやろ?

ツクール付属の顔グラとか作るアレじゃないです。
JavaScriptのジェネレーターです。
ES6の機能ですが、ツクールMVでも使えると聞いてさっそく遊んでみることにしたのがこの記事です。

お金の増減処理

お金の増減の仕方も色々とありますが、今回は実験なので、とりあえずGame_Party.prototype.gainGoldメソッドを改造してみましょう
まずはこんなジェネレーター関数を作ってみます。

Game_Party.prototype.loseGoldGradually = function*() {
while(true){
$gameMessage.add('お金を失った!次は気をつけよう!');
yield;
$gameMessage.add('あ、あれ? またなくしてる?');
yield;
$gameMessage.add('また落とした!うつ病になりそうだよお。');
yield;
$gameMessage.add('もうだめだぁ……次は全財産失いそう……');
yield;
$gameMessage.add('全財産失ったよん☆');
$gameParty._gold = 0;
yield;
}
};

なにをやっているかと言えば、ご覧の通り無限ループさせています。
この無限ループによって、「お金を落とした回数が5回に達したとき、メッセージをまた1から表示させたい」が実現するのです。

具体的にどういうことやねんと言えば、functionのあとに*がついていることに注目してください。
この*がジェネレーターであることを示します
で、無限ループ中のyieldですが、この関数が実行されたとき、一度yieldで処理を止めます
次またこの関数が実行されたとき、続きから関数を実行します。
yield return;と書けばわかりやすいでしょうか(実際にはこんな書き方はできません)。

さて作ったジェネレーターを使えるようにしましょう。
まずは初期化メソッドをこんな風にします。


var _Game_Party_initialize = Game_Party.prototype.initialize;
Game_Party.prototype.initialize = function() {
_Game_Party_initialize.call(this);

this._genTest = this.loseGoldGradually();
};

先ほど作ったloseGoldGraduallyジェネレーターを_genTestプロパティに代入していますね(ジェネレーター関数はオブジェクトを返します)。
これでジェネレーターを使う準備が整いました。

Game_Party.prototype.callGenTest = function() {
this._genTest.next();
};

var _Game_Party_gainGold = Game_Party.prototype.gainGold;
Game_Party.prototype.gainGold = function(amount) {
_Game_Party_gainGold.call(this, amount);
if(amount < 0){ this.callGenTest(); } };

callGenTestメソッドは、ジェネレーターのnextメソッドを呼んでいます。
このnextメソッドを呼ぶことで、ジェネレーター関数内の内部カウンタが一つ進み、次のyieldに進むのです。

ちなみにgainGoldメソッドの中身ですが、これはお金を失ったときだけcallGenTestメソッドを実行するようにしているだけです。

実行してみる

プラグインにしておきましたので、適当に実行してみてください。
以下のURLからダウンロードできます。
https://drive.google.com/open?id=0Bzv5SDIG57yoM2Ytc0JGQWNidWM

お金を失ったとき、失った回数によって表示されるメッセージが変わります。
このとき、最後のメッセージに到達していた場合は最初のメッセージへ戻ります。
おまけで、最後のメッセージを表示したときにパーティーのゴールドを0にしています。
なお、イベントコマンドからの操作以外は未確認です。

フォローする