開発日誌

すべての記事

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 戦闘終了時に特殊処理

2020-11-28 02:35:06

ボス戦の後、そのまま暗転して感動的なイベントに移行したいとします。

RPGツクールの標準仕様だと、戦闘終了後にすぐ「画面のフェードアウト」を実行しても、戦闘が終わってマップ画面に戻った際に、一瞬ですが戦闘前の画面が表示されてしまいます。

また、戦闘終了後はBGMを変えたいと思っても、経験値やお金の獲得やレベルアップのメッセージなどが表示されているうちに、戦闘前のマップBGMが流れ出してしまうため、感動が薄れてしまいます。戦闘開始前にBGMをなしにすれば、戦闘終了時にBGMは流れなくなりますが、戦闘に負けた場合は通常通りマップBGMで始めたかったりします。

戦闘終了後にスイッチを操作して、キャラの配置などを変えたい場合は、戦闘中にスイッチを操作しておけば、スイッチの状態が反映されてマップに戻れますが、勝利時のみスイッチをONにしたい場合は、それも上手くいきません。

というわけで、戦闘終了後に直ちにフェードアウトさせたり、BGM/BGSを継続させずに停止したり、勝利時・敗北時など条件によってスイッチをONにできるプラグインを作成しました。

プラグインコマンドで実装したので、RPGツクールMZ用となっています。

バトルイベント内に、プラグインコマンドで指定するようになっています。

効果を発動させたい敵グループで、0ターン目(戦闘開始時)のバトルイベントに設定すればよいでしょう。

以下の項目が設定可能です。

  • 勝利時・逃亡時・中断時・敗北時それぞれでONにするスイッチ番号
  • 戦闘終了後ただちにフェードアウト
  • 戦闘終了後、BGMを停止
  • 戦闘終了後、BGSを停止

フェードアウト、BGM/BGSの停止は、勝利時・逃亡時(中断時も含む)・敗北時、どのケースで発動させるかも設定可能です。例えば、戦闘に勝利時と敗北時はフェードアウトさせて、逃亡時はそのまま、といった設定が可能です。

このプラグインを組み込むと、こんな感じになります。

使用前は、レベルアップのメッセージを処理している間に元のBGMが流れてしまいますし、イベントが始まる前に一瞬だけ元のマップが表示されてしまうため、美しくありません。プラグインコマンドを入れた後は、BGMが停止し、フェードアウトした状態でスムースにイベントに移行しています。

質問やアドバイスなどはコメント欄まで、お気軽にお願いします。素材利用条件などについては、このサイトについての「提供素材について」の項目などをご覧ください。

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] バフ・デバフの効果を個別に設定

2020-11-22 22:58:21

攻撃力や防御力を強化・弱体化する、いわゆるバフ・デバフの仕組みは、RPGツクールVX Aceから改良され、2段階までの重ねがけが可能になりました。VXまではステートでバフ・デバフを実現する仕組みだったので、相殺は標準機能でできましたが、重ねがけは困難でした。VX Ace以降のバフ・デバフの仕組みは、重ねがけをしたいという要望に応えたものとなっています。

しかしその反面、VXまでは強化・弱体化される倍率が自由に設定できましたが、VX Ace以降は1段階につき25%とスクリプト内で指定されてしまっているため、倍率を変更したい場合はスクリプトの改造やプラグインの導入が必要となりました。1カ所数字を変えるだけなので、スクリプトの改造としては非常に簡単な部類ではありますが、自由度が下がったのは事実です。

とにかくVX Ace以降、デフォルトでは1段階につき25%、すなわち1段階強化なら1.25倍、2段階強化で1.5倍になり、逆に1段階弱体なら0.75倍、2段階弱体で0.5倍(半分)となります。

しかし、攻撃力ならこのくらいの変動でちょうど良さそうに思いますが、敏捷性や運がこのくらいの変動幅だと、ほとんど効果が感じられないように思います。かといって変動幅を50%にすると、2段階強化で2倍になりますが、攻撃力も同じ強化幅になってしまうため強すぎる感もあります。また弱体の場合は2段階弱体で0になってしまうため、それはそれで都合が悪いです。

