開発日誌

テクニック

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 乗降中はメニュー画面を開けなくする

2023-10-13 02:09:49

乗り物に乗り降りしている最中は、メニュー画面を開けないようにするプラグインを作成しました。

RPGツクールMV/MZ、どちらにも対応しています。

プレイヤーキャラクターが1人だけだったり、パーティーの隊列歩行がOFFの場合は問題ないのですが、隊列歩行がONの状態で船や飛行船などの乗り物に乗り降りした際、隊列メンバーがまだ乗り降りしている最中でも、メニュー画面が開けてしまいます。

メンバーがまだ完全に乗降しきっていないうちにメニュー画面を開いて、そのままテレポートなどの移動魔法を使って場所移動されると、予期せぬエラーが起きそうです。

ただでさえツクールは、乗り物と移動スキル/アイテムとの相性が悪いです。例えば船に乗っている時に移動スキルで場所移動すると、船に乗ったまま移動先に降り立ってしまうため、いったん暗転中に下船用のダミーマップに移動して船から降ろす、といった処理を噛ますなどの工夫を余儀なくされます。

このような処理がある中で、乗り物からの乗降が完全に終わっていないうちにメニュー画面を開いて移動されるのは、明らかにバグの温床となりそうです。

このほか、船に乗り込んだ直後にイベントを起こしたい時なども、イベント発生前に別マップに飛ばれてしまうといった不具合が発生します。

こうした不具合を防ぐために作成した、乗り物の乗降中はメニュー画面を開けなくするプラグインです。プラグインパラメータなどの設定はないので、プラグインを有効にするだけで反映されます。

隊列歩行と乗り物を使用している場合は、導入必須のプラグインだと思います。

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 特定の装備タイプをアイテム一覧に表示しない

2023-10-04 01:18:33

指定した装備タイプの装備品をアイテム一覧で非表示にするプラグインを作成しました。

RPGツクールMV/MZ、どちらにも対応しています。

普通のアイテムはアイテムタイプで「隠しアイテムA/B」を設定すれば、アイテムリストに表示されない、特殊な隠しアイテムを作成することができますが、同じことを防具でもできるようにしたプラグインです。

プラグインパラメータで指定した装備タイプの防具は、メニューコマンドの「アイテム」で「防具」の一覧には出てこないようになります。

装備タイプは複数指定が可能です。武器でも設定できますが、武器は1つの装備タイプしかないため意味がなく、基本的には防具に対して使用するイメージです。

公式のツクールWebフォーラムのスレッドで挙がった要望に対応したものです。

もともとの相談としては、覚えられるスキル数に制限を設けて、最大値以上にスキルを覚えた場合は、どれか忘れるスキルを選ぶようなシステムを導入したいというものでした。

しかし、専用のユーザーインターフェイスを作るのは簡単ではないため、比較的簡単に実装できる方法として、以下の装備を利用する方法を提案しました。

  1. 装備タイプに「スキル」を追加
  2. 装備タイプを「スキル」にした防具を作成し、特徴にスキル追加を設定
  3. 装備スロットを拡張できるプラグインを導入して、スキル装備を覚えられる数だけ増やす

▲装備タイプに「スキル」、特徴に「スキル追加」を設定した防具を作る

一度に覚えられるスキルの個数が4~5個程度であれば、スキルの習得・忘却を装備の着け外しで代用するこの方法が、専用のUIを作るより楽に実装できると思います。スキルの最大個数が10以上ある場合は、さすがに専用のメニューを用意した方がいいかと思います。

装備スロットを拡張するプラグインは、砂川赳さんの「装備スロットを自由に変更」プラグインをお勧めしました。このプラグインを使えば同じ装備部位で複数装備が可能になるので、これで覚えられる個数分だけスキル装備のスロットを用意して、覚えられるスキルの数を絞ることができます。

▲スキル追加用の防具が見えてしまう

これで基本的にはOKだと思いましたが、問題はメニューの「アイテム」で「防具」を選択した際に、このスキル付与用の防具が表示されてしまうことです。

表示されてもいいと割り切ってしまうのも一案ですが、特定の装備タイプをアイテム欄から隠すのはそれほど難しい処理ではなかったので、プラグインを作成した次第です。

▲スキル追加用の防具は非表示になった

