見出し画像

戦闘中の処理概略を読んでみた

MZの敵グループ仕様

VXもそうでしたが、ゲームエディタの敵グループの設定でつくっておいた8体までの編成の中で、非表示を表示に変えることで敵の増加を表現する仕様になっているようです。

スクリーンショット 2021-07-28 23.38.01

↑右クリックすると「途中から出現」という設定が現れる

スクリーンショット 2021-07-28 23.30.03

↑この「敵キャラの出現」が対応しているらしい(私は使ったことない)

つまり、DQのような「呼んだら呼んだだけくる」状況は想定されてないっぽいなと。マドハンドとか思い出していただけると伝わるでしょうか。

ということで、DQ風のなかまよびを実装してみました。早く試させろという方は目次から「ダウンロードはこちら」に飛んでください。ここから先は頼まれもしないのに戦闘の処理の解説とか勝手にします。

戦闘中の処理の流れ

マップ上のイベントの処理なら、イベントの構成やスイッチや変数の使い方を工夫すれば、けっこう複雑なことまでゲームエディタのGUIからできますが、イベントコマンド/バトルではできないような戦闘中の細かい処理となるとなかなか大変です。今回なかまよびを実装してみて戦闘の処理の流れがある程度把握できたので、現時点の理解を備忘録として残してみます。

概要

戦闘が開始されるときは(たぶん)例外なく SceneManager から Scene_Battle が呼ばれています。

画像3

Scene_Battle の中で update() がフレーム(1/60秒)ごとに呼ばれ続けており、その中で BattleManager を使ったデータの読み書きや、プレイヤーの入力待ちとその処理、ウィンドウの内容の更新、画像の更新を行っている……という理解でおおよそあっているかなと思います。

Scene_Battle

開始されるとまず initialize、create、startと呼ばれて、そこから update のループに移ります。この update のループの中で、データを読み込んで画面に反映したり、あるいは時間の経過やプレイヤーの入力の結果としてデータを変化させたりしています。この update の中で updateBattleProcess が呼ばれており、これが BattleManager.update を呼んでいます。

BattleManager

Scene_Battle に駆動される形で update がフレームごとに呼ばれています。さらにこの update の中で呼ばれている updatePhase がいわば心臓部になろうかと思います。

BattleManager.updatePhase = function(timeActive) {
   switch (this._phase) {
       case "start":
           this.updateStart();
           break;
       case "turn":
           this.updateTurn(timeActive);
           break;
       case "action":
           this.updateAction();
           break;
       case "turnEnd":
           this.updateTurnEnd();
           break;
       case "battleEnd":
           this.updateBattleEnd();
           break;
   }
};

なんとなく字面でも想像がつくかと思いますが、戦闘開始時の処理、ターンの制御、ターンの中の各行動の実行と制御、ターンの終了、戦闘の終了ですね。それぞれの中で終了条件が満たされると _phase の値が変更され、「次」に移るようになっています。

Window_BattleLog

名前のとおり、戦闘中の経過が表示されるウィンドウです。BattleManager の中の処理の中で、その結果に合わせてこのウィンドウに表示内容が push され、原則としては一定時間後に消えるようになっています。「リードの攻撃!」とか「ケイシーは○○は唱えた!」とかそういうのが出るところですね。

Spriteset_Battle

これは戦闘画面内の画像を制御しています。いちばんわかりやすいのはやっぱり敵の画像を出したり消したりとかそういう部分でしょうかね。

なかまよびの実装

おおまかには、敵のなかまよび行動時に、プラグインの設定で決めたコモンイベントからプラグインの設定で決めたスイッチを入れて、そのスイッチがONになっている場合だけなかまよびの処理を起動し、なかまよびの処理が終わったらそのスイッチを切る仕掛けとしています。

※追記@2021-07-29
Game_Action.apply をごにょごにょすればいけそうな気がしてきたのでちょっとトライしてみようと思います。これがうまくいくなら以下のようなトリッキーなことをしなくてもよさそうな気がします。
→再追記: やっぱりダメっぽい

BattleManager.startAction → なかまよびの処理 → endAction → updateTurn ... となる想定だったんですが、なかまよびの処理が先に呼ばれてしまうことがちょくちょくあるので、どちらが先に呼ばれてもうまく流れてくれるように細工するのがなかなか大変でした。また、それでもなかまよびの処理の開始と終了の間に次のbattlerの処理が始まってしまうこともあり、その場合は増援の到着がひといきだけ遅れます。まぁ大勢に影響はないので既知の不具合としていったん見切り発車です。

長くなったので処理の具体的内容の解説は別記事へ

などなど、長くなってきたのでなかまよびプラグインの具体的な説明は別記事としたいと思います。

重要な追記(2021/8/9)

致命的なバグに気づきました。もしこれを使ってる方がいたら、

敵キャラの名前.png を必ず img/enemies にインポートしておいてください。

たとえばスライムだったら、「スライム.png」という名前の画像がないと動作しません。

これ、このあと説明してる敵画像の横幅を取得するくだりで、「私はあたりまえにやってるけどみんながそうとは限らないこと」が前提になってしまていました……いやー、まいったな。

ダウンロードはこちら

CSVN_enemyReinforcement.js
※右クリックでDL。なお、本プラグインはフロントビューでの利用を想定しています。サイドビュー用はだれかつくってください。

ほかにつくったやつはこちら

cursed-steven/rmmz: RPGツクールMZ用のプラグインスクリプトをおいていきます。

この記事が気に入ったらサポートをしてみませんか?