というわけで、バフ・デバフの倍率を、能力値および強化か弱体かでそれぞれ個別に設定できるプラグインを作成しました。RPGツクールMVとRPGツクールMZの両方に対応しています。

能力値8個×強弱2種で計16個を設定する必要があるため、ややパラメーターの数は多いですが、使わないものはデフォルトの0.25のままで構いません。弱体倍率の方は0.5以上にすると、2段階弱体の際に0以下になってしまうため、ご注意ください。

また、強化・弱体がそれぞれ2段階ずつというのは変わりません。3段階以上にしたいなどの場合は、他のより柔軟な設定が可能なプラグインがあるようなので、そちらをご利用ください。個人的には、3段階とかあっても戦闘のテンポが悪くなるだけの気がしていて、せいぜい2段階までが有効に使える範囲かなと思います。アイコンも2段階までですし。

質問やアドバイスなどはコメント欄まで、お気軽にお願いします。素材利用条件などについては、このサイトについての「提供素材について」の項目などをご覧ください。

[ テクニック ] プラグインなしでムチ攻撃・改

2020-11-21 00:07:58

昨日の記事「プラグインなしでムチ攻撃」の改良版です。

主にダメージ計算式の書き方を工夫して、昨日のものよりもずっとシンプルにしました。

具体的には以下の通り。記述量が最初の半分くらいになりました。

v[1] || (v[1] = 1);
d = (a.atk * 4 - b.def * 2) * v[1];
v[1] = v[1] * 0.67;
d;

例によって行を分割していますが、実際には1行で記述します。

変更点のキモとしては、1行目。

v[n]の記述だと、n番の変数が初期化されていない場合にエラーというか未定義値になるため、式の結果も未定義値となってダメージが0になってしまう問題があり、戦闘テスト時に不都合がありました。

そこで1行目で、v[1]が未定義値ならば、||(or)の後で1番の変数に初期値を代入するようにしています。これで、いちいち$gameVariables.valueを使わなくても、戦闘テストで正常に動作するようになりました。(今回は変数の値が仕組み上0にはならないため、このように書いています)

また、ダメージ計算式の中では、単純にv$gameVariables._dataに置き換えられるだけのようなので、わざわざ$gameVariables.setValueを用いなくとも、v[n] = xで変数に値を代入することができました。これはシンプル!

さらに、$gameVariables.setValueを用いないので、変数に整数しか入れられないという制約もありません。直接小数を扱えるので、わざわざ○○ / 100をする必要はなくなりました。

そして最後に、変数が未定義の場合に0扱いではなく任意の値を代入できるようになったので、初期値を1とすることが可能です。したがって、わざわざ100 - ○○とか複雑な計算式を書く必要がなくなり、ダメージ量が67%ずつ減衰していくのが直感的に分かりやすい記述になりました。

この場合、変数名は減衰率というよりダメージ率とでもなりますかね。

まとめるとこうなります。

まずは、ダメージ率を保持する変数を用意し、その変数を1にリセットするだけのコモンイベントを作成します。

次に、ムチ攻撃用のスキルを、1番の通常攻撃をコピーして作ります。

範囲は敵全体、使用効果に先ほどのダメージ率リセットのコモンイベントを指定、そしてダメージ計算式に以下を記述します。

v[1] || (v[1] = 1); d = (a.atk * 4 - b.def * 2) * v[1]; v[1] = v[1] * 0.67; d;

v[1]の部分は実際のダメージ率の変数番号を指定してください。

そして最後に武器の特徴で、「攻撃スキル」にムチ攻撃用のスキルを指定すればOKです。

以上で、ドラクエの鞭のように全体攻撃かつダメージが減衰していく武器をプラグインなしで、昨日よりもシンプルに実現できました。

動画は昨日のものと同じですが。

