開発日誌

テクニック

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

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回も近いうちに解説記事を上げると思います。そちらもどうぞお楽しみに。

[ テクニック ] 変数を使いこなそう(1) ゲームデータの活用法

2022-12-03 00:00:37

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

変数とは

RPGツクールシリーズには「変数」という概念があります。

プログラミングを嗜む人にとってはお馴染みの概念ですが、そうでない人にとっては最初につまずきやすい壁かもしれません。

ツクールの「変数」とは、数値を格納する箱のようなもののことです。

「スイッチ」がONかOFFかの二択の状態を表すのに対し、「変数」は任意の数を入れられます。数値なので四則演算や大小比較などもできます。

イベントコマンドの「変数の操作」では、指定した変数に任意の数値やゲーム内で定義されている値を、代入したり計算したりすることができます。

「条件分岐」では指定した変数の値が、ある値と等しいか、大きいか、小さいかなどで分岐させることが可能です。

その他、「数値入力の処理」では入力された数値を受け取る場所として変数を指定したり、「所持金の増減」や「HPの増減」などでは増減させる所持金やHPを変数で指定できたり、「場所移動」では移動先の座標を変数で指定することもできるなど、多数のイベントコマンドで変数は利用されます。

ツクールで凝った処理を作るには、この「変数」を使いこなすことが必須と言っても過言ではありません。

オペランド

変数で扱う数値は、「変数の操作」の「オペランド」で指定できます。

「オペランド」もプログラムを嗜む人でなければ馴染みがない言葉ですが、日本語に訳すと「被演算子」で、要は計算の対象となる値のことです。

オペランドは以下の5つから指定できます。

定数
固定の数値を直接指定します。
変数
指定した変数に格納されている数値を用います。
乱数
指定した範囲内の整数がランダムで選ばれます。
ゲームデータ
ゲーム内に登場する様々な値や番号が指定できます。
スクリプト
直接スクリプト(プログラム)を記述して値を取得します。やや高度な機能です。

上記のうち「ゲームデータ」が、単純なようでいてかなり奥が深く、またこれを制覇することこそが変数の使いこなしの第一歩でもあるため、以下で詳しく説明していきます。

ゲームデータ

オペランドで「ゲームデータ」を選択すると、デフォルトで「マップID」と表示されます。

このデフォルトが「マップID」という点が、ゲームデータで何ができるのかを分かりにくくしているのではないかと思うのですが、右欄の「...」をクリックするとさらにウィンドウが開き、様々な項目を選べるようになっています。

階層の深いところにあるため、そもそもどのような要素が指定できるのか、ある程度ツクールに慣れている人でも完全に把握するのは難しかったりします。

それぞれ、どんなことができるのか、具体的な使用例を交えて解説します。

アイテム・武器・防具の所持数

指定したアイテム・武器・防具の所持数を取得します。

単純に所持しているかどうかは条件分岐でできますが、例えば「ポーションを10個持っているか」など指定数だけ所持しているかどうかは条件分岐一発ではできません。

このような場合、いったんポーションの所持数を変数に取得して、その変数が10以上かどうかで条件分岐することで可能になります。

◆変数の操作:アイテムの個数 = ポーションの数
◆条件分岐:アイテムの個数 >= 10
 ◆文章:ポーション10個、ありがとう!
 ◆アイテムの増減:ポーション - 10
:それ以外のとき
 ◆文章:ポーション10個、持ってきてちょうだい!
:分岐終了

注意点として、武器と防具については、装備中のものは所持数に含まれません。

装備中のものも含めて1個でも所持しているかどうかは、条件分岐の武器・防具で「装備品を含む」にチェックをすれば判別できますが、装備中のものも含めて複数個所持しているかどうかを調べるには、やや面倒ですが以下のようにする必要があります。

◆変数の操作:アイテムの個数 = ショートソードの数
◆条件分岐:リードがショートソードを装備している
 ◆変数の操作:アイテムの個数 += 1
:分岐終了
◆条件分岐:プリシアがショートソードを装備している
 ◆変数の操作:アイテムの個数 += 1
:分岐終了
……(アクターの分だけ繰り返し)

最初に(装備品を除いた)武器・防具の所持数を変数に取得し、続いて各アクターがその武器・防具を装備していれば変数に1加算します。こうすることで、装備中のものも含めた所持数を取得することが可能です。

条件分岐するのはその武器・防具を装備可能なアクターだけで十分ですが、対象アクターの数が多いとさすがにやってられないので、スクリプトなどを利用した方がいいと思います。対象アクターが数人程度であれば、やや面倒でも1人1人確認していく方法が、分かりやすいのではないかと思います。

