開発日誌

素材

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

2021-09-11 10:34:13

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秒長くなってしまうことになるため、タイマーを使用しているゲームに後から導入する場合は、ご注意ください。

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 複数回行動時の速度補正変更

2021-08-19 22:24:23

RPGツクールではスキルやアイテムに「速度補正」を設定でき、通常よりも先行して放てる技や、逆に発動に時間のかかる必殺技などを実現することができます。

代表的なのは「防御」や「かばう」のスキルです。これらの速度補正を1000や2000といった高い値にすることで、敵の攻撃よりも先に防御や身代わりの体勢をとることができるようになります。

しかし、RPGツクールのデフォルト機能では、1ターンに2回以上の行動をする場合、それぞれの行動の速度補正のうち最小値が採用されるようになっています。そのため、速度補正の高い「防御」や「かばう」と、速度補正が0の通常の行動とを同時に行うと、速度補正としては0が採用されて、真っ先に「防御」や「かばう」の行動をとってくれません。

そこで、複数回行動時の速度補正の算出方法を、最小値から変更するプラグインを作成しました。RPGツクールMVとRPGツクールMZの両方に対応しています。

このプラグインを導入すると、速度補正の算出方法を以下の6つから選択することができます。

  • 各行動の最小値(ツクールの標準と同じ)
  • 各行動の最大値
  • 各行動の平均値
  • 各行動の合計値
  • 最初の行動の速度補正値
  • 最後の行動の速度補正値

例えば3回行動で、それぞれの行動の速度補正が行動順に300、1000、-100だった時、算出結果は以下のようになります。

  • 最小値:-100
  • 最大値:1000
  • 平均値:400
  • 合計値:1200
  • 最初の行動の値:300
  • 最後の行動の値:-100

考え得る限りの算出方法は用意しましたが、どれが良いのかは議論の余地があります。

特に、速度補正がプラスのものとマイナスのものとを同時に行った場合、どうなるのが自然なのかによるのかなと思います。

プラスの方の速度補正は「防御」や「かばう」などそのターンの最初に発動しないと意味をなさない行動に使われるのに対して、マイナスの速度補正は単に詠唱時間が長いといったペナルティー要素として採用されるケースが多く、それを考えるとプラスの速度補正が重視された方が良さそうな気はします。

一方でマイナスの補正値が全く加味されないのも意味がないので、私は平均値を用いています。

他の方法を使いたいという要望があれば、可能な限り採用したいと思いますので、ぜひお寄せください。

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] イベントキャラ移動の改善プラグイン

2021-06-17 23:08:30

イベントキャラクターのランダム移動やプレイヤーに近づく移動を改善するプラグインを作りました。RPGツクールMVとRPGツクールMZの両方に対応しています。

イベントキャラクターの移動に関して以下の3点を改善します。

1点目は「移動ルートの設定」における「ランダムに移動」。

RPGツクールの標準のランダム移動は、まず上下左右4方向からランダムに移動方向を決定し、その方向に移動ができたら移動する、という仕組みになっています。ランダムに決定された方向に障害物があって動けない時は、移動が発生しません。

したがって、3方向を囲まれた袋小路のような場所にキャラクターがいる場合、1/4の確率でしか動かないことになります。

このプラグインはそれを改善します。先に上下左右4方向で移動可能な方向をリストアップし、その移動可能な方向の中からランダムに移動方向を決定します。したがって、袋小路のような場所でも必ず動ける方向に動きます。

2点目は「自律移動」の「ランダム」。

RPGツクールにおける自律移動タイプの「ランダム」は、実は完全にランダムに移動するわけではなく、1/2の確率で今向いている方向にそのまま前進、1/6の確率でその場に停止、1/3の確率でランダムな方向に移動する仕組みになっています。

完全にランダムだと周りをウロウロするだけの怪しい動きになってしまうので、これ自体は動きを自然に見せるための仕組みだと評価できます。ただ、それぞれの確率を調整したい場合もあるでしょう。