ダメージ計算式の部分には実質的にスクリプトを埋め込めるので、これ以上に複雑な処理もさせることができます。

また式の中でathis.subject()に、btargetに、それぞれ単純に置き換えられて展開されるので、ヘルプにあるようなa.atkとか以外にも、Game_Battlerが持っているプロパティーやメソッドなら何でも使えるようです。

例えば瀕死の状態だと通常の10倍のダメージを与えられるスキルであれば、

(a.atk * 4 - b.def * 2) * (a.isDying() ? 10 : 1)

とすればOKです。

最後にダメージ量または回復量を評価する必要があるとか、戦闘テスト時は変数が未定義状態だとか、いくつかクセはありますが、それさえ気を付ければ、ループ処理やウィンドウ操作なども含んだかなり複雑な処理を組み込むことが可能です。もっともあまり複雑すぎると、プラグインでやった方がいいじゃん、という話にもなりますが……。

[ テクニック ] プラグインなしでムチ攻撃

2020-11-20 04:11:21

ドラクエの武器で鞭やブーメランは、敵グループや全体攻撃ができますが、フルダメージが出るのは1体目の敵だけで、2体目以降は徐々にダメージが減衰していきます。

これをRPGツクールMZで実現しました。

プラグインじゃないとダメかなと思っていましたが、デフォルト機能の範囲内でできそうだったので、何とかプラグインなしで実装してみました。以下にその手順を記述します。

※追記:
プラグインなしでムチ攻撃・改」でよりシンプルな式に改良しています。そちらもご参照ください。

まずは、ダメージ減衰率を保持する変数を用意し、その変数をリセットするだけのコモンイベントを作成します。

次に、ムチ攻撃用のスキルを作成します。

1番の通常攻撃をコピーして作るのが楽だと思います。範囲は敵全体、使用効果に先ほどの減衰率をリセットするコモンイベントを指定します。

そしてここがキモですが、ダメージの計算式を以下のようにします。

d = (a.atk * 4 - b.def * 2) * ((100 - $gameVariables.value(1)) / 100);
$gameVariables.setValue(1, (100 - (100 - $gameVariables.value(1)) * 0.67));
d;

説明の都合上、3行に分けていますが、実際には続けて1行で書いてください。

まず1行目。デフォルトの通常攻撃ダメージ(a.atk * 4 - b.def * 2)に、ダメージ減衰率(1番の変数の値)をもとにした値((100 - $gameVariables.value(1)) / 100)を掛けて、変数dに代入しています。なお、変数の番号は、ダメージ減衰率に使った変数番号に合わせてください。

掛けている値がダメージの威力を表しており、最初は減衰率が0なので威力は100%、減衰率が30%のときは威力が逆の70%となります。

次に2行目で減衰率を更新します。現在の減衰率から次の減衰率を計算して、減衰率の変数に値をセットしています。ちょっと式が複雑ですが、威力が直前の67%になるようにしています。すなわち与えるダメージが、100%→67%→45%→31%……と徐々に減っていきます。0.67の部分を変更すれば減り方を調整することができます。

ダメージ計算式では最後に評価された式の値が採用されるので、最後にdを評価してやることで、初めに計算したダメージが返されます。これをしないと、減衰率の更新は何も値が返されないため、ダメージが0になってしまいます。

ダメージ計算式では、v[n]と記述することでn番の変数の値が使えます。なので上記の式で、$gameVariables.value(1)となっている2カ所の記述は、v[1]と置き換えることが可能です。

ですが、この記述法は、該当の変数が定義されていないとエラーを返すようで、結果としてダメージが0になってしまいます。通常のゲーム中であれば、一番最初に変数を初期化してやればいいのですが、戦闘テストの場合は全ての変数が未定義状態で始まるため、戦闘イベントで開始時に変数を初期化してやる必要がありますが、全ての敵グループにそれを仕込むのも面倒です。$gameVariables.value(n)であれば、未定義なら0が返ってくるので、戦闘テストでも問題なく使えます。うーん、こうするしかないのかな……。