プラグインパラメータで隠したい装備タイプの番号(上記例では「6」)を指定してやれば、その装備タイプの装備品はアイテム一覧には表示されなくなります。

もちろん「装備」のメニューでは問題なく表示されます。

スキルの入れ替えを防具で行う、という個別の要望に合わせて作成したプラグインですが、このシステムはそこそこ採用される機会も多そうだということと、他にも応用ができそうだと思ったので、一般向けに公開しました。

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] ショップでの利用金額を取得

2023-03-23 21:25:18

お店での購入金額と売却金額をそれぞれ指定した変数に取得するプラグインを作成しました。

RPGツクールMV/MZ、どちらにも対応しています。

イベントコマンドの「ショップの処理」で、購入した金額および売却した金額をそれぞれ指定した変数に格納することができます。

例えば、購入金額が0だった場合は、何も購入していないことになります。

購入金額が0より大きいか否かで分岐することによって、購入していたら「毎度ありがとうございます」、何も購入していなければ「買わないなら消えろ!」みたいに、購入の有無でメッセージを変えることができます。

購入金額が一定以上で特殊なメッセージを出したり、イベントを発生させたりすることもできます。

購入か売却かでメッセージを変更することもできます。

購入金額を別の変数に加算していくことで、累積の利用金額によってイベントを起こすことも可能です。

購入のみのショップであれば、前後の所持金を比較することで利用金額を算出することができますが、売却も可能なショップだと、前後の比較だけでは正しい利用金額が割り出せないので、このプラグインが必要になります。

変数に格納されるのは、直前の「ショップの処理」で変動した金額のみです。「ショップの処理」実行時に、購入金額と売却金額の変数は0にリセットされます。累積の利用金額を出したい場合は、別の変数を作って加算してやる必要があります。

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 「盗む」スキルの実装

2023-03-16 22:28:14

敵の持っているアイテムを奪うスキル、いわゆる「盗む」スキルを実装できるプラグインを作成しました。

RPGツクールMV/MZ、どちらにも対応しています。

いわゆる「盗む」のスキルは、盗賊職の花形スキルとして数多くのRPGで採用されていますが、ツクールシリーズには標準では用意されていません。

既存のプラグインでより高機能なものもありましたが、もっと単純な設定で動くものが欲しかったので自作しました。

「盗む」ステートの作成

まず事前準備として、「盗む」が成功した状態を表すステートを1つ作成します。

このステートはダミーステートなので、名前以外の各種設定やこの状態になった時のメッセージなどは、設定しなくて構いません。むしろ行動制約やアイコンなど、余計な設定が付与されないように気を付けましょう。

そしてプラグインパラメータの「盗む成功ステート」で、この作成したステートを指定します。

このステートの付加をもって、「盗む」が成功したか否かを判定する仕組みとなっています。

「盗む」スキルの作成

次に「盗む」スキルを作成します。

スキルの使用効果で、先ほど作成した「盗む成功ステート」を付加するように設定します。

「ステート付加」の確率を調整することで、「盗む」スキルの基本成功率を設定することができます。

スキルのメッセージやアニメーションは、敵からアイテムを盗もうと狙っている時のものを設定します。「盗む」が成功/失敗した時のメッセージやアニメーションは、別で設定するようになっています。

また、敵キャラの特徴の「ステート有効度」を設定することで、敵キャラごとに「盗む」の成功しやすさを調整することができます。

なお、本プラグインで実装できる「盗む」スキルはアクター専用であり、敵がプレイヤーのアイテムを盗むような仕様には対応していません。

盗めるアイテムの設定

盗んだ時に手に入れるアイテムは、基本的に敵キャラのドロップアイテムがそのまま適用されます。

既存の「盗む」プラグインは、盗めるアイテムを別途メモ欄で指定する方式だったため、ドロップアイテムの設定をそのまま利用できるものとして開発しました。

プラグインパラメータの「盗めるアイテム」で、盗む対象となるドロップアイテムを指定できます。

「ドロップアイテム1~3のみ」を選ぶと、それぞれ指定したドロップアイテムのみが盗めるアイテムとなります。例えば「ドロップアイテム2のみ」を指定した時に、敵キャラのドロップアイテム2が設定されていなかった場合、その敵キャラは何も盗めるアイテムを持っていないことになります。