このプラグインは、プラグインパラメータで前進と停止の確率を調整できます。デフォルトは前進が50%(1/2)、停止が17%(1/6)となっており、この値を変更すれば、ランダム移動の確率を高くしたりすることができます。

また、1点目のランダム移動の改善も適用されるため、キャラクターがランダム移動で狭い場所に入り込んでしまった時の動きが、劇的に改善されると思います。

そして3点目は「自律移動」の「近づく」。

RPGツクールにおける自律移動タイプの「近づく」は、ランダムと同様、常にプレイヤーに近づいてくるわけではなく、少し遊びのある動きをします。具体的には、プレイヤーに近づいてくる移動は2/3の確率であり、1/6の確率でランダムに移動、1/6の確率で今向いている方向にそのまま前進します。

敵が追いかけてくるような動きの場合は、この確率だと少々無駄な動きが多く、かといってカスタム移動の「プレイヤーに近づく」だと100%近づいてきてしまうため、それはそれで逃げ場がありません。

ランダム移動と同様、プラグインパラメータでランダム移動と前進の確率を調整できます。デフォルトはどちらも17%(1/6)で、この値を小さくすれば、より積極的に近づいてくる動きになります。

実際の動きはこんな感じ。狭い場所に入った時のランダムな動きや、プレイヤーへの接近具合が改善されているのが分かります。

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 進行状況ウィンドウプラグインをMVにも対応

2021-01-25 01:23:07

メニュー画面に現在の物語の進行状況等を示す簡単なテキストを表示できるプラグイン「進行状況ウィンドウプラグイン」を、MV/MZ両対応にバージョンアップしました。

ツクールフォーラムで、RPGツクールMV用に同様のものが欲しいという声が上がっていたので、それに応えた形です。

最終的にスクリプト内部でMVかMZかを判別するようにして、同じファイルでMVとMZの両方に対応できるようにしました。

詳しい使い方は「メニュー画面に物語の進行状況を表示」もご参照ください。

MVでは、デフォルトのメニュー画面のコマンドウィンドウと所持金ウィンドウの間に空きスペースがあるので、そこに表示するようにしました。もちろんウィンドウの位置・サイズを指定すれば、好みの場所に配置することができます。

ウィンドウ周りは、MZとMVでコアスクリプトの仕様が異なるため、そのままでは動かないのですが、実際にはウィンドウの初期化(initialize)の呼び出し方が多少違うだけで、後はMZの書き方で基本的に動作することが分かりました。

なお、MVかMZかの判別は、Utils.RPGMAKER_NAMEに文字列でMVかMZかが格納されていますので、それを使用しています。

また、MZで既にご利用の方は、敢えてアップデートする必要はありませんが、テキストに改行(\n)を2つ以上入れても、最初の1つしか認識されないというバグがあったので、もし3行以上のテキストを表示させたい場合は、アップデート版のご利用をお願いします。

具体的には、改行コードの置換をreplace("\\\\n", "\\n")としていたのを、replace(/\\\\n/g, "\\n")としました。こうしないと複数の置換ができないんですね……。うーん、素直にmultiline_stringにしておけばよかった……。

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] RPGツクールMZプラグインまとめ

2021-01-22 21:37:22

去年の8月以降、RPGツクールMZ(MVも一部対応)のプラグイン素材をいくつか公開してきましたが、埋もれてしまったものも多そうなので、ここらでまとめて紹介します。

ルビ表示プラグイン

詳しくは「RPGツクールMZでルビを振る」記事参照。

こんな感じでテキストにルビを振ることができるプラグインです。

{九尾|きゅうび}の{狐|きつね}のように、ルビを振りたい文字を{ }で囲んで、 | の手前の漢字、後ろにルビを記述すれば、ルビ付きのテキストとして表示されるようになります。