変数の方も、減衰率ではなく威力にして、リセット時に0でなく100を代入するようにしてやれば、いちいちダメージ計算式で100 - ○○とかしなくて済むのですが、やはり戦闘テスト時の都合で面倒な式に。攻撃発動前に起動するコモンイベントとかが作れればいいのですけど。

ともかく、以上でスキルの設定ができました。

最後に、実際の武器を作成すれば完了です。

武器の特徴で、「攻撃スキル」に先ほど作成したスキルを指定すればOKです。

RPGツクールMZから新たに追加された機能の、「攻撃スキル」を利用しています。通常攻撃の代わりに特定のスキルを発動させられる機能で、数少ないMZの新機能の割に、これといった使い道が思い浮かばなかったのですが、全体攻撃とか特殊なダメージ計算とかを簡単に適用させられるので、工夫次第でいろいろできそうな気がします。

以上で、ドラクエの鞭のように、全体攻撃の代わりにダメージが減衰していく武器を、プラグインなしで作ることができました。まあ、ダメージ計算式のあたりはプラグイン&スクリプトの知識を必要としますが、デフォルトの機能で作れば競合とかを意識しないで済むので楽ですね。

いい感じで反映されています。

[ ゲームリリース情報 ] [ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] イベントスキップを実装した

2020-11-02 21:08:18

ミニゲーム『夫婦戦争MZ(まさに絶体絶命)』を少しバージョンアップしました。

進行のテンポを改善してほしいというフィードバックをいただいたので、一部のウェイトを短縮してみたほか、一度見たバッドエンドは次回から飛ばせるように、イベントスキップの機能を取り入れました。

イベントスキップ機能については、そもそも飛ばしたくなるような長いイベントを作るなというのと、飛ばしてもストーリーが成立するような無意味なイベントを作るなという理由で、個人的には不要派です。

実際、『天下御免!からくり屋敷』では、ボス戦前の会話イベントなど、そもそもそんなに長くはしていませんが、2回目に戦う時は前半を飛ばして最後の2〜3台詞ですぐに戦闘に入れるようにしています。

しかし、この『夫婦戦争MZ(まさに絶体絶命)』は周回前提のゲームなので、何度も同じエンディングを見るのは、たとえ数秒程度とは言え時間のロスになるのは確かです。

というわけで、一度見たバッドエンドは↑キーを押せばスキップできるようにしてみました。

本音を言うと、何も考えずにスキップするのではなくて、今回手に入れたアイテムでどのエンディングになったのか、よく考えながら戦略を練ってほしいというのはありますが……。

いくつかイベントスキップのプラグインは探してみたのですが、多機能すぎたり、いまいち使い方がよく分からなかったりしたので、結局自分で作ってしまいました。

プラグインだけでイベントスキップを実現しているのではなく、並列処理イベントと連携して動かす前提になっているので、機能はシンプルですが実装は難しいかもしれません。

スキップさせたいイベントの実行中に、特定のスイッチをONにします。そのスイッチに連動して起動する並列処理イベントを作成し、スキップ時に押すキー(ここでは↑キー)が押されていたら、プラグインコマンドで「実行中イベントのスキップ」を実行します。これでイベントスキップが実現できます。

プラグインコマンドの「実行中イベントのスキップ」は、現在メインで実行しているイベントを、指定したラベルの位置までスキップさせる機能です。ラベルが指定されていなければ最後までスキップされます。もちろん呼び出し元の並列処理イベントはスキップされません。

イベントからコモンイベントを呼び出して……みたいな入れ子状態になっている場合は未対応です。「文章の表示」中であれば直ちにメッセージウィンドウを閉じてスキップしますが、それ以外のイベントコマンド、例えば選択肢の表示や移動ルートの設定などは、そのコマンドが完了してからスキップされます。

なので汎用性は非常に低いと思いますが、会話だけのイベントを飛ばすといった限定的な使い方であれば、これで十分です。