RPGツクールMZメモ1 状態異常画面制作編(カスタムメニュー作成プラグイン)

RPGツクールで遊んでいるが、このゲーム長いことMV(旧版)で開発などが行われていたせいで初心者には情報がめちゃくちゃ検索しづらい。
目的のプラグインを見つけてもMZ(新版)には対応してなかったり、調べてみたらMVとMZで仕様が変わってて上手く動かなかったりと、なかなか難しい所がある。
そのうちRPGMakerUnityも発売秒読みとなっておりすでに今更感はあるものの、いつか誰かの役に立つかもしれないと思って今日やってたことのメモを残しておこうと思う。

あくまでも備忘録で、筆者は初心者なので変な事してても許して欲しい。
あと同じく調べ始めたばかりの人がわかるよう、できるだけ脳死コピペで作れるように書いていくことにする。


1.【問題】状態異常がわかりにくい

まずこのツクールのメニュー画面を見て欲しい。

サンプルプロジェクトより

試しに全員に状態異常になってもらったが、この状態異常のアイコンがそれぞれ何を指しているかわかるだろうか?

正解は、左から【麻痺】【魅了】【混乱】【暗闇】だ。

……暗闇!? この赤いカーテンのアイコンが、暗闇!?

まあアイコンがわかりにくいのはさておき、ツクールMZの明確な欠点として「状態異常を文字で説明するシステムがない」という仕様がある。
マウスオーバーしたら異常の名称ぐらいはポップアップしてほしかったが、そんなことが起きる便利な世界はここにはないらしい。(ファミコンのドラクエですら「どく」「まひ」と言った文字表示があったはずだが?)

この仕様、MVの頃はユーザーによるプラグイン(MODのような仕様変更プログラム)を使えばアイコンクリックで説明を表示できる物もあったようだが、現在MZでは動かない。

だが状態異常は確認できないとわかりにくい。
特にオリジナル状態異常なんかは本当にわからない。
他の人の作ったゲームだと、完全な脳内当てゲームになってしまうだろう。


2.【対策】状態異常確認画面を作ろう

はい、というわけで完成したものがこちらになります。

右のメニュー欄に「状態異常」の項目を追加している

追加した「状態異常」を押すと……。

右はキャラ画像を表示させる余白

はい。簡素ながらも、それぞれのアイコンと説明が表示される画面を作れました。
こうしてみると簡単そうだけど、この2ページの挙動を作るのに丸一日かかってしまった……。

作ってみてわかりましたが、メニュー画面ってそれぞれ1枚の紙の大きな紙にウィンドウの小さな紙を貼り付けてページを作るようなイメージですね。

ちなみにメニュー画面自体は、NUUN様の作成されたメニュー画面を拡張するプラグインでスタイルを変更しています。神。


3.作り方1⃣サブコマンド

事前に用意しておくもの

・使ってない変数2つ。(今回は37-38を使用)
・使ってないスイッチ2つ。(今回は84-85を使用)

まずは「状態異常」のボタンを作る為に、トリアコンタン様が作成された「メニュー画面のサブコマンドプラグイン」を導入。

「サブコマンド」から以下の設定を入力していく。

この画面で3つ入力

①サブコマンド-「親名称」

 ここにボタンに表示する文字(”状態異常”など)を入力

②サブコマンド-「スクリプト」

ここに、後で設定する状態異常画面の呼び出しスクリプトを記入する。

SceneManager.callCustomMenu('Scene_State');

③サブコマンド-「メンバー選択」

「あり」に。
一人の場合はなくてもいいけど、その場合はパーティ番号を固定値とかに書き換えます。面倒なら一人でも選択ありの方がいいと思う。

テキスト一括入力サンプル

["{\"CommandId\":\"0\",\"Name\":\"\",\"ParentName\":\"状態異常\",\"HiddenSwitchId\":\"0\",\"DisableSwitchId\":\"0\",\"Script\":\"SceneManager.callCustomMenu('Scene_State');\",\"ReturnMap\":\"false\",\"MapId\":\"0\",\"SelectMember\":\"true\"}"]