「ドロップアイテムの出現率依存」を選ぶと、複数のドロップアイテムの中から、出現率によってアイテムが決まります。例えば、アイテムAの出現率が1/2、アイテムBが1/4、アイテムCが1/8だった場合、A:B:C=4:2:1の割合、すなわちアイテムAが4/7の確率、アイテムBが2/7、アイテムCが1/7の確率で、それぞれ盗んだ時に手に入ります。

また、プラグインパラメータの「再度盗めるかどうか」をONにすると、同じ相手から何度でも盗むことができます。OFFにすると、一度盗んだ相手からは盗めなくなり、倒した時にアイテムもドロップしなくなります。

メッセージとアニメーション

プラグインパラメータで、以下のメッセージとアニメーションをそれぞれ指定できます。

  • 「盗む」が成功した時
  • 「盗む」が失敗した時
  • 相手が盗めるアイテムを何も持っていない時
  • 相手から既にアイテムを盗んでいてこれ以上盗めない時

メッセージでは、%1で自分のアクター名、%2で相手の敵キャラ名が表示できます。盗む成功時のメッセージでは、これに加えて%3で盗んだアイテム名を表示することができます。

相手から既にアイテムを盗み済みの判定は、「再度盗めるかどうか」がOFFの場合のみ有効です。

「盗めるアイテムなし」と「既に盗み済み」の判定は、「盗む」の成功判定より先に行われます。盗めるアイテムがないのに、何度も「盗む」にトライしてしまう、という心配はありません。

まとめ

いわゆる「盗む」のスキルは、かなり仕組みがそれ専用な上に、成功確率や盗めるアイテムといった細かい仕様が千差万別なため、なかなかツクールの標準機能として組み込むのが難しいと思います。

今回は個人的に標準的な「盗む」スキルとして、以下のような仕様で作りました。

  • 味方専用
  • 成功率はステートの付与率で判定
  • 盗めるアイテムはドロップアイテムに準拠
  • 何度でも盗めるかどうかはパラメータで変更可

したがって、以下のような仕様は、本プラグインでは対応していません。

  • 敵がプレイヤーのアイテムを盗む
  • 成功率に運以外のパラメータを関与させる
  • ドロップアイテムとは別で盗めるアイテムを設定

成功率などはプログラムの改造でできると思いますので、細かい仕様変更はご自身でお願いします。変更が大がかりでなく、汎用的だと思える要望であれば、修正も可能ですので、ご要望をお寄せください。

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

[ テクニック ] 変数を使いこなそう(2) 剰余の活用法

2022-12-08 00:00:43

本記事は「ツクールアドベントカレンダー Advent Calendar 2022」12月8日分の投稿記事です。

変数を使いこなそう(1) ゲームデータの活用法」の続編でもあります。こちらも併せてご覧ください。

変数の計算

前回の記事では、RPGツクールにおける「変数」の概念と、主に「オペランド」の「ゲームデータ」で扱える値の活用法を解説しました。

ゲームデータでは、ゲーム内に登場する値を変数に代入する使い方が中心でしたが、「変数の操作」では代入だけでなく数値計算も可能です。

「操作」のところには「代入」以外に、「加算」(足し算+)、「減算」(引き算-)、「積算」(掛け算×)、「除算」(割り算÷)と、基本的な四則演算ができるようになっています。

ところで、その最後に「剰余」というあまり馴染みのない項目があります。

これは何でしょう。

剰余とは

「剰余」とは「じょうよ」と読み、小学校の算数でやった、割り算の「あまり」のことです。

「37÷3=12、あまり1」の「1」を求める計算ですね。

37が格納されている変数に対して、定数3で剰余の操作をすると、変数には1が入ります。

ツクールでは%の記号で表されています。他のシステムやプログラム言語では\modで表されることも多いです。

剰余の概念自体はそんなに難しいものではありません。

問題は、こんなの何に使うんだ?ってことですよね。

今回は剰余の活用法について解説します。

剰余の活用法

プログラムを嗜む人はご存じかもしれませんが、剰余は純粋に余りを求めるというよりは、余りを応用した計算に使うことが多いです。

以下、代表的な使い方を解説します。

3の倍数でアホになる

剰余の最も多い使い方は、Nの倍数かどうかの判別です。

ある数をNで割って、余りが0ならば、ある数はNの倍数です。