アクター・敵キャラのパラメータ

指定したアクターや敵キャラの指定したパラメータを取得します。

パラメータは、アクターの場合、レベル・経験値・(現在の)HP・(現在の)MP・最大HP・最大MP・攻撃力・防御力・魔法力・魔法防御・敏捷性・運・TPが取得できます。敵キャラの場合、レベルと経験値は取得できません。

MVの頃はTPが取得できなかったのですが、MZになってTPも取得できるようになりました。

基本のパラメータは全て取得できるようになっていますが、回避率や会心率、狙われ率などの追加能力値や特殊能力値、耐性などは取得できません。

また、対象者が固定でしか選択できないため、実際に活用しようとすると力業にならざるを得なかったりと、やや使いづらい印象もあります。

よくある使い方としては、パーティーのレベルによる分岐などでしょうか。

例えば主人公のレベルが10以上かどうかで分岐したい場合は、いったん主人公のレベルを変数に取得して、その変数が10以上かどうかで条件分岐します。

◆変数の操作:主人公のレベル = リードのレベル
◆条件分岐:主人公のレベル < 10
 ◆文章:レベル10になってから来い!
:それ以外のとき
 ◆文章:ワシと戦う権利をやろう……。
:分岐終了

特定のアクターではなく、パーティーの平均レベルを取得したいという場合も多いかと思います。

イベントコマンドだけで平均レベルを算出するのはやや面倒ですが、人数がそれほど多くない場合は以下のようにして求められます。

◆変数の操作:平均レベル = 0
◆条件分岐:リードがパーティーにいる
 ◆変数の操作:平均レベル += リードのレベル
:分岐終了
◆条件分岐:プリシアがパーティーにいる
 ◆変数の操作:平均レベル += プリシアのレベル
:分岐終了
……(アクターの分だけ繰り返し)
◆変数の操作:平均レベル /= パーティ人数

まず最初に変数に0を代入します。

続いてそれぞれのアクターについて1人ずつ、パーティーにいるかどうかで条件分岐し、いる場合は変数にそのアクターのレベルを加算します。パーティー構成が固定メンバーの場合は、パーティーにいるかどうかの条件分岐は省略できます。

これをアクターの人数分繰り返して、最後にその変数を「その他」の「パーティ人数」で除算(割り算)します。

こうすることで、パーティーの平均レベルが算出できます。

変数は標準仕様では整数しか受け付けないため、割り算の際に割り切れない場合は、小数点以下が切り捨てられます。四捨五入だったり、小数点以下が保持されたりはしない点にご注意ください。

なお、アクターが何十人もいる場合は、さすがにスクリプトを使った方がいいと思います。

他にアクターのパラメータを使った例として、主人公のHPが半分以下になった場合を考えてみます。

この場合、2つの変数を使います。

片方は現在のHPを取得、もう片方は最大HPを取得します。

そして、半分なので最大HPを2で除算(割り算)します。

そして条件分岐で、現在のHPが最大HPを2で割った値以下かどうかを判別すれば、HPが半分以下かどうかで分岐ができます。

◆変数の操作:現在のHP = リードのHP
◆変数の操作:最大HP = リードの最大HP
◆変数の操作:最大HP /= 2
◆条件分岐:現在のHP <= 最大HP
 ◆文章:だいぶ消耗しているわね。
 ◆アニメーションの表示:プレイヤー, 回復/単体1(ウェイト)
 ◆全回復:リード
:それ以外のとき
 ◆文章:まだ元気そうね。
:分岐終了

慣れている人は、以下のように1つの変数だけでも、同じ処理ができます。

◆変数の操作:HP判別用変数 = リードの最大HP
◆変数の操作:HP判別用変数 /= 2
◆変数の操作:HP判別用変数 -= リードのHP
◆条件分岐:HP判別用変数 >= 0
 ◆文章:だいぶ消耗しているわね。
 ◆アニメーションの表示:プレイヤー, 回復/単体1(ウェイト)
 ◆全回復:リード
:それ以外のとき
 ◆文章:まだ元気そうね。
:分岐終了

何をしているかというと、最初に変数に最大HPを代入します。次に2で割って最大HPを半分にします。最後にそこから現在のHPを減算(引き算)します。

結果が0以上であれば、現在のHPが半分以下ということになります。結果が0未満(マイナス)であれば、現在のHPが半分より大きいことになります。