次は「パラメータ」に入力していく。

サブコマンドの他に2つ入力

④「コマンド追加位置」

上から何番目の項目にしたいか、番号を入力。
デフォルトだったら4ぐらいの位置がちょうど良さそう。

⑤「選択アクターID変数」

ここに空いてる1つ目の変数を設定しておく。
ここにはこの選択したアクターが前から何番目にいるかを入れてるはず。


2⃣カスタムメニュー作成

次は実際に表示されるステータス異常ページの画面を作っていく。

こちらも同じく、トリアコンタン様が作成した「カスタムメニュー作成プラグイン」を導入。

シーン1~3にはサンプルが入っているので、シーン4に新たなページを追加をする。

ここから本番

⑥シーン-「シーン識別子」

シーンの名前だ。「Scene_State」としたけど好きにつけてOK。
ただし、「②」の作業で設定したページ呼び出しスクリプトで使っている名前なので、ズレないように注意。

Scene_State

次は「初期イベント」を設定する。
ここは選択すると次のウィンドウが開く。

初期イベント設定画面

⑦初期イベント-「ウィンドウ識別子」

後で作成する3つめのウィンドウの名前を入れる。
ここでは「State_window」と指定した。

State_window


⑧初期イベント-「スクリプト」

「スクリプト」に以下のsetValueコードを入力。ここではカーソル位置を入れる変数の初期化をしている。適宜変数の番号は変える事。

$gameVariables.setValue(num,0); //numに変数の番号を入れる
//例・$gameVariables.setValue(37,0); //37は変数番号

⑨初期イベント-「スイッチ」

ここには画面更新用のスイッチをONにしている。
画面を開いた瞬間、名前やステータスやらを現在の物に更新する為。

次はウインドウ一覧を作成する。

4つのウィンドウ設定は上記の色の4つの枠に対応

ウインドウはそれぞれ4つの枠に対応しているので、4つの枠を入力して作 っていく。

【左上の名前枠】

 入力するのは以下の四箇所だ。

深く考える必要はあんまりない

⑩名前枠-「ウインドウ識別子」

 特に使わないので、かぶらなければOK

⑪名前枠-「横幅」「高さ」等座標

 画面に合わせてレイアウトは適当にいじってください。
 私の場合は横長にしてるので、画像の数値は1024*768用です。
 面倒なら画像の数字通りに入れておいて、後で調整しよう。

⑫名前枠-一覧取得スクリプト

 プルダウンメニューから「[this._actor]」を選択する。
 これだけで名前が表示される。素晴らしいプラグイン。

⑬名前枠-再描画スイッチ

 ⑧でONにしたスイッチを入れる。
 この画面を開く時、名前が更新されるという処理。

【右上のステートアイコン表示枠】

名前枠に加えて一箇所だけ追加

⑭アイコン枠-「ウィンドウ識別子」「各座標」「一覧取得スクリプト」「再描画スイッチ」

 ここらへんは⑩~⑬と同じように入れればOK。識別子は同じ物が被らないようにしよう。

⑮アイコン枠-「項目描画スクリプト」

ここにはステートアイコンの表示処理を入れる。

this.drawActorIcons(item, r.x, r.y,600); // アクターのステートアイコン

プルダウンメニューからも入力できるが、ここは「600」を入れなければアイコンは4つまでしか表示されないので注意。
600の部分は、本来Width(横幅)が入る場所だが、プルダウンメニューでは省略されている。ここに設定を入れれば、ウィンドウ枠の横幅の限界までアイコンが表示される。600の数字は枠の幅に合わせていじってね。

【左中段、ステート一覧】

一覧を取得+詳細表示のスクリプトを入れる

⑯一覧枠-「ウィンドウ識別子」

 ここでは⑦で指定したウィンドウ枠の名前を入れる。

State_window

 最初にここにカーソルを合わせる処理だ。⑦と同じなら別の名前でもいい。

