
なかまよびプラグイン
重要な追記(2021/8/9)
致命的なバグに気づきました。もしこれを使ってる方がいたら、
敵キャラの名前.png を必ず img/enemies にインポートしておいてください。
たとえばスライムだったら、「スライム.png」という名前の画像がないと動作しません。
これ、このあと説明してる敵画像の横幅を取得するくだりで、「私はあたりまえにやってるけどみんながそうとは限らないこと」が前提になってしまていました……いやー、まいったな。
以下本文。
一般的な処理の流れについては前の記事参照のこと。
基本的にはこの考え方でつくっています。Scene_Battle.update で、「いまからなかまよびの処理をする」という条件(特定のスイッチがON)が満たされた場合に、なかまよびのメソッドを呼んで、処理完了とともにその特定のスイッチをOFFにする、という流れです。
どこにも問題がなければ上の図のとおりに処理が進みます。必ずしも正確ではないですが、イメージとしてはこういう感じという図ですね。ただ、他のbattlerも同時に並行して動いている関係で、いまのわたしの実装では必ずしもこのとおりには進みません。Scene_Battle.addEnemy よりも先に BattleManager.callHelp が呼ばれたり、あるいは BattleManager.callHelp の処理中に別のバトラーの行動が割り込んできたりすることがあるので、可能な限りそうならないように泥臭いこともしています。
敵ID格納先にはこれから呼ばれる敵の敵キャラIDを入れるための変数のIDを入れます。処理開始判別スイッチIDは、なかまよびに設定したコモンイベントのIDです。
BattleManager.callHelp()
おおまかな流れとしては、
なかまよびをする敵の敵キャラIDを取得
→敵キャラデータのメモ欄を読んで呼び出される側の敵キャラIDを取得
→画面内の敵画像の配置と、呼ばれる側の敵画像のサイズを考慮して敵画像を配置するXY座標を算出 (BattleManager.determineXYOfAddedEnemy)
→敵グループに敵データを追加 (Game_Troop.addEnemy)
という感じです。この中ではXY座標の算出がけっこうホネでした。
BattleManager.determineXYOfAddedEnemy(enemyId)
やりたいこととしては、
画面内の余白の幅をpx単位で算出
→これから呼ばれてくる敵画像の幅が入る余白があるか確認
→入る余白があればX座標はそこ。なければ呼び出し失敗。
→Y座標は他のと同じで固定値
という感じです。敵画像のX座標を返すメソッド(screenX)は、敵画像の中心位置のX座標を返してくるのでそれを考慮した計算が必要です。また、Y座標を返すメソッド(screenY)の仕様がたぶんVXと微妙に違っていて、MZでは画像の中心ではなく下辺のY座標を返してきます。なので、敵画像の高さがいくらであってもY座標の設定は固定値でOKです。
Game_Troop.add(enemyId, x, y)
やりたいこととしては、
指定した敵キャラID, XY座標で Game_Enemy インスタンスを初期化
→敵インスタンスの戦闘開始時の処理
→Game_Troop のメンバーに敵インスタンスを追加
→ABC……をつける
という感じです。戦闘開始時の処理は、ふつうの戦闘では戦闘全体の開始時に敵メンバー全体にまとめて処理が行われていてしばらく見落としていました。この戦闘開始時の処理(Game_Enemy.onBattleStart)をしないと、せっかく呼ばれてきても一切行動順が回らない単なる置物になってしまいます。
イメージ通りの処理順にならない、思い通りの座標に来ない、呼ばれてきてもぜんぜん行動しない、そのへんを全部クリアしてようやくの(一応)完成です。ぐんたいアリでひととおり試しつつ、ぐんたいアリがドラキーを呼んだりゆうれいを呼んだりする設定も試してみましたが、いまのところうまくいっています。
ダウンロードはこちら
CSVN_enemyReinforcement.js
※右クリックでDL。なお、本プラグインはフロントビューでの利用を想定しています。サイドビュー用はだれかつくってください。
ほかにつくったやつはこちら
cursed-steven/rmmz: RPGツクールMZ用のプラグインスクリプトをおいていきます。
まえにつくったやつのバグ(?)
ただ、この開発の過程で、以前つくった CSVN_criticalSound.js のバグ(?)が見つかったので、そのうちこれは直します。呪文の会心でもあの音が出ちゃうのはまぁいいにしても、なんか音が出るタイミングが変な気がするんですよね。あと、回復呪文(味方が対象)で会心になった場合でも「つうこんのいちげき」になっちゃうんですよね。これは仕様なんですかねぇ。