一応、前回の調べにて検証が手間だったためスルーしていたMV用プラグインもあります。Victor Sant様の「VE - Dual Wield」です。
海外のフォーラムに飛びます
利用規約
二刀流をカスタマイズするプラグインとして、ツクールMVではムノクラ様による翻訳版も再配布されています。
ツクールMV用のためそのままでは利用できませんが、意外と軽微な修正で動いたのでこちらもご提案いたします。なお、影響範囲は不明であるため、予期せぬ不具合があるかもしれません。
検証環境は以下になります。
RPGツクールMZ v1.8.1
RPGツクールMV コアスクリプト v.1.6.2
VE_BasicModule.js v1.23(前提プラグイン。こちらの修正は必要ありません)
VE_DualWield.js v1.04
・アクターにスロットタイプ「二刀流」のみ設定
導入にあたって改変が必須となるため、任意のテキストエディタをご用意ください。Javascriptファイル(拡張子「.js」)の編集ができるものだと捗ります(メモ帳でも可。その場合は「.txt」で編集してから拡張子を変更します)。
初めに導入するプラグイン2種にアノテーションを追加します。ファイル内に「/*」から始まるコメントがありますので「@plugindesc ...」の上あたりに「@target MZ」を追加してください。以下のコードは「VE_BasicModule.js」にアノテーションを追加した例です。
コード:
/*:
* ==============================================================================
* @target MZ
* @plugindesc v1.23 - Plugin with base code required for all Victor Engine plugins.
* @author Victor Sant
*
このアノテーションの追加はツクールMZのプラグインリスト内で警告文を表示させないために行うので機能上は必須ではありませんが、まあ気になると思うので推奨いたします
次に、このままではゲーム内でエラーが発生するため「VE_DualWield.js」の390行あたりにある「(function() {」より下に追加のコードを書き込みます。
コード:
// RPG Maker MZ v.1.8.1 rmmz_sprites.js
Sprite_Battler.prototype.mainSprite = function() {
return this;
};
コード:
// RPG Maker MV v.1.6.2 rpg_windows.js
Window_Base.prototype.textPadding = function() {
return 6;
};
コード:
// RPG Maker MV v.1.6.2 rpg_windows.js
Window_Selectable.prototype.itemRectForText = function(index) {
var rect = this.itemRect(index);
rect.x += this.textPadding();
rect.width -= this.textPadding() * 2;
return rect;
};
主にツクールMVでは存在するもののツクールMZには存在しない関数の追加です。「Sprite_Battler.prototype.mainSprite」についてはツクールMZの同関数と同じ名前の関数が「VE_BasicModule.js」内に存在したため、「VE_DualWield.js」で再度上書きしてツクールMZと同じ処理にします。
今回の検証ではこれでwhitykoala様のご要望である「①右手と左手それぞれに、攻撃力を設定できるようにする」「②①を受けて、右手と左手の武器で、別々に攻撃できるようにする」という点については実装できました。
ただし「VE_DualWield.js」には特殊な仕様があり、このプラグインによって「二刀流」の特徴を持つアクターは「右手→左手」の順に攻撃を行うのですが、右手の攻撃でエネミーを倒した時にそれが最後のエネミーではなかった場合は、倒した敵の座標に左手攻撃を行ってしまいます。まあまあ不自然な挙動ですが、そういう仕様のようです。
そして、この仕様を変更する方法が2つあります。
①右手攻撃でエネミーを倒した時、左手攻撃を実行しない。
②右手で攻撃した後、左手がランダムなエネミーを攻撃する。
順当に行けば①だと思いますが、②もアイデアとして使えなくもなさそうな気がします。ただし今回の検証では両立できません。
というわけで①の仕様にするための変更ですが、まずは「VE_DualWield.js」内の「BattleManager.startAction」を改変します。改変後、以下のようになります。
コード:
// 改変後のコード。
VictorEngine.DualWield.startAction = BattleManager.startAction;
BattleManager.startAction = function() {
// 追加したコード。
this._beforeTroopCount = $gameTroop.aliveMembers().length;
this.setDualWieldAction();
VictorEngine.DualWield.startAction.call(this);
this.setSecondAttack();
};
これはアクターが選択されたコマンドによって行動を開始する処理です。ここに現在のエネミーの数を「this._beforeTroopCount」という新規のプロパティその1に代入する処理を追加しました。
次に、「VE_DualWield.js」内の「BattleManager.endAction」を改変して作業完了です。改変後、以下のようになります。
コード:
// 改変後のコード。
VictorEngine.DualWield.endAction = BattleManager.endAction;
BattleManager.endAction = function() {
// 追加したコード。
this._afterTloopCount = $gameTroop.aliveMembers().length;
if (this._beforeTroopCount == this._afterTloopCount) {
this._isSecondAttack = true;
}
if (this._canFollowUp) {
this.startFollowUpAction();
// 改変したコード。
} else if (this._canSecondAttack && this._isSecondAttack) {
this.startDualWieldAction();
} else {
this._isSecondAttack = false;
this._dualWieldAction = null;
VictorEngine.DualWield.endAction.call(this);
}
};
これはアクターの行動を終了する処理です。「VE_DualWield.js」ではこの段階でプロパティに応じて行動を変化させているようです。
元々は「this._canSecondAttack」プロパティが true の時、「this.startDualWieldAction();」を実行して2回目の攻撃を行っていますが、追加したコードによってここでも現在のエネミーの数を新規のプロパティその2に代入し、追加したプロパティ同士を比較してエネミーの数に変化が無かった時のみ、2回目の攻撃を判別するプロパティを true にして 2回目の攻撃を行うように改変しました。
要するに右手で倒したらそこで行動終了ですよ。左手は添えるだけ。
②の方は簡単な変更です。①の改変を行わず、「VE_DualWield.js」内の「Game_Action.prototype.setDualWieldTargets」を空にします。
コード:
// 空にします。
Game_Action.prototype.setDualWieldTargets = function(targets) {
};
これは2回目の攻撃を行うエネミーを1回目に攻撃したエネミーに指定する処理ですが、空にしたら2回目はランダムな敵を狙うようになりました。こちらは検証の副産物です。
これにて以上となります。これらのプラグインの影響範囲がどこまで及ぶかはわかりませんが、少々の改変で実装はできます。ただ、プラグインが持っている他の機能を活用しようとすると修正範囲も広がりますので注意が必要です。
以下に検証時の動作を示す画像を添付しておきますので、よろしければご検討ください。
①右手と左手で攻撃力が分割されています。どちらも(基礎能力 + 武器攻撃力)です。
②右手攻撃のダメージ(攻撃力20)です。この攻撃に続けて左手攻撃を行います。
③左手攻撃のダメージ(攻撃力519)です。アニメーションは左手武器に設定したものが再生されます。