開発日誌

素材

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 敵キャラの行動パターンに複数条件を指定

2022-02-11 14:54:11

敵キャラの行動パターンに複数の条件を指定できるようにするプラグインを作成しました。

これによって、残りHPが少なくてかつ特定ターンに限り強力な回復魔法を使ってくる敵とか、こちらのパーティーのレベルに応じて行動のローテーションが変化していくような敵を、バトルイベントでの制御やメモ欄での複雑な記述なしに作ることができます。

RPGツクールMV/MZの両方に対応しています。

行動パターンの条件指定

敵キャラの行動パターンには、ターン数や自身のHP/MPの範囲、かかっているステート、パーティーの平均レベルがいくつ以上、およびスイッチと、様々な発動条件を指定することが可能です。

しかし、これらの条件は1つの行動パターンにつき1つの条件しか使用できず、標準で複数条件を実現しようとすると、バトルイベントとスイッチを組み合わせるなど工夫しなければなりません。

この行動パターンの条件設定は初期の頃のRPGツクールから驚くほど進化しておらず、むしろ劣化しているとも思えるほどです。条件のラジオボタンがチェックボックスにさえなってくれれば……!と思っていた人は多いのではないでしょうか。

行動パターンの設定項目にはメモ欄もなく、プラグインで制御するのも非常に難しいのですが、今回やりやすい設定方法を思いついたのでプラグイン化しました。

事前準備

まずは「データベース」の「スキル」で、ダミーのスキルを1つ追加します。

名前は何でもいいですが「↓条件追加」などとしておくと分かりやすいかと思います。

ダミーなのでスキルの設定内容は何もいりません。

そしてこのスキルを、プラグインパラメータの「追加条件用スキル」に指定します。

以上で準備は完了です。

複数条件の設定方法

このプラグインの機能としては、この「追加条件用スキル」がスキルとして設定された行動パターンの条件を、直後の行動パターンの条件に追加する、というものです。

例えば以下のような行動パターンが設定されている場合、

スキル 条件
↓条件追加 パーティーLV>=25
ブリザード ターン 3+4*X

パーティーの平均レベルが25以上で、かつターン数が3+4*X(3,7,11…ターン目)の時にブリザードが発動します。

追加条件は2個以上重ねることもでき、例えば以下のような場合は、

スキル 条件
↓条件追加 パーティーLV>=30
↓条件追加 HP 0%~50%
リカバー ターン 1+4*X

パーティーの平均レベルが30以上で、かつ自分のHPが0~50%の範囲内で、かつターン数が1+4*X(1,4,9…ターン目)の時にリカバーが発動します。

追加条件はAND条件として追加され、全ての条件を満たした場合のみ発動可能になります。OR条件は指定できないので、OR条件にしたい場合はその分だけ行動パターンを作成してやる必要があります。

なおレーティングについては、追加条件でない行動パターンのレーティングが採用され、追加条件のレーティングは無視されます。

複数条件が簡単に設定できることで、より敵キャラの行動パターンを細かく制御できるようになりますが、追加条件は矛盾や漏れがないように気を付けないと、発動し得ない行動になったり、どの条件も当てはまらなくて有効な行動がなくなったりといった事態も起こりますので、ご注意ください。

またそもそもの問題として、標準で設定可能な条件の種類が少なく、これは本プラグインでも解消するものではないので、そこはバトルイベントや他プラグインと併用していくことになるかと思います。

プラグインの実装と注意点

プラグインの実装としては、敵キャラのデータ(Enemies.json)を読み込んだ際に、行動パターンの配列を変更して条件設定を配列に変換し、戦闘行動の条件判定の際は全ての条件を満たしているか判定しているだけです。

敵キャラの行動パターンを制御しているプラグインとは競合や意図通りに動作しない可能性があるので、ご注意ください。

拙作プラグイン「複数回行動条件設定プラグイン(PANDA_MultiAction.js)」はメモ欄に行動パターンの番号を記述する必要がありますが、これと併用した場合、この行動パターン番号は条件追加の行動パターンを無視してカウントする点にご注意ください。

複数回行動条件設定プラグインも、これと同じようにダミーのスキルを作って、これより下の行動は2回目の行動でのみ発動、みたいに設定できた方が楽かもしれませんね。気が向いたらそのうちやります。

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 数値入力ウィンドウを強化

2022-01-30 22:54:58

イベントコマンド「数値入力の処理」のウィンドウを機能強化して、キャンセルボタンを有効にしたり、数値入力の前後に文字列を追加したり、入力可能な数値の最小値・最大値を指定できるプラグインを作成しました。

RPGツクールMZ専用です。ウィンドウ系は仕様が異なるため、MVでは使えませんのでご注意ください。

※ 2022-03-30追記:
オプションでタッチUIをOFFにした場合エラーが発生するバグを修正しました。お手数ですが、Version.1.0.1にアップデートをお願いします。

標準のイベントコマンド「数値入力の処理」では、入力した数値を受け取る変数と数値の桁数を指定するだけですが、このプラグインを導入すると、追加で以下のことができるようになります。

  • キャンセルボタンで数値入力をキャンセル
  • 数値入力の前後に文字列を追加
  • 入力可能な数値の最小値・最大値を設定