とてもシンプルな記述でルビを実現できるので便利!

ややルビの文字サイズが小さめですが、1行の高さを標準から変えずにルビ振りができるので、ウィンドウレイアウトに影響しないのが特徴です。文章の表示だけでなく、アクター名、スキル名、敵キャラ名、説明文や戦闘メッセージなど、基本的に全てのテキストに対応しています。

進行状況ウィンドウプラグイン

詳しくは「メニュー画面に物語の進行状況を表示」記事参照。

メニュー画面上部に、現在の物語の進行状況を示す簡単なテキストを表示できるプラグインです。

進行度を管理する変数を1つ用意し、その変数の値に応じたテキストを入力しておけば、メニュー画面を開いた際に常に現在の進行状況が表示されます。日をまたいでプレイ再開した時に、「次は何をすればいいんだっけ?」となるのを防げます。

ウィンドウの位置は好みの場所に調整可能です。

※ MVにも対応したVersion 1.1.1をリリースしました。「進行状況ウィンドウプラグインをMVにも対応」記事参照。

データベースの名前表示プラグイン

詳しくは「文章中にアイテムや敵キャラ等の名前を表示」記事参照。

「文章の表示」コマンドやアイテム等の説明文で、以下の制御文字をそれぞれの名前に置き換えてくれるプラグインです。

\class[n] n番の職業名
\skill[n] n番のスキル名
\item[n] n番のアイテム名
\weapon[n] n番の武器名
\armor[n] n番の防具名
\enemy[n] n番の敵キャラ名
\troop[n] n番の敵グループ名
\state[n] n番のステート名

\item[\V[1]]のように、nに変数を用いることも可能です。また\*skill[n]のように頭に*を付けると、そのスキルのアイコンを表示できます(item、weapon、armor、stateも同様)。

上のように書いておくと、下のように表示されます。

アイテム発見イベント規格化プラグイン

詳しくは「アイテム発見イベント規格化プラグインとサンプルミニゲーム」記事参照。

宝箱やタンス、タルなどを調べるとアイテムが見つかる、というイベントを簡単に組むためのプラグインです。

イベントの名前を例えばi1とすればID1番のアイテムが、w25とすればID25番の武器が、g500とすればお金500Gが、手に入るイベントを作成できます。アイテム入手時の演出やメッセージは、上の「データベースの名前表示プラグイン」と組み合わせたコモンイベントで作成します。

後から宝箱の中身を変更する際に、イベント名を変更するだけで済むので、とても便利です。ちょっと作成方法がややこしいので、上記記事で紹介しているサンプルゲームも参考にしてください。

重要語句の文字色変更プラグイン

詳しくは「重要語句の文字色変更プラグイン」記事参照。

「文章の表示」コマンドや説明文等で <N人名> のようにテキストを囲むと、囲まれた部分の文字色を手軽に変更することができます。人名は青、アイテム名は赤のように、語句のタイプに応じて色を変えることができ、語句のタイプと対応する色は自由に指定可能です。

プラグインがなくても色の変更は制御文字の\C[n]で可能ですが、人名は青にしてたっけ赤にしてたっけとか、色を戻し忘れたりとか、後から人名はやっぱり黄色にしたいとか、このプラグインが役に立つ場面はいくらでもあるはずです。

アイテム獲得メッセージにアイコン表示プラグイン

詳しくは「アイテム獲得メッセージにアイコンを表示」記事参照。

こんな感じで、戦闘終了時のアイテム獲得メッセージにおいて、アイテム名の頭にアイコンを表示させることができるプラグインです。

なお、サンプル画像ではアイテム名の色も変わっていますが、これは「用語」の「メッセージ」で色を変更しているだけです。

バフ・デバフ効果個別設定プラグイン

詳しくは「バフ・デバフの効果を個別に設定」記事参照。

バフ・デバフの倍率を、能力値および強化か弱体かでそれぞれ個別に設定できるプラグインです。