⑰一覧枠-「座標」

 これまでと同じく適宜調整して入れよう。

⑱一覧枠-「一覧取得スクリプト」

 ここでは⑤のときに保持しておいた、今選択しているパーティメンバーの変数番号を使って、そのアクターがかかっている状態異常のリストを取得する。
 以下のスクリプトを書き換えて入力しよう。

$gameParty.members()[$gameVariables.value(num)-1]._states ; //numは変数番号
//例・$gameParty.members()[$gameVariables.value(38)-1]._states ;

※先頭メンバーが0番なのに選択メンバーは1が入るので-1をしているけど、環境による物か? わからん……。

⑲一覧枠-「マッピングスクリプト」

「⑱」で取得したステートはステートのIDが入った数字のリストなので、アイコン表示+ステート名称に加工して表示している。

("\I[" + $dataStates[item].iconIndex + "]") + $dataStates[item].name;

⑳一覧枠-「共通ヘルプテキスト」

 ヘルプウィンドウをONにしてるときはなんか入れておくと下に表示されてお得感。画面構成によっては、ウインドウごと消してもいいと思います。その場合は⑥あたりにヘルプウィンドウの消去項目があるのでOFFに。

㉑一覧枠-「カーソルイベント」-「スクリプト」

「スクリプト」に以下のスクリプトを入れて、詳細表示ウインドウの表示更新スイッチをONにする。
ここは「⑨」で設定した再描画スイッチとは別のがいいと思う。たぶん。

$gameSwitches.setValue(num,true) //numにスイッチ番号を入れる
// 例・$gameSwitches.setValue(84,true) //84はスイッチ番号

㉒一覧枠-「再描画スイッチ」

ここは「㉑」で設定したスイッチとは別。
「⑨」で設定したスイッチと一緒の物を入れよう。

㉓一覧枠-「インデックス格納変数」

ここでは新しく2つ目の変数を設定しよう。
ここの変数にはステータスを選択したカーソルの動きが入る。
(現在、カーソルが一覧の中の上から何番目を選択してるか)


【左下の説明表示欄】

最後の枠

㉔説明枠-「ウィンドウの設定」

「ウィンドウ識別子」「座標・高さ・幅」はこれまでと同じように好きに入れて調整しよう。

㉕説明枠-「一覧取得スクリプト」

 ここに今までで一番長いスクリプトを入れる。
 詳細としては、さっき保持しておいた選択アクターが持ってる状態異常の、メタデータをゲームデータから読み込む物。

$dataStates[$gameParty.members()[$gameVariables.value(numA)-1]._states[$gameVariables.value(numB)]]?.meta?.help; //numAとnumBに変数番号を入れる
// 例 $dataStates[$gameParty.members()[$gameVariables.value(38)-1]._states[$gameVariables.value(37)]]?.meta?.help; //38と37は変数番号

numAは⑱と同じ変数。numBは㉓の変数。
?はnullデータ(ステートが存在しない)の時にエラー無視するもの(データがないのが正常なので)

……たぶん「一覧ウィンドウ識別子」を使ったりするのが正しい気がするけど、よくわからんかったので無理やり入れました。
動いたからヨシ!

㉖説明枠-「再描画スイッチ」

ここは「㉑カーソルイベント」で指定したスイッチを入れ、「カーソルが動くとスイッチがオンして画面が更新される」という動作を行っている。


シーン全体の一括テキストまとめ