キャラクターの位置や向き

指定したキャラクターの位置や向きを取得します。

キャラクターは、プレイヤー、このイベント(現在起動中のイベント)、および現マップ中のイベントが指定でき、指定したキャラクターのマップ座標・向き・画面座標が取得できます。

特定の場所で使うと効果のあるアイテムを作る場合、プレイヤーの「マップX」と「マップY」、および「その他」にある「マップID」をそれぞれ変数に代入し、特定の値かどうかを判別することで実現できます。

◆変数の操作:現在のマップID = マップID
◆変数の操作:現在のX座標 = プレイヤーのマップX
◆変数の操作:現在のY座標 = プレイヤーのマップY
◆条件分岐:現在のマップID = 5(対象のマップID)
 ◆条件分岐:現在のX座標 = 20(対象のX)
  ◆条件分岐:現在のY座標 = 10(対象のY)
   ~アイテムの効果~
   イベント処理の中断
  :分岐終了
 :分岐終了
:分岐終了
◆文章:しかし何も起こらなかった。

会話イベント中、「文章の表示」の直前に「移動ルートの設定」で「完了までウェイト」のチェックを外してキャラクターを移動させると、話をしながらキャラを動かすことができます。

この時、次の台詞はキャラの移動が終わってからにしたい場合、キャラが移動し終わったかどうかの判別は、ループを使って次のようにします。

◆移動ルートの設定:対象キャラ
:        :◇下に移動
:        :◇下に移動
:        :◇下に移動
◆文章:ようこそ。いらっしゃいませ。
◆ループ
 ◆変数の操作:Y座標 = 対象キャラのマップY
 ◆条件分岐:Y座標 = 20(着地点)
  ◆ループの中断
 :分岐終了
 ◆ウェイト:1フレーム
:以上繰り返し
◆文章:私がこの屋敷の主です。

その他、ミニゲーム等でオブジェクトの位置を把握したり、任意の地点からキャラクターを移動させたりする場合に、座標の取得は頻繁に利用されます。

パーティーのN番目のメンバーのアクターID

パーティー内の指定したメンバーのアクターIDを取得します。

指定した順番のメンバーがいない場合は0となります。

メンバーの入れ替えや並び替えができる作品では重要な役割を果たします。

ただシステム上、パーティーには何人でもメンバーを追加できるのですが、変数の操作で指定できるのは8番目のメンバーまでです。なんでだよ!

コアスクリプト的にも別に8人まででなければならない理由もなく、純粋に選択リスト上の仕様のように思えます。リストボックスじゃなくて、数値入力にしてくれれば、そんな制限なくていいはずなのに。

もっとも、パーティーメンバーが多い場合は、イベントコマンドでやるよりもスクリプトを使った方がはるかに効率的なので、8人までしか指定できなくても、それほど影響はないかもしれません。

イベントコマンドで「HPの増減」や「ステートの変更」「スキルの増減」など、アクター関連のコマンドの中には、対象アクターを変数で指定できるコマンドもあります。

先頭のメンバーだけ何らか影響を与えたいような場合、まず変数に1番目のメンバーのアクターIDを取得し、次に対象のアクターをその変数で指定します。

ただ、対象のアクターに変数が使えるのは「スキルの増減」までで、装備・名前・職業・二つ名・プロフィールの変更は、対象のアクターを変数で指定することができません。

装備の変更は装備の可不可もあるので分からないでもないですが、「装備の変更」(装備を外す)と「職業の変更」で変数が使えれば、ドラクエ3みたいな転職システムを作る場合に役立つのに、と思います。

また、アクターのパラメータを変数に取得する場合も、対象のアクターを変数で指定できれば、イベントコマンドでできる範囲が広がるのですが、固定でしか指定できないのが残念でなりません。

その他よく使う使い方としては、パーティーの先頭のメンバーに応じて台詞を変えるような場合が考えられます。

この場合、メンバー#1のアクターIDを変数に取得して、そのアクターIDによって分岐すればOKです。

◆変数の操作:アクターID = パーティメンバー1番のアクターID
◆条件分岐:アクターID = 1
 ◆文章:やあ、リード君。今日はいい天気だね!
:分岐終了
◆条件分岐:アクターID = 2
 ◆文章:やあ、プリシアちゃん。今日もかわいいね!
:分岐終了
……(アクターの分だけ繰り返し)

アクター名だけであれば、制御文字を使って \N[\V[x]] のように記述もできます。xにアクターIDを取得した変数の番号を指定します。

