パーティ編成プラグインWD_PartyChangeの使い方とカスタマイズ方法では、パーティ編成ができるプラグイン「WD_PartyChange」を紹介しました。
デフォルトのレイアウト用ファイルの値をいじるだけでも表示項目を変更できますが、内部の処理に手を加えることでもっと自分好みに表示をかえることができます。
この記事では、WD_PartyChangeのパーティ編成画面(プラグインコマンドPartyChange openで呼びだせる画面)のカスタマイズを対象にしています。
カスタマイズ内容はほぼ個人の好みによるものなのでお好きなところだけ導入してください。
わたしが勝手に作ったものなので、このカスタマイズをした結果出たエラーはプラグイン製作者(いずみ様)には問い合わせないでください。
修正前の準備
別のプラグインからWD_PartyChangeを参照できるようにする
WD_PartyChange本体を直接更新するのではなく、カスタマイズ用のプラグインを別に作ってプラグインの処理をオーバーライド(上書き)するようにします。
こうしておくと、プラグイン本体の更新があっても別プラグインで変更した部分は残るので、設定しなおす項目が最小限ですみます。
デフォルトだと、別のプラグインからWD_PartyChangeのオブジェクトが参照できないようになっているのでWD_PartyChange.jsを編集します。
この作業は、WD_PartyChange.jsを更新するたびにやる必要があります。
以下の部分を(function() { の上に移動します。
パーティ編成画面をメニュー画面から呼び出せるようにするカスタマイズをしている場合、Scene_PartyChangeはすでに移動済みなので飛ばしてOKです。
function Scene_PartyChange() { this.initialize.apply(this, arguments); }
function Window_PartyChangeBase() { this.initialize.apply(this, arguments); }
function Window_PartyChangeFront() { this.initialize.apply(this, arguments); }
function Window_PartyChangeBack() { this.initialize.apply(this, arguments); }
function Window_PartyChangeStatus() { this.initialize.apply(this, arguments); }
カスタマイズ用プラグインファイルを作る
カスタマイズ用のプラグインファイルを作ります。
ファイル名はWD_PartyChange_Custom.jsとしました。
作ったファイルに以下を記入します。
(function(){ 'use strict'; // 以下にカスタマイズ用コードを貼りつけ })();
このファイルをカスタマイズ用ファイルと呼ぶことにします。
つぎから紹介するカスタマイズ用のコードは、この修正用ファイル の// 以下にカスタマイズ用コードを貼りつけ の下に追加してください。
パーティリストのカスタマイズ
「パーティに追加」を表示する
デフォルトではパーティリストの1番下にある空白行にカーソルをあわせて決定すると、メンバーリストからアクターを追加できます。
ツクールMVのデフォルトの装備画面もそうなのですが、この「なにも書かれていない空白の行にカーソルをあわせる」というのが少しわかりづらいんじゃないかな? と思いました。
この空白行に「パーティに追加」という文字を入れて、表示をわかりやすくするカスタマイズです。
// パーティに追加を表示 var addCommandName = 'パーティに追加'; var _Window_PartyChangeFront_drawItem = Window_PartyChangeFront.prototype.drawItem; Window_PartyChangeFront.prototype.drawItem = function(index) { var iconAddId = 73; _Window_PartyChangeFront_drawItem.apply(this, arguments); if(this._list[index] == null){ var rect = this.itemRect(index); this.changePaintOpacity(this._listEnabled[index]); this.drawIcon(iconAddId, rect.x + 5, rect.y); this.drawText(addCommandName, rect.x + Window_Base._iconWidth + wd_front_charaview_x, rect.y, rect.width); } };
パーティがいっぱいの時にパーティに入れるコマンドをグレーで表示
デフォルトではパーティ人数がいっぱいの時は、パーティに入れるコマンドが表示されなくなります。
パーティ人数がいっぱいでも、グレーで表示させるようにします。
このカスタマイズをつかうには、WD_PartyChange.jsも変更する必要があります。
WD_partyChangeの以下の部分を、修正前の準備でやったように(function() {の上に移動します。
//パーティメンバーの最大数 var wd_party_max = 8;
次に、こちらのコードをカスタマイズ用ファイルに貼り付けます。
// パーティ人数がいっぱいでもパーティに追加コマンドを表示する var _Window_PartyChangeFront_refresh = Window_PartyChangeFront.prototype.refresh; Window_PartyChangeFront.prototype.refresh = function() { _Window_PartyChangeFront_refresh.apply(this); if($gameParty.members().length >= wd_party_max){ this._list.push(null); this._listEnabled.push(false); } this.createContents(); this.drawAllItems(); };
レイアウト1の選択リストで歩行グラフィックの顔だけを表示する
歩行グラフィックの表示自体はレイアウトファイルの wd_front_charaview をtrueにすることでできます。
しかしレイアウト1で歩行グラフィックを表示すると、歩行グラフィックが行の高さ(デフォルトは36)より高いため、重なってしまいます。
歩行グラフィックの顔だけを表示し、行の高さにおさめるカスタマイズです。
※歩行グラフィックのサイズはRTPの48×48のキャラクターを想定しています。
// 歩行グラフィックの顔だけ表示 Window_PartyChangeBase.prototype.drawCharacter = function(characterName, characterIndex, x, y) { var bitmap = ImageManager.loadCharacter(characterName); var column = 12; var row = 8; var pw = bitmap.width / column; var ph = bitmap.height / row; var n = characterIndex; var sx = (n % 4 * 3 + 1) * pw; var sy = (Math.floor(n / 4) * 4) * ph; var margine = 2; this.contents.blt(bitmap, sx, sy , pw, wd_front_rect_height - (margine * 2), x - pw / 2, y - wd_front_rect_height + margine); };
また、画像のサイズが変わるのでレイアウトファイルのwd_front_charaview_yを行の高さと同じにします。
wd_front_charaview_y = 36;
メンバーリストのカスタマイズ
「パーティからはずす」を表示
メンバーをいれかえるとき、メンバーリストの1番下にある空白行を選ぶとメンバーをはずせます。
文字を表示した方がわかりやすいので、パーティからはずすを表示します。
// パーティからはずすを表示 var removeCommandName = 'パーティからはずす'; var _Window_PartyChangeBack_drawItem = Window_PartyChangeBack.prototype.drawItem; Window_PartyChangeBack.prototype.drawItem = function(index) { var iconRemoveId = 74; _Window_PartyChangeBack_drawItem.call(this, index); if(this._list[index] == null){ var rect = this.itemRect(index); this.changePaintOpacity(this._listEnabled[index]); this.drawIcon(iconRemoveId, rect.x + 5, rect.y); this.drawText(removeCommandName, rect.x + Window_Base._iconWidth + wd_front_charaview_x, rect.y, rect.width, 'left'); } };
パーティメンバーはメンバーリストに表示しない
デフォルトでは、すでにパーティメンバーにいるアクターは、メンバーリストでグレーで表示されます。
どうせ選べないんだったら、非表示にしてもいいのでは? と思ったので変更してみました。
var _Window_PartyChangeBack_refresh = Window_PartyChangeBack.prototype.refresh; Window_PartyChangeBack.prototype.refresh = function() { _Window_PartyChangeBack_refresh.call(this); // パーティに参加しているメンバーを非表示 for(var i = this._list.length - 1; i >= 0; i-- ){ if(isPartyMember(this._list[i])){ this._list.splice(i, 1); this._listEnabled.splice(i, 1); } } this.createContents(); this.drawAllItems(); }; // パーティに入っているか function isPartyMember(actor){ for(var i = 0; i < $gameParty.members().length;i++ ){ if(actor === $gameParty.members()[i]){ return true; } } return false; }
メンバーが1人の時にパーティからはずすコマンドをグレーで表示
メンバーが1人の時はパーティからはずすコマンドが非表示になります。
パーティ人数が1人の時に非表示ではなくグレーアウトで表示するようにします。
このカスタマイズは、前述の「すでにパーティにいる人はメンバーリストに表示しない」と同じ処理を更新します。
導入している場合は、以下のコードを this.createContents(); の上に貼り付けます。
// メンバーが1人の時にパーティからはずすコマンドをグレーで表示 if($gameParty.members().length === 1){ this._list.push(null); this._listEnabled.push(false); }
「すでにパーティにいる人はメンバーリストに表示しないを導入していない場合は、以下のコードを使います。
var _Window_PartyChangeBack_refresh = Window_PartyChangeBack.prototype.refresh; Window_PartyChangeBack.prototype.refresh = function() { _Window_PartyChangeBack_refresh.call(this); // メンバーが1人の時にパーティからはずすコマンドをグレーで表示 if($gameParty.members().length === 1){ this._list.push(null); this._listEnabled.push(false); } this.createContents(); this.drawAllItems(); };
非アクティブの場合はカーソルを消す
デフォルトではパーティリストとメンバーリストのカーソルが同時に表示されます。
カーソルが2つあるとまぎらわしいので、メンバーリストのカーソルをパーティリストで決定した時のみ表示するようにします。
//メンバーリストのカーソルをアクティブ時のみ表示 var _Window_PartyChangeBack_initialize = Window_PartyChangeBack.prototype.initialize; Window_PartyChangeBack.prototype.initialize = function(mode) { _Window_PartyChangeBack_initialize.call(this, mode); this.deselect(); }; var _Scene_PartyChange_frontOk = Scene_PartyChange.prototype.frontOk; Scene_PartyChange.prototype.frontOk = function() { _Scene_PartyChange_frontOk.call(this); this._backWindow.select(0); }; var _Scene_PartyChange_backOk = Scene_PartyChange.prototype.backOk; Scene_PartyChange.prototype.backOk = function() { _Scene_PartyChange_backOk.call(this); this._backWindow.deselect(); var _Scene_PartyChange_backCancel = Scene_PartyChange.prototype.backCancel; Scene_PartyChange.prototype.backCancel = function() { _Scene_PartyChange_backCancel.call(this); this._backWindow.deselect(); }; };
ステータスウィンドウのカスタマイズ
装備部位を表示する
パーティ編成画面のステータスウィンドウに装備部位を表示します。
Window_PartyChangeStatus.prototype.drawActorEquipments = function(actor, x, y) { var slotNameWidth = 100; var equips = actor.equips(); var count = Math.min(equips.length, 6); for (var i = 0; i < count; i++) { this.changeTextColor(this.systemColor()); this.drawText(getSlotName(actor.equipSlots()[i]), x, y + this.lineHeight() * i, slotNameWidth); this.resetTextColor(); this.drawItemName(equips[i], x + slotNameWidth, y + this.lineHeight() * i); } }; // 装備部位名を取得 function getSlotName(slotId){ return $dataSystem.equipTypes[slotId]; }
なにも装備していないところに-を表示する
装備していない部位が空欄になるので、文字を表示させます。
前述の「装備部位を表示する」と同じ処理を更新するので、導入している場合は以下のコードをthis.drawItemName(equips[i], x + slotNameWidth, y + this.lineHeight() * i);の下に追加します。
var noneEquipments = '-----'; if(equips[i] == null){ this.drawText(noneEquipments, x + slotNameWidth, y + this.lineHeight() * i, 100); }
「装備部位を表示する」を導入していない場合は、以下のコードを使います。
Window_PartyChangeStatus.prototype.drawActorEquipments = function(actor, x, y) { var noneEquipments = '-----'; var equips = actor.equips(); var count = Math.min(equips.length, 6); for (var i = 0; i < count; i++) { this.drawItemName(equips[i], x , y + this.lineHeight() * i); if(equips[i] == null){ this.drawText(noneEquipments, x, y + this.lineHeight() * i, 100); } } };