開発日誌

すべての記事

[ サイト情報 ] [ その他の雑記 ] 2022年総括

2022-12-31 20:43:02

ついこないだ2022年が始まったばかりだと思っていたのに、もう2022年が終わるということなので、大晦日恒例の総括の時間がやって参りました。

2022年は前年に引き続き、新作の王道長編RPGの制作に明け暮れた1年でした。本当は今年の秋頃には完成しているはずだったのですが、途中いろいろと難航したため思ったようにはいかず……。今のところは来年の秋頃完成のスケジュールとなっています。

制作状況等についてはtwitterの方でこまめに紹介していますので、ぜひフォローして見ていただけるとありがたいです。

今年の大きなイベントとしては、『夫婦戦争MZ(まさに絶体絶命)』のスマホアプリ化でしょう。

もともとブラウザゲームとして公開していましたが、ぬか漬けパリピマン様にスマホアプリ化をしていただきました。

iPhone(iOS)版Android版の両方があります。

試行錯誤によってハッピーエンドを目指す、パズル的な要素を持ったミニゲームです。気になった方は、App Store、またはGoogle Playストアで、今すぐ「夫婦戦争MZ」で検索!

RPGツクールMV/MZ用のプラグインは引き続き、デフォルトではちょっと不便な仕様を改善するようなプラグインをいろいろと作ってきました。

反響が大きかったのは「行動パターン複数条件プラグイン」でしょうか。

ダミースキルを用いて、敵キャラの行動パターンに複数の条件を指定できるようにするプラグインで、応用範囲の広さやスマートな指定方法という点でも、会心のプラグインとなっています。

このダミースキルによる設定方法は「複数回行動条件設定プラグイン2」でも活用しています。

このほか、数値入力ウィンドウにキャンセルボタンを追加したり、入力可能な数値の最小値・最大値を設定できる「数値入力ウィンドウ強化プラグイン」や、アイテムやスキルの使用可否をスイッチで制御できる「使用可否スイッチ制御プラグイン」なども、反響の大きいプラグインでした。

12月には再び「ツクールアドベントカレンダー Advent Calendar 2022」に参加し、「変数」に関する記事を2本投稿しました。

変数の概念は、ベテランのツクラーやプログラミングを嗜む人にとってはお馴染みのものですが、慣れていない人にとってはなかなか理解しづらい概念のようで、役に立ったという声も複数いただいております。

アドベントカレンダーにまだ空きがあれば後半でもう1本書く予定でしたが、いつ頃にしようかと悩んでいるうちに全部埋まってしまったので、残りの1本は年明けに書くことにします。ホントかな。

2022年は、ツクール界にも変化の大きい1年でした。

まずは2月15日の「ツクールの日」に、新しいツクールシリーズである「RPG Maker Unite」が発表されるとともに、今後は「RPGツクール」のブランド名称を、英語圏でのブランド名称である「RPG Maker」に統一するという発表が、公式からなされました

RPGツクールMZが出てからわずか2年で次シリーズの発表に驚かされましたが、どうやらこのUniteは、ゲームエンジンであるUnity上で動作する開発ツールのようで、既存のMVやMZの系譜とは異なるシリーズになるようです。MZ系列のシリーズは引き続き開発が行われるという公式アナウンスもある通り、ツクールフェスやMV TrinityのようなCS版ツクールと同様の扱いになるものと見ています。当初は2022年中に発売とされていましたが、2023年に延期となった模様です。

このほか、ツクールシリーズとは完全に別物ですが、10月に「RPG Developer Bakin」が発売され、話題を集めました。

ツクールが基本的に2Dグラフィックなのに対して、このBakinは3Dグラフィックであり、自由度の高いレイアウトや美麗なエフェクトなどで目を惹きました。

私も好奇心に抗えず、アーリーアクセス版を発売当日に買って触ってみましたが、そもそも3Dというところの取っ付きにくさや、さすがにちょっと重いという点、また細かい部分で何かと融通が利かないという点が慣れずに、少し触ってみただけで終わっています。3D世界を冒険するような作品は作ってみたいと思っているので、もう少しノウハウが一般化した段階で、改めて触ってみたいと思います。

また自分は使ったことありませんが、ウディタこと「WOLF RPGエディター」も11月に大規模アップデートがあり、RPG制作は多彩な環境が出てきた1年でした。

その一方で、年末になって「ゲームアツマールのサービス終了」という残念なニュースも飛び込んできました。