選択肢でパーティーのメンバーを選ばせたい時などに役立ちます。

◆変数の操作:#0001 = パーティメンバー1番のアクターID
◆変数の操作:#0002 = パーティメンバー2番のアクターID
◆変数の操作:#0003 = パーティメンバー3番のアクターID
◆変数の操作:#0004 = パーティメンバー4番のアクターID
◆選択肢の表示:\N[\V[1]], \N[\V[2]], \N[\V[3]], \N[\V[4]]
:\N[\V[1]]のとき
 ◆変数の操作:アクターID = #0001
:\N[\V[2]]のとき
 ◆変数の操作:アクターID = #0002
……(アクターの分だけ繰り返し)
:分岐終了

厳密にやる場合はパーティーの人数などに応じてさらに分岐させる必要がありますが、選択肢の中で変数に選んだアクターIDを取得して、そのアクターIDのアクターに対する操作を行うことができます。

直前

「直前」はRPGツクールMZから追加された新機能で、MV以前にはありません。

  • 直前に使用したスキルのID
  • 直前に使用したアイテムのID
  • 直前に行動したアクターのID
  • 直前に行動した敵キャラのインデックス
  • 直前に対象となったアクターのID
  • 直前に対象となった敵キャラのインデックス

の6つから選べます。

いずれもアイテムやスキルから呼び出されるコモンイベントで活用するのが中心的な使い方になるでしょう。

「直前」と言っていますが、アイテムやスキルから呼び出したコモンイベント内では、そのアイテムやスキル、使用者や対象者が取得できるので、ご安心ください。

いくつか代表的な使い方としては、副作用のあるスキルが挙げられます。

例えば敵に大ダメージを与える代わりに、自分がスタンしてしまうスキルの場合、スキルの使用効果にコモンイベントを設定し、そのコモンイベントでは、変数に「直前に行動したアクターのID」(=使用者のアクターID)を取得し、「ステートの変更」で対象アクターにその変数を指定し、スタンを付加すればOKです。

◆変数の操作:アクターID = 直前に行動したアクターのID
◆ステートの変更:{アクターID}, + スタン

ただ、アクターの場合は「ステートの変更」で対象者を変数で指定できるので楽ですが、敵キャラにも同じことをさせたい場合、「敵キャラのステート変更」では変数指定できないので、敵キャラのインデックスを1~8まで判定してやる必要があり、かなり面倒です。

◆変数の操作:敵キャラ = 直前に行動した敵キャラのインデックス
◆条件分岐:敵キャラ = 1
 ◆敵キャラのステート変更:#1, + スタン
:分岐終了
◆条件分岐:敵キャラ = 2
 ◆敵キャラのステート変更:#2, + スタン
:分岐終了
……(8まで繰り返し)

その他、能力値アップ系のアイテムは、普通に作ると固定値でアップさせることしかできませんが、上昇量をランダムにしたい場合、「直前に対象となったアクターのID」と「直前に使用したアイテムのID」を用いて、以下のようにすることができます。

◆変数の操作:アクターID = 直前に対象となったアクターのID
◆変数の操作:アイテムID = 直前に使用したアイテムのID
◆変数の操作:上昇量 = 乱数 1..3
◆条件分岐:アイテムID = 31(最大HPアップアイテム)
 ◆能力値の増減:{アクターID}, 最大HP + {上昇量}
:分岐終了
◆条件分岐:アイテムID = 32(最大MPアップアイテム)
 ◆能力値の増減:{アクターID}, 最大MP + {上昇量}
:分岐終了
……(該当のアイテム分だけ繰り返し)

その他

最後に「その他」の項目で、様々な値を取得することができます。

取得できる値は読んで字のごとくですが、中には意外な応用ができるものもあり、なかなか奥が深くなっています。

「パーティ人数」は、現在のパーティーメンバーの人数を取得する項目です。

所定の人数が揃っていないと先へ進めないようにしたり、1人でないと入れないダンジョンを作ったりする時に役立ちます。

それ以外にも前述の通り、パーティーの平均レベルを算出する時や、パーティーメンバーの選択肢を作る時などに使えます。

「所持金」は、現在所持しているお金を取得できます。

例えば、全滅時に所持金を半分にしたい場合、以下のようにします。

◆変数の操作:減額分 = 所持金
◆変数の操作:減額分 /= 2
◆所持金の増減:- {減額分}

その他の使い方としては、ショップで買い物をする前と後とで所持金を比較することで、購入したか否かを判別することができます。