標準の「数値入力の処理」ではキャンセルが効かず、数値が0だったらキャンセルと見なすといった処理にすることが多いですが、それだと支障のあるケースもあると思います。

「キャンセル有効」をONにすると、ESCキーやキャンセルボタンで数値入力をキャンセルすることができるようになります。キャンセルした際に変数に格納する数値を指定できるので、-1など通常では入力できない数値を設定しておいて、変数の値が-1かどうかで分岐することができます。

また、数値入力の前後に文字列を追加することができます。入力値の説明や単位などを追記して、分かりやすくすることができます。文字列には各種制御文字も使用可能です。

さらに、入力可能な数値の最小値・最大値を指定できます。最小値・最大値はそれぞれ、直接数値で指定することも、変数で指定することも可能です。

最小値・最大値を可変にしたい場合は、最小値・最大値を変数に格納して、その変数を指定するといった方法になるかと思います。

なお、最小値・最大値の指定処理はトリアコンタンさんのプラグインを参考にさせていただいております。ありがとうございます。

具体的な使い方としては、プラグインコマンド「数値入力ウィンドウ設定」でこれらの設定をすると、次の「数値入力の処理」の際に適用されます。

一度「数値入力の処理」が行われると、これらの設定はリセットされるので、「数値入力の処理」の直前でプラグインコマンドを呼び出すようにするといいでしょう。

ただしRPGツクールの仕様上、「文章の表示」と「数値入力の処理」の間に別の処理を挟むと、数値入力の前にメッセージウィンドウが閉じてしまうため、本当の直前ではなく「文章の表示」よりも前に呼び出す必要があることに、ご注意ください。

具体的な活用方法ですが、私は銀行システムを作る際に活用しています。

銀行に入出金できるのは1000G単位にしたかったため、後ろに文字列で「000G」と追加しています。

また、入力可能な数値の最大値を設定して、所持金以上に預け入れたり、預金額以上に引き出したりできないようにしています。

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] [ ツクール情報 ] 敵の蘇生対象がランダムにならない不具合修正

2022-01-19 01:47:24

敵が蘇生スキルを使ってくる際に、死亡者が複数いたとしても、ランダムではなく必ず先頭の死亡者が対象になってしまうという、RPGツクールMZのコアスクリプトの不具合を修正します。

RPGツクールMVにも同様の不具合があるのですが、ターゲット選択部分のコアスクリプトの構造が微妙に異なるため、今回はMZ専用プラグインとなります。MVへの移植も容易なのですが、検証作業がめんd

以前にも「正しい蘇生術」で、RPGツクールVXに同様のプリセットスクリプトの不具合があることを解明し、修正スクリプトも公開していました。

当時の不具合は、Game_BattleActionのdecide_random_targetメソッドにおいて、対象が味方単体(for_friend?)ならば(生存中の)味方からターゲットをランダムに決定、対象が戦闘不能の味方単体(for_dead_friend?)ならば戦闘不能の味方からランダムに決定、としているつもりが、for_friend?にはfor_dead_friend?の場合も含まれるので、この判定順序では対象を戦闘不能の味方にしていても通常の味方単体で選ばれてしまう、というものでした。

実はMZが出た時に、この不具合がどうなっているのか、コアスクリプトを調べてみたことがあります。

対応するGame_ActionのdecideRandomTargetメソッドを見ると、ちゃんと戦闘不能の味方(isForDeadFriend)を先に判別しており、さすがに不具合は解消されているものだと思っていました。

ところが最近になって、蘇生魔法を使用する敵を作って戦闘テストをしていたところ、何度試しても先頭の死亡者ばかり蘇生してきます。

そこで改めてコアスクリプトを検証してみたところ、Game_ActionのdecideRandomTargetは敵の通常行動時に呼ばれるものではなく、敵がターゲットを決めるメソッドはmakeTargetsであることが判明しました。そしてここから呼ばれているtargetsForDeadを見ると、敵が蘇生スキルを使用するという前提がないせいか、先頭の死亡者が選ばれるような構造になっていました。

本プラグインはそれを修正して、敵が蘇生スキルを使ってくる際に対象者をランダムに選ぶようにしたものです。

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 能力値&敵キャラの調整Excelツール更新

2022-01-06 21:12:18

RPGツクールMV/MZ用に公開していた「エクセルで能力値かんたん調整」と「エクセルで敵キャラかんたん設定」の2つのExcelツールに不具合があったので、修正版をアップしました。

※ 2023-04-03追記
名前やメモ欄に"があると正常に出力できない不具合を修正しました

各ツールの使い方については、それぞれの記事を参照してください。

今回修正したのは、各職業や敵キャラのメモ欄等に\で始まる制御文字を使用していると、出力されたjsonファイルが読み込めなくなるという不具合です。jsonファイルの中では\が特殊な意味を持つので、\自体を出力するためには \\ としないといけないのを、そのまま \ と出力してしまったため、読み込みエラーが起きていました。エラー報告をいただき、ありがとうございました。