デフォルトだと全て1段階につき25%共通なので、能力値によっては物足りなかったりします。それが柔軟に設定できます。

セルフスイッチ操作プラグイン

詳しくは「任意のセルフスイッチを消去」記事参照。

プラグインコマンドで、対象のマップID、イベントID、スイッチID(A-D)を指定すると、該当のセルフスイッチをOFFにすることができます。マップIDは全てのマップや現在のマップ、イベントIDやスイッチIDは全てのものなども指定可能です。

特定セルフスイッチ消去プラグイン

詳しくは「特定のセルフスイッチをリセット」記事参照。

マップに入った際、そのマップにあるイベントのうち、名前が指定した正規表現にマッチするイベントのセルフスイッチをOFFにできるプラグインです。

マップに出入りするたびに復活する宝箱とか、開けた扉や押したスイッチを元の状態に戻したい時とかに使えます。

メッセージ中にスイッチ操作プラグイン

詳しくは「台詞の途中でスイッチ操作 in MZ」記事参照。

文章表示の途中でスイッチのON/OFFができるプラグインです。

「文章の表示」の制御文字で、\+switch[n]と入れるとn番のスイッチをONに、\-switch[n]でOFFにできます。

スイッチに連動した並列処理を使うことで、台詞の途中の狙ったタイミングでキャラクターを動かしたり、フキダシアイコンを表示したり、効果音を入れたりすることが可能になります。

戦闘終了時特殊処理プラグイン

詳しくは「戦闘終了時に特殊処理」記事参照。

戦闘終了後に直ちにフェードアウトさせたり、BGM/BGSを継続させずに停止したり、勝利時・敗北時など条件によってスイッチをONにできるプラグインです。バトルイベントの0ターン目(戦闘開始時)に、プラグインコマンドで指定するようになっています。

ボス戦後などにイベントを実行したい時、標準だと経験値やお金の獲得メッセージを出している間に元のBGMが流れてしまいますし、イベントが始まる前に一瞬だけ元のマップが表示されてしまいます。このプラグインを使うと、BGMを停止させたり、フェードアウトした状態でイベントに移行することができます。

選択肢表示時SEプラグイン

詳しくは「選択肢表示時にSEを鳴らす」記事参照。

「選択肢の表示」で選択肢ウィンドウが表示される際に、SEを鳴らすプラグインです。

職業名の代わりに二つ名表示プラグイン

詳しくは「職業の代わりに二つ名を表示」記事参照。

ステータス画面等で職業名の代わりに二つ名を、二つ名の代わりに職業名を表示するプラグインです。後者はプラグインパラメータで非表示にすることもできます。

長編RPGなどで、ストーリーに応じて主人公の職業が「村の自警団兵」→「王国兵」→「勇者」などと変化する場合、それを職業の代わりに二つ名の変更で済ますことができます。

イベントスキッププラグイン

詳しくは「イベントスキップを実装した」記事参照。

並列処理イベントと連携して動くプラグインで、指定したラベルの位置(もしくはイベントの最後)までイベントをスキップさせることができます。あまり高機能ではなく、会話だけのイベントを飛ばすといった限定的な使い方を想定しています。

VX方式経験値算出プラグイン

詳しくは「必要経験値の計算をVX方式で」記事参照。

レベルアップに必要な経験値の算出方法をVXでの方式に変更するプラグインです。

VX Ace以降、MV、MZの算出方法だと、序盤はなかなかレベルが上がらない一方、中盤以降はどんどんレベルアップしてしまい、バランス調整が非常に難しいです。VXでの算出方法に変えることで、調整をやりやすくすることができます。


以上、全部で15個ありました。思ったより作ってましたね。

あまり派手なものはないですが、ツクールのちょっと物足りないところや融通の利かない部分を補う、便利なプラグインだと思います。ぜひご利用ください!

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