◆変数の操作:事前所持金 = 所持金
◆ショップの処理:……
◆変数の操作:事後所持金 = 所持金
◆条件分岐:事前所持金 ≠ 事後所持金
 ◆文章:毎度ありがとう!
:それ以外のとき
 ◆文章:冷やかしなら余所へ行ってくれ!
:分岐終了

ただし実際には、同時に売却を行って前後の所持金が同じになったケースも考えられるため、厳密な判別ではありません。購入のみで売却ができないショップであれば、所持金の比較で十分でしょう。

「歩数」は、単に歩いた歩数を取得するだけでなく、前後で比較することで、1歩移動したかどうかの判別に利用できます。

例えば並列処理するコモンイベントで歩数を比較すれば、1歩歩いた時の処理を行うことができます。

◆変数の操作:現在の歩数 = 歩数
◆条件分岐:現在の歩数 > 前回の歩数
 ~1歩歩いた時の処理~
:分岐終了
◆変数の操作:前回の歩数 = 現在の歩数

「プレイ時間」は、ゲームスタートから現在までのプレイ秒数を取得できます。一定時間で復活する敵キャラや宝箱などを実装する際に役立ちます。

「セーブ回数」は、文字通りセーブを行った回数を取得するものですが、コモンイベントの並列処理で上述の歩数と同様にセーブ回数を比較することで、セーブを行った直後に何らかの処理を行うことができます。

また、セーブポイントでセーブする仕組みの場合、前後でセーブ回数を比較することで、実際にセーブを行ったかキャンセルしたかを判別することができます。

「戦闘回数」なども、並列処理で回数を比較することで、ランダムエンカウントの戦闘終了後に処理を挟むことができます。

まとめ

以上、「変数の操作」の「ゲームデータ」の中身を解説してきました。

階層が深いところにあったり、ツクールのバージョンによって機能が追加されていたりするため、ベテランツクラーでもなかなか使いこなすのは難しいです。

ぱっと見では何に使えるのかピンと来ない項目もありますが、意外な使い方ができる項目もあったりして、使いこなせればいろいろな複雑な処理も、プラグインを使わずとも実装できる場合があります。

皆さんもぜひ、変数を使いこなしてみてください。

今回は変数のうち、「ゲームデータ」の活用法を解説しましたが、変数にはこれ以外にまだまだたくさんの使い方があります。そちらも近いうちに解説記事を公開する予定ですので、どうぞお楽しみに。

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 敵キャラの複数回行動を細かく制御・2

2022-10-15 19:10:14

以前公開した「複数回行動条件設定プラグイン(PANDA_MultiAction.js)」の、バージョン2を作成しました。

RPGツクールMV/MZ両対応です。

※ Version 2.1.0 (2024-02-23)
n回目行動が設定されていないと行動しなくなる不具合を修正しました。

機能は特に変わっていませんが、複数回行動の条件の設定方法を刷新しています。

以前のバージョンは、敵キャラのメモ欄に行動パターンのインデックス番号を記述する方式だったのですが、インデックス番号が画面上に表示されているわけではないので、番号を数えるのが面倒でした。

新しいバージョンではそれを改善して、「行動パターン複数条件プラグイン(PANDA_ActionMultiCondition.js)」と同様の、ダミースキルを利用した指定方式に変更しました。

インデックス番号を数える必要もなく、行動パターンのリスト内で直接設定できるため、より直感的に条件設定を行うことができるでしょう。

敵キャラの複数回行動と行動パターン

以前の記事「敵キャラの複数回行動を細かく制御」と重複する内容になりますが、VX Ace以降のRPGツクールでは、特徴の「行動回数追加」で、1ターンに2回以上行動する敵キャラを簡単に作成できます。

しかし、複数回行動の内訳を自由に決めることはできないため、場合によっては同じ補助魔法を2回連続で唱えてしまったり、凶悪な全体攻撃を2回連続で放ってきたりといった事態に陥ります。

そこで役立つのが、複数回行動での条件を細かく設定できる、本プラグインです。

このプラグインを使えば、2回行動のうち1回目は通常攻撃で2回目は魔法攻撃とか、1回目は攻撃魔法で2回目は補助魔法とか、強力な全体ブレス攻撃の場合は1回行動で終了とかいった、細かい調整が可能になります。

旧バージョンとの違いは設定方法だけで、基本コンセプト等は一切変わっていません。複数回行動の制御について詳しくは、上記の記事も参考にしてください。

事前準備

今回のバージョンは事前準備が必要です。

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