Nが2であれば、2の倍数かどうか、すなわち偶数か奇数かの判定となります。

例えば、1から100までの数字をカウントして、3の倍数の時だけアホになる、懐かしいイベントを作ってみましょう。

◆変数の操作:#0001 変数A = 1
◆ループ
 ◆変数の操作:#0002 変数B = 変数A
 ◆変数の操作:#0002 変数B %= 3
 ◆条件分岐:変数B = 0
  ◆スイッチの操作:#0001 アホ = ON
 :それ以外のとき
  ◆スイッチの操作:#0001 アホ = OFF
 :分岐終了
 ◆条件分岐:アホがON
  ◆SEの演奏:Crow (90, 130, 0)
  ◆文章:なし. SF_Monster(3), ウィンドウ, 下
  :  :\V[1]\.\.\^
 :それ以外のとき
  ◆文章:なし. Evil(3), ウィンドウ, 下
  :  :\V[1]\.\.\^
 :分岐終了
 ◆条件分岐:変数A >= 100
  ◆ループの中断
 :それ以外のとき
  ◆変数の操作:#0001 変数A += 1
 :分岐終了
:以上繰り返し

3を含むとアホになる

さて、本家は3の倍数だけじゃなくて、3を含む数字(13や35など)もアホになる対象でした。

実際のプログラムであれば、いったん数字を文字列に変換して、3の文字を含むかどうかで判定するのが一般的かと思われますが、ツクールのイベントコマンドではそこまで器用なことはできません。

ではどうするのかというと、それぞれの桁で分けて、一の位が3かどうか、十の位が3かどうかで判定します。

カウントする数字は1から100までですが、100は明らかに3を含まないので、十の位までで十分です。

先ほどの「スイッチの操作:アホ = OFF」の直後に以下の判定を入れ込みます。

  ◆変数の操作:#0002 変数B = 変数A
  ◆変数の操作:#0002 変数B %= 10
  ◆条件分岐:変数B = 3
   ◆スイッチの操作:#0001 アホ = ON
  :それ以外のとき
   ◆変数の操作:#0002 変数B = 変数A
   ◆変数の操作:#0002 変数B /= 10
   ◆条件分岐:変数B = 3
    ◆スイッチの操作:#0001 アホ = ON
   :分岐終了
  :分岐終了

一の位を求めるのに剰余を使いました。すなわち、10で割った余りが一の位の数字になります。これが3かどうかを確かめれば、一の位が3かどうかを判別できます。

十の位は除算を使います。ツクールでは除算の場合、小数点以下は切り捨てになるので、10で割った答えが3かどうかを確かめれば、十の位が3かどうかを判別できます。

今回は1~100だったので、一の位と十の位だけで足りましたが、これが1~1000だった場合は、十の位はもう一工夫必要になります。

1~1000の場合、一の位は変わらず10の剰余が3かどうかで判別します。百の位は100で除算して3かどうかで判別します。十の位は、まず10で除算して、その結果からさらに10の剰余を求めて、3かどうかで判別します。

桁数が増えるほど計算過程が増えていくので、桁数が5桁とかを超えるようであれば、スクリプトを使って判定した方が楽だと思います。

秒数を時分秒に変換

前述のように、剰余の計算は数値の一部を取り出すのに使えます。それの応用例をもう一つ見てみましょう。

変数の操作では「ゲームデータ」の「その他」から「プレイ時間」を取得することができます。

ただし、このプレイ時間は秒数で返されるため、ここから○時間○分○秒に変換するためには、除算と剰余を駆使する必要があります。

具体的には、秒はプレイ秒数を60で割った余り(剰余)。時間はプレイ秒数を3600(60分×60秒)で除算した結果。そして分がやや複雑で、まずプレイ秒数を60で除算して、さらにその結果から60の剰余を求めます。前述の1~1000までカウントする場合の、十の位を求めるのに似ていますね。

◆変数の操作:#0021 プレイ秒数 = プレイ時間
◆変数の操作:#0022 時間 = プレイ秒数
◆変数の操作:#0022 時間 /= 3600
◆変数の操作:#0023 分 = プレイ秒数
◆変数の操作:#0023 分 /= 60
◆変数の操作:#0023 分 %= 60
◆変数の操作:#0024 秒 = プレイ秒数
◆変数の操作:#0024 秒 %= 60
◆文章:あなたのプレイ時間は \V[22]時間 \V[23]分 \V[24]秒です。