制御文字を使っていない場合は特に関係ありませんが、何かの拍子に制御文字が入らないとも限らないので、念のためアップデートをお願いいたします。

なお、64bit版のExcelをお使いの場合は、そのままでは動作しませんので、
https://tablacus.github.io/scriptcontrol.html
から、64bit版で動作するScriptControlである「Tablacus Script Control 64」をダウンロード&インストールしてください。

これはtwitterツクールフォーラムでしか言及していなかったと思うので、改めてエクセルツール上にも記載しました。

もしこれらのツールを使って、うまく動作しないだとか、jsonファイルが読み込めなくなったといったことがありましたら、お気軽にご相談ください。場合によってはファイルの復旧が不可能なこともありますが、その時はご容赦ください。

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] タイマーの不具合修正

2021-09-11 10:34:13

※ 2021-12-10追記:
RPGツクールMZのVersion 1.4で、タイマーの挙動が修正されました。が、条件分岐のタイマー判定が正しくなっただけで、残り秒数の画面表示や変数取得の場合はこれまで通り小数点以下が切り捨てられる仕様のようです。これらの挙動も修正したい方、およびRPGツクールMVをご利用の方は引き続き本プラグインをご利用ください。

RPGツクールのタイマー機能には、想定より1秒早く終了判定されうるという不具合があります。

RPGツクールMV/MZにて、その不具合を修正するプラグインを作成しました。

RPGツクールシリーズにはタイマー機能があります。

昔のシリーズから存在する機能で、秒数を指定してのタイマーの始動と停止、タイマーの残り秒数による条件分岐、およびタイマーの残り秒数を変数に取得・操作することができます。また、タイマーの稼働中は画面内に残り秒数が表示されます。

この機能を使うと、1分以内に脱出!とか、30秒後に爆発する爆弾!とか、リアルの時間経過に依存するイベントを作成することができます。ミニゲームや時限イベントで活躍する機能です。

先日、星潟さんより、一部のツクールシリーズではこのタイマー機能に小数点以下の計算が行われない不具合がある旨、報告がありました。

こちらで調べたところMZでも同様の不具合があったので、修正プラグインを作成しました。

なお、VX Ace用の修正スクリプトは上記、星潟さんのサイトにあるので、そちらをご利用ください。

不具合の内容と原因

例えば右のように、タイマーを3秒で開始して、タイマーが0秒以下になるまでループさせるイベントを組んだ場合、実際には3秒ではなく2秒でループが終わってしまいます。

タイマーを1秒にすると一瞬で終わるので、より顕著に不具合が分かります。

不具合の原因は、条件分岐でタイマーの残り秒数の判定をする際に、小数点以下の秒数が切り捨てられている点です。

タイマーは内部ではフレーム数(1フレームは1/60秒)で管理されており、1フレーム経過するごとに残りフレーム数が1ずつカウントダウンされます。

そして残り秒数の判定や表示の際には、残りフレーム数を60で割って残り秒数として使用される仕組みになっているのですが、この時に小数点以下の秒数が「切り捨て」られるようになっています。

この時どうなるかというと、残り1秒から1フレーム経過して残り0.983秒(59/60秒)となった段階で、小数点以下が切り捨てられて0秒として判定されてしまいます。実際にはまだ0.983秒残っているにもかかわらず、1秒をわずかでも切った時点で0秒と判定されてしまうのです。

条件判定が「以上」の場合は正しく判定されますが、「以下」の場合は約1秒早く判定されてしまいます。たいていは「0秒以下」の条件で終了判定する使い方だと思うので、不具合の影響を受けることになります。

たった1秒ではありますが、たいていタイマー機能は制限時間内に何かせよ、というイベントやミニゲームで使用されるので、1秒といえどもかなり重要な意味を持つのではないでしょうか。

修正内容

このプラグインを導入すると、条件分岐のタイマー判定が小数点以下まで含めて正しく判定されます。

具体的には条件分岐のタイマー判定においては、小数点以下込みの数値で判定されます。例えば条件を「3秒以下」とした場合、正しく3.00秒になった瞬間に条件に合致します。従来は3.99秒になった瞬間に条件に合致してしまいました。

また、画面内に表示される残り秒数は、小数点以下を「切り上げ」て表示するように修正しています。従来は残り秒数が1秒を切って0.99秒になると、画面内の表示は0:00となっていましたが、上記不具合が修正されたことにより、このままだと画面上は0:00と表示されながらも、実際にはまだあと1秒弱の猶予があります。これだと紛らわしいため、表示が0:00になった瞬間にタイムアップとなるよう、小数点以下の秒数を「切り上げ」としています。

それから「変数の操作」にも、タイマーの残り秒数を代入・操作する機能があります。これは画面上に表示されている残り秒数と同じ秒数が取得できた方がよいと思うので、同じく「切り上げ」としています。

なお、既に修正前の状態で秒数の調整をされている場合は、本プラグインを導入して修正することによって、逆に想定よりも1秒長くなってしまうことになるため、タイマーを使用しているゲームに後から導入する場合は、ご注意ください。

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