他にもフリーゲームの公開サイトやブラウザゲームとしてプレイできるサイトは複数ありますが、その中でも「ゲームアツマール」は、ツクールから直接アップロードする機能もあるなど、ツクールシリーズとは非常に親和性の高いサービスでもありました。ニコニコ動画のコンテンツの一つであるため、フリーゲームを探してプレイしようという人以外にもリーチできる、唯一と言ってもいいサービスでした。また、手軽にコメントできるのでフィードバックがもらいやすかったり、審査等もないので即座にアップデートが反映ができたり、何より他に比べてサイトの見映えが良いなど、他より図抜けた存在だと思っていましたが、そんな大手でも運営は赤字だったとのことなので、フリーゲームを取り巻く環境はいっそう厳しくなっていくものと思われます。

というわけで、最後はちょっと暗い話になってしまいましたが、今後もフリーゲームを盛り立てるために、プラグインやテクニックの紹介、そして楽しんでもらえる作品を作っていきたいと思います。

2023年も引き続きどうぞよろしくお願いいたします。

[ テクニック ] 変数を使いこなそう(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両対応です。

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

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

新しいバージョンではそれを改善して、「行動パターン複数条件プラグイン(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回目行動条件が登場するまで影響する、という違いがあります。どちらも、その仕様の方が使いやすいため、このようにしているのですが、間違えないよう注意してください。

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 隊列歩行のメンバーを操作

2022-09-24 22:31:33

RPGツクールMZで、隊列歩行のメンバーの向きを変えたり、現在の位置を取得したり、キャラクターをイベントに変換して自由に動かしたりできるような、プラグインを作成しました。

いずれもプラグインコマンドで操作するようになっているため、RPGツクールMZ専用のプラグインとなっています。

システムのオプション設定で「パーティの隊列歩行」にチェックを入れると、いわゆるドラクエのように、主人公の後ろをパーティーの仲間メンバーがついてくるようになります。

これを隊列歩行と呼び、最近ではRPGツクールVX Ace以降で採用されています。(かつてはRPGツクール95にもあった)

しかし、この隊列歩行のメンバー(ツクールの用語的にはフォロワー)を直接操作するイベントコマンドは用意されておらず、イベント等で隊列メンバーを動かしたりしたい時に困ります。

そこで、プラグインコマンドを使って隊列メンバーを操作できるようにしました。

用途に応じてプラグインコマンドは3種類あります。

  • 隊列メンバーの向き指定
  • 隊列メンバーの位置取得
  • 隊列メンバーをイベントに変換

以下、1つずつ使い方を解説します。

隊列メンバーの向き指定

対象のメンバーを指定した向きに向かせるプラグインコマンドです。

対象となる隊列メンバーと、向かせたい向きの2つをパラメータで指定します。

代表的な使い方としては、イベントキャラに話しかけて、隊列メンバーがそれに対して反応を返すような時、隊列メンバーがそのイベントキャラの方向を向いていない場合があります。

このままだと、あさっての方向を向いたまま隊列メンバーキャラが話すことになってしまいます。そこでこのプラグインコマンドで対象キャラの向きを変えてやれば、ちゃんと相手の方向を向いて話すようになるので、自然な演出ができます。

▲あさっての方向を向いて喋るプリシア

▲ちゃんと前を向いて喋るようになった

対象となるメンバーは番号で指定します。1を指定すると1人目の隊列メンバー、すなわち2人目のパーティーメンバーを指定したことになるので、注意してください。1人目のパーティーメンバー、すなわち主人公キャラの向きを変えたい場合は、普通に「移動ルートの設定」で設定してください。

また、対象となる隊列メンバー番号に0を指定すると、隊列歩行のメンバー全員の向きを同時に指定できます。

向きは、上下左右の4方向のほか、プレイヤーキャラクターと同じ向きを指定することも可能です。

何かを発見したり、誰かと会話するようなイベントで、メンバー全員に同じ方向を向かせたい場合は、隊列メンバー番号に0を、向きに「プレイヤーと同じ向き」を指定してやれば、たいていの場合は自然な動きになります。

隊列メンバーの位置取得

指定した隊列歩行メンバーの、現在の位置(マップXY座標)と向きをそれぞれ変数に取得するプラグインコマンドです。

対象となる隊列メンバーの番号と、それぞれマップX座標、マップY座標、向きを受け取る変数を指定します。

隊列メンバー番号は前述の「隊列メンバーの向き指定」と同様に、1が1人目の隊列メンバー(2人目のパーティーメンバー)となります。主人公キャラの位置や向きは、普通に「変数の操作」のゲームデータで取得が可能です。0で全員の指定とかは当然できません。

変数は一部の項目のみ指定することもできます。位置だけ取得できればよくて向きは不要、といった場合には、向きの変数指定を「なし」にすればOKです。

想定している使い方としては、通せんぼしているキャラを移動させる際に、隊列歩行のメンバーの現在位置を取得して条件分岐し、隊列歩行と重ならないように移動させるとか、隊列メンバーの現在地や向きに応じて他のキャラを移動させたりといったケースが考えられます。

▲左にケイシーがいる場合は右によける

▲右にケイシーがいる場合は左によける

また応用として、隊列メンバーにアニメーションやフキダシアイコンを表示することも、標準機能ではできませんが、以下のようにすれば実現できます。

  1. 透明の画像を設定したダミーイベントを用意する
  2. 対象となるメンバーの位置を変数に取得する
  3. イベントの位置設定でダミーイベントの位置を変数で指定する
  4. ダミーイベントに対してアニメーションやフキダシアイコンを表示させる
  5. ダミーイベントを邪魔にならない位置に戻す

▲ダミーイベントをメンバーの位置に移動

▲隊列メンバーにフキダシアイコンを表示

隊列メンバーをイベントに変換

本プラグインのメイン機能にして、使い方もやや難しいプラグインコマンドです。

このコマンドを使うと、隊列歩行メンバーのキャラクターをイベントに変換することができます。変換後は単なる通常のイベントとなるため、移動ルートの設定やフキダシアイコンの表示、アニメーションの表示など、自由自在な演出が可能です。

使い方としては、まずマップ上に隊列メンバー用のイベントを設置します。画像は空、位置はマップの端などどこでもOKです。オプションで「すり抜け」にチェックをしておくと、障害物に引っかかって動きが止まるのを避けられるのでよいかもしれません。

そしてイベント内でこのプラグインコマンドを発動させます。

イベントIDリストに、1番目の隊列歩行メンバー(2人目のパーティーメンバー)から順番に、変換先のイベントのID番号を指定します。

こうすると、隊列メンバーの現在位置・向き・画像が、指定されたイベントにそれぞれ引き継がれ、隊列歩行のグラフィックは消えます。

あとは、このイベントを隊列メンバーとして動かしてやればOKです。

一部のメンバーだけイベントに変換したい場合は、イベントIDに0を指定すると、そのメンバーはイベントに変換されません。

また、オプションとして「隊列歩行継続」のON/OFFがあります。ONにすると隊列歩行は継続したままになるので、一部のメンバーのみイベントに変換してパーティーから離脱させる場合は役に立ちます。逆に全メンバーをイベントに変換する場合はOFFを指定して、イベント終了後に再度集合させ、イベントコマンドの「隊列歩行の変更」でONにしてやるといいでしょう。

隊列歩行からイベントシーンに突入する際、一度暗転を挟んで、その間に隊列歩行を解除してメンバーキャラクターをイベントとして配置するといった手法が、ツクール製の作品ではよく用いられます。

しかし、いちいち暗転を挟むとテンポが悪くなったり、またイベント作成上の都合であることがどうしても垣間見えてしまいます。

シームレスにイベントシーンに突入したい場合は、このプラグインコマンドが役に立つでしょう。

ただし、隊列メンバーの取り得る位置は数十パターンに及ぶため、キャラを動かす際はそれぞれの初期位置での場合分けがけっこう大変です。

まとめ

イベントキャラの操作系コマンドでは、プレイヤーや「このイベント」を操作することは可能ですが、隊列メンバーを直接的に操作する仕組みは、標準では用意されていません。

おそらく隊列メンバーは人数に決まりがないため、標準機能として用意するには、UI的にも簡単ではないのでしょう。

隊列歩行のメンバーを操作するプラグインは他にもいくつかありましたが、よく使う向きの変更や位置の取得に簡易なプラグインコマンドが欲しかったので、自分でプラグインを作成しました。

隊列メンバーをイベントに変換するコマンドは、やや癖があって使い方が難しいかもしれませんが、一度イベントに変換してしまえば、後は通常のイベントと同じように扱えるため、コツさえ掴んでしまえば、非常に便利だと思います。

このプラグインコマンドを使って、隊列歩行の仲間たちもイベントシーンに参加させてやると、演出効果が高まることでしょう。

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