トランプの札番号

カジノシステムやミニゲームなどでトランプを扱うことも多いでしょう。

トランプの札にはマーク(スペード、ハート、ダイヤ、クラブ)と数(A、2……10、J、Q、K)の2種類の要素がありますが、これを別々で管理するのは効率が悪いです。

トランプの札が何かを表すのに1~52の連番として扱い、1~13をスペードのA~K、14~26をハートのA~K、27~39をダイヤ、40~52をクラブとして扱うと、1つの値でマークと数の両方を表せるので効率が良いです。

この時、連番になった札番号からマークと数を取得するのに、除算と剰余が活躍します。

まず札番号から1を引きます。

マークは1引いた札番号を13で除算し、0ならスペード、1ならハート、2ならダイヤ、3ならクラブです。

そして数は1引いた札番号から13の剰余を求めます。これだと0~12になってしまうので、1加算して1~13を求めます。

◆変数の操作:#0032 マーク = 札番号
◆変数の操作:#0032 マーク -= 1
◆変数の操作:#0032 マーク /= 13
◆変数の操作:#0033 数 = 札番号
◆変数の操作:#0033 数 -= 1
◆変数の操作:#0033 数 %= 13
◆変数の操作:#0033 数 += 1

以上でトランプの札を効率的に管理することができるでしょう。

循環する数値

0、1、2とカウントして、次はまた0に戻るような、循環する数値のカウントをしたい場合があります。

例えば曜日を表す変数は、0=月曜日、1=火曜日……と加算していき、6=日曜日の次はまた0=月曜日に戻ります。

例えば3種類の台詞を順番に話すキャラを作る場合、台詞番号の変数を1つ用意して、その番号によって台詞を分岐させます。

そして変数が2だったら0を代入し、それ以外なら1加算します。

◆条件分岐:台詞番号 = 0
 ◆文章:ここは最初の村よ。
:分岐終了
◆条件分岐:台詞番号 = 1
 ◆文章:サンプルのために作られた村なの。
:分岐終了
◆条件分岐:台詞番号 = 2
 ◆文章:だから何もない村なのよ。
:分岐終了
◆条件分岐:台詞番号 = 2
 ◆変数の操作:台詞番号 = 0
:それ以外のとき
 ◆変数の操作:台詞番号 += 1
:分岐終了

生真面目に実装するとこうなりますが、剰余を使うことで、よりシンプルに実装できます。

……(台詞の分岐部分は同様)
◆変数の操作:台詞番号 += 1
◆変数の操作:台詞番号 %= 3

何をしているかというと、変数に1を加算して、さらに3の剰余を求めています。

変数の元の値が2だった時、1加算されて3になり、3の剰余を求めることで0になります。元の値が0や1だった時は、3の剰余をとっても変わらず、そのまま1や2になります。

番号が0から始まる場合は、このように1加算して、剰余を求めます。1~3のように番号を1から始めたい場合は、剰余を求めてから1加算すればOKです。

いにしえのプログラミングでは、条件分岐(IF文)のコストが非常に重かったため、このようなテクニックがよく使われていました。

最近ではそのコストはほぼ無視できるので、素直に条件分岐で実装した方が断然分かりやすいため、剰余を使った方法は推奨されません。

ただ、ツクールの条件分岐は無駄に行数を使って長くなりがちなため、この方法を使えば短くすることができます。MZの最新バージョン1.6.0では条件分岐等の折り畳みができるようになったので、あまり気にならないかもしれませんが。

まとめ

以上、今回は「変数の操作」でできる「剰余」について、活用法などを解説してきました。

そもそも剰余が何なのか知らなかった方も、余りが求められて何が嬉しいんだという方も、剰余の使い方がお分かりいただけたのではないかと思います。

いずれも純粋に余りを求めるのではない、応用的な使い方だったので、知らないとなかなか思いつけない利用法だと思います。この記事を読んで、剰余の便利さを知っていただければ幸いです。

2回にわたってRPGツクールの「変数」について、「ゲームデータ」と「剰余」の活用法を解説してきました。もう一つぐらい変数について書けそうなので、第3回も近いうちに解説記事を上げると思います。そちらもどうぞお楽しみに。