開発日誌

すべての記事

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

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

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

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

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 必要経験値の計算をVX方式で

2020-10-25 22:34:19

以前、「経験値の仕様に苦悩」という記事で、RPGツクールVX Ace以降の必要経験値の計算方法が、調整しにくいという話をしました。

その後、ちょうど良さげな基本値や増加度を探し求めたり、計算式を微調整していい感じにできないか奮闘してみましたが、なかなか芳しい結果が得られず、結局RPGツクールVXの計算方法を再現するプラグインを作成しました。

MVとMZの両方に対応しています。このプラグインを導入すると、レベルアップに必要な経験値の算出方法が、VXでの方式に変更されます。

具体的には経験値曲線の「基本値」および「増加度A」を用いて、以下の式で計算されます。

M[1] = 基本値
N[2] = 0.75 + 増加度A / 200
M[Lv] = M[Lv-1] * (1 + N[Lv])
N[Lv] = N[Lv-1] * 0.9
累計経験値[Lv] = 累計経験値[Lv-1] + M[Lv-1]

VXのデフォルトである基本値=30、増加度=35の時の累計経験値と、VX Ace以降のデフォルトである基本値=30、補正値=20、増加度A=30、増加度B=30の時の累計経験値とを比較すると、こんな感じになります。

中盤以降の伸び方が全然違いますね。VX Ace以降だと中盤以降の必要経験値量も緩やかにしか増えていかないため、ちょっと戦闘回数が増えただけでどんどんレベルが上がってしまいます。

その一方で、序盤の累計経験値を拡大比較すると、こんな感じです。

レベル10ぐらいまではVX方式の方が必要経験値量は少ないため、序盤はVX Ace以降に比べてレベルが上がりやすくなっています。

VX方式ならば、適正レベルと敵の獲得経験値も調整しやすいのではないでしょうか。

経験値曲線で指定する4つ値のうち、「基本値」と「増加度A」のみが計算に用いられ、「補正値」と「増加度B」は無視されます。

また、経験値曲線のウィンドウで表示される「次のレベルまで」と「累計」の値は、当然VX Ace以降の計算方式で算出されているため、異なります。

なので、必要経験値を計算してくれるエクセルファイルも用意しました。

以前に「必要経験値をExcelで計算」の記事で作成したファイルのVX方式版で、単に必要経験値量を計算してくれるだけでなく、敵1体の獲得経験値の目安も求められるようになっています。

これでバランス調整まわりのプラグインはだいたい揃えられたかな。

ウィンドウの調整とかもしていかないといけないのですが、まあその辺は後からでも十分なので、今はまだ考えないことにしよう。

[ 王国の英雄 ] [ テクニック ] 運の扱いにウンウン悩む

2020-10-20 02:59:45

RPGツクールVXからVX Aceになった際に追加された基本パラメーターで、魔法力と魔法防御については以前記事にしました。結局、魔法の威力のみを高めるスキルや、敵から受ける魔法の威力を軽減のみできる防具などに活用するため、デフォルト通り魔法力と魔法防御を採用することにしました。

さて今回は、もう一つの追加パラメーターである「運」についてのお話。

運の効果はデフォルトでは、自分と相手の運の差1につき、状態異常にかかる確率が0.1%変わるというものです。100の差があってようやく10%ほど変動するので、実際のゲーム中ではほとんど効果が体感できないのではないでしょうか。

パラメーターの数値の桁数にもよりますが、他のパラメーターの値とのバランスも考えると、自分の作品ではだいたい2桁ぐらいの値をとるのが妥当です。

だとするとやはり0.1%の変動では微妙すぎるので、これを0.5%に増やしてみました。こうすると、運の差が100あると50%変動するので、なかなか効果を感じられるのではないでしょうか。

実際には20前後の差に留まることが多いと思われるので、通常状態で10%程度の変動になり、スキル等で運を倍とかにしてやると、変動が30〜40%になるので、状態異常を多発してくる敵に対しては有効な戦術になり得ます。

しかし、せっかくのパラメーターを状態異常の確率だけに使うのはもったいないので、もう少しいろいろなところに運が影響するようにしたいです。

すぐ思いつくのは回避率や会心率に影響させることですが、回避率や会心率が10%も変動すると大変ですし、かといって変動率が0.01%とかだと全くありがたみがありません。

そこで、分散度の振れ幅に運を影響させてみました。

分散度はダメージ量のばらつきに関係するパラメーターで、分散度が20%であれば算出されたダメージから-20%〜+20%の範囲で最終的なダメージが変動します。

この変動幅を運の差によって動かしてみました。具体的には、運が相手より1高いとマイナス方向の分散度の数字が1%(分散度が20%なら0.2%)減るように、相手より1低いとプラス方向が1%減るようにしました。例えば分散度が20%の場合、運が相手より10高いと分散度が-18%〜+20%の範囲で、50低いと-20%〜+10%の範囲になるようにしました。運が高いほど大きいダメージが出やすい仕組みです。

と、言うと戦略的に使えそうな気がしますが、実際には基本ダメージが50で運の差が10あってようやく1変わるレベルなので、やっぱりほとんど影響ないかも。加えて、そのために運を上げるくらいなら、素直に攻撃力や魔法力を上げた方がいいという。

うーん……。