1つは複数回行動のうち特定の回にのみ有効な行動を指定するスキル。もう1つはその行動で複数回行動を終了させるためのスキルです。

名前は何でもいいですが、それぞれ「↓n回目行動」「↓行動終了」などとしておくと、分かりやすいかと思います。

ダミーのスキルなので、スキルの設定内容は何も変更しなくてOKです。

そしてこれらのスキルを、プラグインパラメータの「n回目行動条件スキル」と「行動終了条件スキル」にそれぞれ設定します。

以上で事前準備は完了です。

n回目行動条件

このプラグインでは、上記で設定したダミースキルを敵キャラの行動パターンとして組み込むことで、行動パターンの条件設定を行います。

複数回行動のうち特定の回にのみ有効な行動を指定するには、上記で指定した「n回目行動条件スキル」とレーティングの値を利用します。

「n回目行動条件スキル」以降の行動パターンは、複数回行動のうちレーティングで指定された値の回でのみ有効な行動となります。

設定の有効範囲は、次の「n回目行動条件スキル」が登場するまでです。

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

スキル R
↓n回目行動 1
攻撃 5
ファイア 4
アイス 4
↓n回目行動 2
ヒール 5
体当たり 5

2回行動のうち、1回目の行動では「攻撃」「ファイア」「アイス」のいずれかが、2回目の行動では「ヒール」「体当たり」のいずれかが、行動パターンとして選択されます。

レーティングの値はデフォルトが5なので、間違えないように注意してください。

「n回目行動条件スキル」における採用条件の設定は無視されます。

最初の「n回目行動条件スキル」が登場するまでに設定された行動パターンは、全ての回で採用候補となります。

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

スキル R
攻撃 5
↓n回目行動 1
6
↓n回目行動 2
ウェポンブレス 4
アーマーブレス 4

2回行動のうち、1回目の行動では「攻撃」「炎」のいずれか、2回目の行動では「攻撃」「ウェポンブレス」「アーマーブレス」のいずれかとなり、「攻撃」は常に採用候補となります。

3回行動のうち、1回目と3回目で有効な行動とか、2回目と3回目で有効な行動とか、そういった指定の仕方はできません。そのようなパターンを指定したい場合は、お手数ですがそれぞれの回で行動パターンを設定してください。

また、レーティングに設定できる値は9までなので、1ターンに10回以上行動する敵キャラは指定できませんが、そんなに行動させることもないだろうということで、この方式を採用しています。

行動終了条件

普段は2回行動するけれど、大技を放ったターンは手加減のため1回で行動を終えたい、というケースがあります。

そういう場合に活用できるのが「行動終了条件スキル」です。

このダミースキルが設定された以降の行動パターンは、その行動で複数回行動を終えるようになります。

ダミースキルのため、条件やレーティングの設定は無視されます。

設定の有効範囲は、次の「n回目行動条件スキル」が登場するまでです。

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

スキル R
攻撃 5
↓n回目行動 1
ファイア 5
↓行動終了 1
フレイム 4
↓n回目行動 2
アイス 5
↓行動終了 1
ブリザード 4
↓n回目行動 3
ヒール 5

3回行動のうち、1回目の行動では「攻撃」「ファイア」「フレイム」のいずれかが選択され、「フレイム」が採用された場合はそこで行動を終了します。

2回目の行動では「攻撃」「アイス」「ブリザード」のいずれかが選択され、「ブリザード」が採用された場合はそこで行動を終了します。

3回目の行動では「攻撃」「ヒール」のいずれかが選択されます。

全体が大ダメージを受けるような大技の際にも複数回行動が発動すると、プレイヤーの負担が大きくなります。この行動終了の仕組みを利用すれば、適度なバランス調整が行えるでしょう。

複数条件プラグインとの併用

拙作「行動パターン複数条件プラグイン(PANDA_ActionMultiCondition.js)」との併用も可能です。本バージョンで、より併用がしやすくなりました。

例えば右のような行動パターンの場合、3回目の行動、かつHPが0~70%の範囲で、かつターン数が2+3*Xに合致する場合のみ、ヒールが行動候補となります。

「複数条件プラグイン」による追加条件の指定は、直後の行動パターンのみに影響するのに対して、本「複数回行動条件設定プラグイン」によるn回目行動条件と行動終了条件の指定は、次のn回目行動条件が登場するまで影響する、という違いがあります。どちらも、その仕様の方が使いやすいため、このようにしているのですが、間違えないよう注意してください。

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