{"Id":"Scene_State","UseHelp":"true","HelpRows":"0","InitialEvent":"{\"CommandId\":\"0\",\"FocusWindowId\":\"state_window\",\"FocusWindowIndex\":\"-1\",\"Script\":\"$gameVariables.setValue(37,0);\",\"SwitchId\":\"85\",\"Deselect\":\"false\"}","ActorChangeEvent":"","WindowList":"[\"{\\\"Id\\\":\\\"State_Name\\\",\\\"x\\\":\\\"0\\\",\\\"RelativeWindowIdX\\\":\\\"\\\",\\\"y\\\":\\\"0\\\",\\\"RelativeWindowIdY\\\":\\\"\\\",\\\"width\\\":\\\"400\\\",\\\"height\\\":\\\"70\\\",\\\"ColumnNumber\\\":\\\"1\\\",\\\"RowNumber\\\":\\\"0\\\",\\\"Rotation\\\":\\\"0\\\",\\\"ItemHeight\\\":\\\"0\\\",\\\"CommandList\\\":\\\"\\\",\\\"DataScript\\\":\\\"\\\",\\\"ListWindowId\\\":\\\"\\\",\\\"ListScript\\\":\\\"[this._actor]; // メインメニューで選択したアクター\\\",\\\"FilterScript\\\":\\\"\\\",\\\"MappingScript\\\":\\\"\\\",\\\"ItemDrawScript\\\":\\\"\\\",\\\"IsEnableScript\\\":\\\"\\\",\\\"CommonHelpText\\\":\\\"\\\",\\\"DecisionEvent\\\":\\\"{}\\\",\\\"CancelEvent\\\":\\\"{}\\\",\\\"CursorEvent\\\":\\\"{}\\\",\\\"ButtonEvent\\\":\\\"[]\\\",\\\"FontSize\\\":\\\"0\\\",\\\"FontFace\\\":\\\"\\\",\\\"OverlapOther\\\":\\\"false\\\",\\\"WindowSkin\\\":\\\"\\\",\\\"VisibleSwitchId\\\":\\\"0\\\",\\\"ShowOpenAnimation\\\":\\\"true\\\",\\\"RefreshSwitchId\\\":\\\"85\\\",\\\"IndexVariableId\\\":\\\"0\\\",\\\"RememberIndex\\\":\\\"false\\\",\\\"ItemVariableId\\\":\\\"0\\\",\\\"Cancelable\\\":\\\"true\\\",\\\"PopCancel\\\":\\\"true\\\",\\\"ActorChangeable\\\":\\\"false\\\",\\\"HiddenNoFocus\\\":\\\"false\\\",\\\"MaskingText\\\":\\\"\\\",\\\"okSound\\\":\\\"\\\",\\\"cursorOverContents\\\":\\\"false\\\",\\\"noItemBackground\\\":\\\"false\\\",\\\"textColor\\\":\\\"0\\\"}\",\"{\\\"Id\\\":\\\"State_list\\\",\\\"x\\\":\\\"400\\\",\\\"RelativeWindowIdX\\\":\\\"\\\",\\\"y\\\":\\\"0\\\",\\\"RelativeWindowIdY\\\":\\\"\\\",\\\"width\\\":\\\"624\\\",\\\"height\\\":\\\"70\\\",\\\"ColumnNumber\\\":\\\"1\\\",\\\"RowNumber\\\":\\\"0\\\",\\\"Rotation\\\":\\\"0\\\",\\\"ItemHeight\\\":\\\"0\\\",\\\"CommandList\\\":\\\"\\\",\\\"DataScript\\\":\\\"\\\",\\\"ListWindowId\\\":\\\"\\\",\\\"ListScript\\\":\\\"[this._actor]; // メインメニューで選択したアクター\\\",\\\"FilterScript\\\":\\\"\\\",\\\"MappingScript\\\":\\\"\\\",\\\"ItemDrawScript\\\":\\\"[\\\\\\\"this.drawActorIcons(item, r.x, r.y,600); // アクターのステートアイコン\\\\\\\"]\\\",\\\"IsEnableScript\\\":\\\"\\\",\\\"CommonHelpText\\\":\\\"\\\",\\\"DecisionEvent\\\":\\\"{}\\\",\\\"CancelEvent\\\":\\\"{}\\\",\\\"CursorEvent\\\":\\\"{}\\\",\\\"ButtonEvent\\\":\\\"[]\\\",\\\"FontSize\\\":\\\"0\\\",\\\"FontFace\\\":\\\"\\\",\\\"OverlapOther\\\":\\\"false\\\",\\\"WindowSkin\\\":\\\"\\\",\\\"VisibleSwitchId\\\":\\\"0\\\",\\\"ShowOpenAnimation\\\":\\\"true\\\",\\\"RefreshSwitchId\\\":\\\"85\\\",\\\"IndexVariableId\\\":\\\"0\\\",\\\"RememberIndex\\\":\\\"false\\\",\\\"ItemVariableId\\\":\\\"0\\\",\\\"Cancelable\\\":\\\"true\\\",\\\"PopCancel\\\":\\\"true\\\",\\\"ActorChangeable\\\":\\\"false\\\",\\\"HiddenNoFocus\\\":\\\"false\\\",\\\"MaskingText\\\":\\\"\\\",\\\"okSound\\\":\\\"\\\",\\\"cursorOverContents\\\":\\\"false\\\",\\\"noItemBackground\\\":\\\"false\\\",\\\"textColor\\\":\\\"0\\\"}\",\"{\\\"Id\\\":\\\"state_window\\\",\\\"x\\\":\\\"0\\\",\\\"RelativeWindowIdX\\\":\\\"\\\",\\\"y\\\":\\\"70\\\",\\\"RelativeWindowIdY\\\":\\\"\\\",\\\"width\\\":\\\"400\\\",\\\"height\\\":\\\"230\\\",\\\"ColumnNumber\\\":\\\"1\\\",\\\"RowNumber\\\":\\\"0\\\",\\\"Rotation\\\":\\\"0\\\",\\\"ItemHeight\\\":\\\"0\\\",\\\"CommandList\\\":\\\"\\\",\\\"DataScript\\\":\\\"\\\",\\\"ListWindowId\\\":\\\"\\\",\\\"ListScript\\\":\\\"$gameParty.members()[$gameVariables.value(38)-1]._states ;\\\",\\\"FilterScript\\\":\\\"\\\",\\\"MappingScript\\\":\\\"(\\\\\\\"\\\\\\\\\\\\\\\\I[\\\\\\\" + $dataStates[item].iconIndex + \\\\\\\"]\\\\\\\") + $dataStates[item].name;\\\",\\\"ItemDrawScript\\\":\\\"[]\\\",\\\"IsEnableScript\\\":\\\"\\\",\\\"CommonHelpText\\\":\\\"現在かかっているステータス異常です。\\\",\\\"DecisionEvent\\\":\\\"{}\\\",\\\"CancelEvent\\\":\\\"{}\\\",\\\"CursorEvent\\\":\\\"{\\\\\\\"CommandId\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"FocusWindowId\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"FocusWindowIndex\\\\\\\":\\\\\\\"-1\\\\\\\",\\\\\\\"Script\\\\\\\":\\\\\\\"$gameSwitches.setValue(84,true)\\\\\\\",\\\\\\\"SwitchId\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"Deselect\\\\\\\":\\\\\\\"false\\\\\\\"}\\\",\\\"ButtonEvent\\\":\\\"[]\\\",\\\"FontSize\\\":\\\"0\\\",\\\"FontFace\\\":\\\"\\\",\\\"OverlapOther\\\":\\\"false\\\",\\\"WindowSkin\\\":\\\"\\\",\\\"VisibleSwitchId\\\":\\\"0\\\",\\\"ShowOpenAnimation\\\":\\\"true\\\",\\\"RefreshSwitchId\\\":\\\"85\\\",\\\"IndexVariableId\\\":\\\"37\\\",\\\"RememberIndex\\\":\\\"false\\\",\\\"ItemVariableId\\\":\\\"0\\\",\\\"Cancelable\\\":\\\"true\\\",\\\"PopCancel\\\":\\\"true\\\",\\\"ActorChangeable\\\":\\\"false\\\",\\\"HiddenNoFocus\\\":\\\"false\\\",\\\"MaskingText\\\":\\\"\\\",\\\"okSound\\\":\\\"\\\",\\\"cursorOverContents\\\":\\\"false\\\",\\\"noItemBackground\\\":\\\"false\\\",\\\"textColor\\\":\\\"0\\\"}\",\"{\\\"Id\\\":\\\"state_help\\\",\\\"x\\\":\\\"0\\\",\\\"RelativeWindowIdX\\\":\\\"\\\",\\\"y\\\":\\\"300\\\",\\\"RelativeWindowIdY\\\":\\\"\\\",\\\"width\\\":\\\"400\\\",\\\"height\\\":\\\"170\\\",\\\"ColumnNumber\\\":\\\"1\\\",\\\"RowNumber\\\":\\\"0\\\",\\\"Rotation\\\":\\\"0\\\",\\\"ItemHeight\\\":\\\"140\\\",\\\"CommandList\\\":\\\"[]\\\",\\\"DataScript\\\":\\\"\\\",\\\"ListWindowId\\\":\\\"\\\",\\\"ListScript\\\":\\\"$dataStates[$gameParty.members()[$gameVariables.value(38)-1]._states[$gameVariables.value(37)]]?.meta?.help;\\\",\\\"FilterScript\\\":\\\"\\\",\\\"MappingScript\\\":\\\"\\\",\\\"ItemDrawScript\\\":\\\"\\\",\\\"IsEnableScript\\\":\\\"\\\",\\\"CommonHelpText\\\":\\\"\\\",\\\"DecisionEvent\\\":\\\"{}\\\",\\\"CancelEvent\\\":\\\"{}\\\",\\\"CursorEvent\\\":\\\"{}\\\",\\\"ButtonEvent\\\":\\\"[]\\\",\\\"FontSize\\\":\\\"0\\\",\\\"FontFace\\\":\\\"\\\",\\\"OverlapOther\\\":\\\"false\\\",\\\"WindowSkin\\\":\\\"\\\",\\\"VisibleSwitchId\\\":\\\"0\\\",\\\"ShowOpenAnimation\\\":\\\"true\\\",\\\"RefreshSwitchId\\\":\\\"84\\\",\\\"IndexVariableId\\\":\\\"\\\",\\\"RememberIndex\\\":\\\"false\\\",\\\"ItemVariableId\\\":\\\"0\\\",\\\"Cancelable\\\":\\\"true\\\",\\\"PopCancel\\\":\\\"true\\\",\\\"ActorChangeable\\\":\\\"false\\\",\\\"HiddenNoFocus\\\":\\\"false\\\",\\\"MaskingText\\\":\\\"\\\",\\\"okSound\\\":\\\"\\\",\\\"cursorOverContents\\\":\\\"false\\\",\\\"noItemBackground\\\":\\\"false\\\",\\\"textColor\\\":\\\"0\\\"}\"]","PicturePriority":"0","Panorama":"","UsePageButtons":"false","SnapNoFilter":"false"}


ステートのメモ欄に説明を設定

各ステートのメモ欄に、メタデータという形で表示させたい説明文を記入しよう。

右下のメモ欄
<help:ここに表示させたい文字を記入>

<help:>という形で記入すれば勝手に読み込むようになっている。
helpが嫌なら㉕で指定している「help」を書き換えれば好きな名前にできます。


説明が改行しないんだけど?

なんで?
よくわからないけどDarkPlasma様作成の改行プラグインを入れたら改行してくれました。
先人の知恵に感謝……!

※注:DarkPlasma様改行プラグインは、そのままだとTextPictureプラグインと競合するので、改行無効ウィンドウにWindow_Baseを入れておきましょう。

いろいろプラグインも入れてるので、もしかしたら上手く動かない所もあるかも。
誰かの何かの参考になれば嬉しいです。

……私の願いは、オリジナルステータス異常があってもそのアイコンがなんなのかがゲーム内ですぐわかるゲームが一つでも多くなって欲しいということです……。


めっちゃ参考にしたサイト・ページ

神シリーズ

神資料

その他たくさんの資料・ツクマテなど……感謝……。

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