開発日誌

テクニック

[ テクニック ] RPG制作におけるExcel整理術

2020-12-04 00:00:28

本記事は「ツクールフォーラムアドベントカレンダー Advent Calendar 2020」12月4日分の投稿記事です。

短編ならともかく、ある程度の長さのRPGを作ろうと思ったら、スイッチや変数の管理、武器・防具や敵キャラのパラメーター調整など、管理・調整する内容がいろいろあります。

RPGツクールの「データベース」は、その名の通り、それらの項目を管理できるメニューになっていますが、この中で直接バランス調整などを考えるのはかなり大変です。

これらの管理・調整方法はツクラーによって千差万別だと思いますが、私はExcelを使って管理していますので、それを紹介します。もちろんExcelでなくとも、Googleスプレッドシートなどの表計算ソフトなら、同じように使えると思います。

世の中にはExcelでRPG自体を作っちゃう猛者もいるそうですが、私はそこまで奇人ではないので管理・調整のみExcelで。RPGの実装はRPGツクールでやりますw

メインストーリー管理

まずはExcelファイルを1つ作成しましょう。全てはここから始まる……。

基本的に1作品で1ファイルを使い、各種データはそれぞれシートを作って管理します。

ストーリープロット

まず管理する代表的なものとしては、メインストーリーのプロットでしょう。

これは『小さな大冒険』の時のストーリープロットです。

細かい台詞などは別で作るとして、全体的なストーリーの構成をこんな感じで簡潔に書いておきます。各イベントの想定レベルなども設定しておくと後々便利です。

登場人物

登場人物なども別シートでまとめておくと便利です。

私のはそこまでキャラゲーではないので必要最低限の設定しかしていませんが、もっといろいろな設定を記載してもいいでしょう。名前とかは油断していると似た名前になってしまったりもするので、こういう風にまとめておくと便利ですし、アイデアノート的に名前の候補だけを先に作っておくといった使い方もできます。

台詞はテキストファイルで

なお、個別のイベントやキャラクターの台詞については、当初は同じようにExcelで管理していたのですが、あまりに面倒だったため、普通にテキストファイルで下書き&管理しています。

ただ、パラメーターの値や進行状況など様々な条件によって細かく台詞が変わるような場合は、条件の設定漏れを防ぐためにも、Excelで管理するメリットがあるでしょう。

データベース管理

Excelを使うことで最もメリットの大きいのが、武器・防具や敵キャラ、スキルなどの管理・調整でしょう。

いきなりツクール本体でデータを作っていくよりも、まずはExcel上で準備をしておくと、アイデアも広がりやすいし修正もしやすいです。

もちろん全部を完璧に決めておく必要はありませんが、例えば、武器ならどんな種類をいくつぐらい用意するか、1段階上がるごとにどのくらい価格と威力を上げていくか、といった大枠程度を決めておきましょう。その辺をあらかじめ決めておけば、後で破綻せずに済みます。

装備品

これは『小さな大冒険』の時に作った装備品のシートです。

こんな感じで、それぞれの名前、価格、装備可能者、能力値、属性などを入力します。特別な追加攻撃や耐性などは備考欄に記載します。

一番右の「効率」では、「価格÷攻撃力or防御力」を数式で計算させています。特殊効果などもあるので一概には言えませんが、この値がだんだん上がっていくように価格と能力値を設定すると、自然なバランスになると思います。

Excelを使うことによって、このように自動でバランスを確認できたり、また複数のアイテムを同時に比較できます。ツクール本体でやるよりも調整がずっと楽でしょう。

敵キャラ

こちらは新作RPGで使っている敵キャラのデータシートです。

名前や攻撃パターン、強さや戦利品、属性やステートの有効度などを一覧にしています。こうして一覧にしておけば、前後で強すぎたり弱すぎたりといったバランスの確認や調整も容易です。

ここで入力した内容は、別途「エクセルで敵キャラかんたん設定」で紹介したExcelツールにコピペして、ツクール本体に反映させています。

コモンイベント・スイッチ・変数

あと重要なのが、コモンイベントスイッチ変数の管理です。

右は『天下御免!からくり屋敷』の時のリストですが、長編だと数が多くなるので、こんな感じで一覧にしておくと管理しやすいです。

スイッチや変数については、以下のような管理方法がよく推奨されます。

  • ゲーム全体で使用する共通的なものやシステム的なものは前半に配置し、個別のイベントで使用するものは後半に持って行く。
  • 例えばある一連のイベントで51〜57番までのスイッチを使ったとしたら、その次のイベントで使うスイッチは58番から始めずに、61番から始めるなど適宜間隔を空けて、後で追加が発生しても大丈夫なようにする。

こうした管理もExcelを使って一覧にしておくと、非常にやりやすいでしょう。

その他の管理

このほか、スキルの設定やステート、アニメーションなど、数の多いものはExcelで管理しておくと、必要なものが漏れてないかとか、前に作ったのを忘れて二重に作ろうとしてないかなど、簡単に確認できるのでお勧めです。

欠点は、Excelでは直したけどそれをツクール本体に反映し忘れていたとか、ツクール本体でちょっと直したのをExcelに反映し忘れていたといったことが、ついつい起こりがちなことです。その点さえ気を付ければ、データベースはExcel管理が非常にオススメです。

それ以外にも、プラグインや画像、音楽など、他者の素材を多用している場合は、それらの情報をシートにまとめておくと、後で出展が分からなくなったり、Readmeテキストに掲載し忘れたり、といったことを避けられます。

Excelの機能を駆使してバランス調整

さて、ここまでは割と普通のExcel管理でしたが、ここからややマニアックな世界に……。

Excelを駆使すれば、細かいバランス調整もやりやすくなります。

進行バランス確認

炎系の敵が多く登場するエリアに行く直前で氷魔法を覚えたり、毒治療の魔法を覚えた直後に毒を使ってくる敵が現れると、バランス調整が上手いゲームだなと感じます。これはそうした進行におけるバランス調整を行うシートです。

最初のストーリープロットをもとに、各エリアと想定到達レベルを入力します。そして、そのエリアで想定している敵キャラの種別と一緒に、そのレベルでどんなスキルを覚えているか、どんな装備品が入手できているかを横串で見ていくことで、この魔法はもう少し早く覚えてないといけないとか、こういう武器が手に入るならそれが有効となるような敵を出さないといけない、といった調整がしやすくなります。

敵の強さシミュレーション

これは敵の強さをシミュレーションするシートです。

左上のセルに敵キャラ名を入れると、VLOOKUP関数で「敵キャラ」のシートから各能力値が自動的に引っ張られてくるようになっています。こんな感じです。

=VLOOKUP($C2,敵キャラ!$B:$AK,5,FALSE)

次に、各パーティーメンバーのレベルを入力すると、同様に別シートで管理されている各キャラ各レベルの能力値が、VLOOKUP関数で参照されてきます。さらに装備品を入力すると、やはり「装備品」のシートからVLOOKUP関数で補正値や属性を引っ張ってきます。

最終的に、レベルによる基本能力値+装備品による補正値、および属性による倍率を加味して、右下に通常攻撃で与えられるダメージ、受けるダメージが算出されるようになっています。

これを見れば、実際に戦闘テストをしなくても、だいたい一撃でどのくらいのダメージ量になるのかが分かるので、強さの微調整がやりやすくなります。

また、Excelの機能を駆使することで、シートをより便利にすることができます。

「数式」>「名前の定義」で、敵キャラの名前が入ったセル範囲に対して「敵キャラリスト」などと名前を付けることができます。

その上で、先ほどの敵キャラ名を入力するセルに対して、「データ」>「データの入力規則」で、入力値の種類を「リスト」、元の値を先ほど付けた名前を使って「=敵キャラリスト」としておくと、敵キャラ名をリストから選択できるようになります。いちいち敵キャラ名を自分で入力する必要がないので、格段に使いやすくなります。

装備品名なども同様にしておくと非常に便利でしょう。

その他Excelツール

これ以外にも、過去に公開したExcelツールがあるので、改めて紹介します。

必要経験値をExcelで計算」では、次のレベルに上がるために必要な経験値量と想定している戦闘回数から、敵1体あたりどのくらいの経験値を得られればよいか、計算してくれるツールを紹介しています。

エクセルで能力値かんたん調整」では、職業とレベルごとの能力値を編集して、それをVBAマクロを用いて、ツクール本体のデータベースに反映させられるツールを紹介しています。これは特に反響の大きかったツールですね。

これらは独立したファイルとして公開していますが、同じファイルに統合してやると、より便利に使えるかと思います。

タイトル画面だって作れちゃう

作品の顔として重要なタイトル画面。

高度な画像編集ソフトがなくても、Excelを使えばそれなりの見栄えのタイトル画面が作れます。

これは『夫婦戦争MZ(まさに絶体絶命)』のタイトル画面ですが、この通りExcelで作りました。

メインの画像はデフォルト素材の画像を読み込んで、そこに「ワードアート」で文字を配置しています。ワードアートで、文字の輪郭や透明度、影、反射、光彩あたりを駆使すれば、そこそこ見栄えの良いものが作れます。

画像も「アート効果」などを使えば、同じデフォ画像でも水彩画風やモノクロ風など、ちょっと違う雰囲気に変更できるので、試してみてはいかがでしょう。

特にタイトル文字は、デフォルトの「ゲームタイトルの描画」で表示するのに比べると、ずっと見た目が良くなると思います。

締めの挨拶

以上、RPG制作におけるExcel整理術の紹介でした。

長編RPGにおいては、これらの管理がしっかりなされていないとゲームバランスが悪くなりますし、何よりフラグミスなどのバグを生みがちです。管理や調整は非常に面倒な作業ですが、このようにExcelを駆使して、少しでもその作業が楽になればいいなと思います。

長い記事になりましたが、読んでいただきありがとうございました。

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] 戦闘終了時に特殊処理

2020-11-28 02:35:06

ボス戦の後、そのまま暗転して感動的なイベントに移行したいとします。

RPGツクールの標準仕様だと、戦闘終了後にすぐ「画面のフェードアウト」を実行しても、戦闘が終わってマップ画面に戻った際に、一瞬ですが戦闘前の画面が表示されてしまいます。

また、戦闘終了後はBGMを変えたいと思っても、経験値やお金の獲得やレベルアップのメッセージなどが表示されているうちに、戦闘前のマップBGMが流れ出してしまうため、感動が薄れてしまいます。戦闘開始前にBGMをなしにすれば、戦闘終了時にBGMは流れなくなりますが、戦闘に負けた場合は通常通りマップBGMで始めたかったりします。

戦闘終了後にスイッチを操作して、キャラの配置などを変えたい場合は、戦闘中にスイッチを操作しておけば、スイッチの状態が反映されてマップに戻れますが、勝利時のみスイッチをONにしたい場合は、それも上手くいきません。

というわけで、戦闘終了後に直ちにフェードアウトさせたり、BGM/BGSを継続させずに停止したり、勝利時・敗北時など条件によってスイッチをONにできるプラグインを作成しました。

プラグインコマンドで実装したので、RPGツクールMZ用となっています。

バトルイベント内に、プラグインコマンドで指定するようになっています。

効果を発動させたい敵グループで、0ターン目(戦闘開始時)のバトルイベントに設定すればよいでしょう。

以下の項目が設定可能です。

  • 勝利時・逃亡時・中断時・敗北時それぞれでONにするスイッチ番号
  • 戦闘終了後ただちにフェードアウト
  • 戦闘終了後、BGMを停止
  • 戦闘終了後、BGSを停止

フェードアウト、BGM/BGSの停止は、勝利時・逃亡時(中断時も含む)・敗北時、どのケースで発動させるかも設定可能です。例えば、戦闘に勝利時と敗北時はフェードアウトさせて、逃亡時はそのまま、といった設定が可能です。

このプラグインを組み込むと、こんな感じになります。

使用前は、レベルアップのメッセージを処理している間に元のBGMが流れてしまいますし、イベントが始まる前に一瞬だけ元のマップが表示されてしまうため、美しくありません。プラグインコマンドを入れた後は、BGMが停止し、フェードアウトした状態でスムースにイベントに移行しています。

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

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] バフ・デバフの効果を個別に設定

2020-11-22 22:58:21

攻撃力や防御力を強化・弱体化する、いわゆるバフ・デバフの仕組みは、RPGツクールVX Aceから改良され、2段階までの重ねがけが可能になりました。VXまではステートでバフ・デバフを実現する仕組みだったので、相殺は標準機能でできましたが、重ねがけは困難でした。VX Ace以降のバフ・デバフの仕組みは、重ねがけをしたいという要望に応えたものとなっています。

しかしその反面、VXまでは強化・弱体化される倍率が自由に設定できましたが、VX Ace以降は1段階につき25%とスクリプト内で指定されてしまっているため、倍率を変更したい場合はスクリプトの改造やプラグインの導入が必要となりました。1カ所数字を変えるだけなので、スクリプトの改造としては非常に簡単な部類ではありますが、自由度が下がったのは事実です。

とにかくVX Ace以降、デフォルトでは1段階につき25%、すなわち1段階強化なら1.25倍、2段階強化で1.5倍になり、逆に1段階弱体なら0.75倍、2段階弱体で0.5倍(半分)となります。

しかし、攻撃力ならこのくらいの変動でちょうど良さそうに思いますが、敏捷性や運がこのくらいの変動幅だと、ほとんど効果が感じられないように思います。かといって変動幅を50%にすると、2段階強化で2倍になりますが、攻撃力も同じ強化幅になってしまうため強すぎる感もあります。また弱体の場合は2段階弱体で0になってしまうため、それはそれで都合が悪いです。

というわけで、バフ・デバフの倍率を、能力値および強化か弱体かでそれぞれ個別に設定できるプラグインを作成しました。RPGツクールMVとRPGツクールMZの両方に対応しています。

能力値8個×強弱2種で計16個を設定する必要があるため、ややパラメーターの数は多いですが、使わないものはデフォルトの0.25のままで構いません。弱体倍率の方は0.5以上にすると、2段階弱体の際に0以下になってしまうため、ご注意ください。

また、強化・弱体がそれぞれ2段階ずつというのは変わりません。3段階以上にしたいなどの場合は、他のより柔軟な設定が可能なプラグインがあるようなので、そちらをご利用ください。個人的には、3段階とかあっても戦闘のテンポが悪くなるだけの気がしていて、せいぜい2段階までが有効に使える範囲かなと思います。アイコンも2段階までですし。

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

[ テクニック ] プラグインなしでムチ攻撃・改

2020-11-21 00:07:58

昨日の記事「プラグインなしでムチ攻撃」の改良版です。

主にダメージ計算式の書き方を工夫して、昨日のものよりもずっとシンプルにしました。

具体的には以下の通り。記述量が最初の半分くらいになりました。

v[1] || (v[1] = 1);

d = (a.atk * 4 - b.def * 2) * v[1];

v[1] = v[1] * 0.67;

d;

例によって行を分割していますが、実際には1行で記述します。

変更点のキモとしては、1行目。

v[n]の記述だと、n番の変数が初期化されていない場合にエラーというか未定義値になるため、式の結果も未定義値となってダメージが0になってしまう問題があり、戦闘テスト時に不都合がありました。

そこで1行目で、v[1]が未定義値ならば、||(or)の後で1番の変数に初期値を代入するようにしています。これで、わざわざ$gameVariables.valueを使わなくても、戦闘テストで正常に動作するようになりました。(今回は変数の値が仕組み上0にはならないため、このように書いています)

また、ダメージ計算式の中では、単純にv$gameVariables._dataに置き換えられるだけのようなので、わざわざ$gameVariables.setValueを用いなくとも、v[n] = xで変数に値を代入することができました。これはシンプル!

さらに、$gameVariables.setValueを用いないので、変数に整数しか入れられないという制約もありません。直接小数を扱えるので、わざわざ○○ / 100をする必要はなくなりました。

そして最後に、変数が未定義の場合に0扱いではなく任意の値を代入できるようになったので、初期値を1とすることが可能です。したがって、わざわざ100 - ○○とか複雑な計算式を書く必要がなくなり、ダメージ量が67%ずつ減衰していくのが直感的に分かりやすい記述になりました。

この場合、変数名は減衰率というよりダメージ率とでもなりますかね。

まとめるとこうなります。

まずは、ダメージ率を保持する変数を用意し、その変数を1にリセットするだけのコモンイベントを作成します。

次に、ムチ攻撃用のスキルを、1番の通常攻撃をコピーして作ります。

範囲は敵全体、使用効果に先ほどのダメージ率リセットのコモンイベントを指定、そしてダメージ計算式に以下を記述します。

v[1] || (v[1] = 1); d = (a.atk * 4 - b.def * 2) * v[1]; v[1] = v[1] * 0.67; d;

v[1]の部分は実際のダメージ率の変数番号を指定してください。

そして最後に武器の特徴で、「攻撃スキル」にムチ攻撃用のスキルを指定すればOKです。

以上で、ドラクエの鞭のように全体攻撃かつダメージが減衰していく武器をプラグインなしで、昨日よりもシンプルに実現できました。

動画は昨日のものと同じですが。

ダメージ計算式の部分には実質的にスクリプトを埋め込めるので、これ以上に複雑な処理もさせることができます。

また式の中でathis.subject()に、btargetに、それぞれ単純に置き換えられて展開されるので、ヘルプにあるようなa.atkとか以外にも、Game_Battlerが持っているプロパティーやメソッドなら何でも使えるようです。

例えば瀕死の状態だと通常の10倍のダメージを与えられるスキルであれば、

(a.atk * 4 - b.def * 2) * (a.isDying() ? 10 : 1)

とすればOKです。

最後にダメージ量または回復量を評価する必要があるとか、戦闘テスト時は変数が未定義状態だとか、いくつかクセはありますが、それさえ気を付ければ、ループ処理やウィンドウ操作なども含んだかなり複雑な処理を組み込むことが可能です。もっともあまり複雑すぎると、プラグインでやった方がいいじゃん、という話にもなりますが……。

[ テクニック ] プラグインなしでムチ攻撃

2020-11-20 04:11:21

ドラクエの武器で鞭やブーメランは、敵グループや全体攻撃ができますが、フルダメージが出るのは1体目の敵だけで、2体目以降は徐々にダメージが減衰していきます。

これをRPGツクールMZで実現しました。

プラグインじゃないとダメかなと思っていましたが、デフォルト機能の範囲内でできそうだったので、何とかプラグインなしで実装してみました。以下にその手順を記述します。

※追記:
プラグインなしでムチ攻撃・改」でよりシンプルな式に改良しています。そちらもご参照ください。

まずは、ダメージ減衰率を保持する変数を用意し、その変数をリセットするだけのコモンイベントを作成します。

次に、ムチ攻撃用のスキルを作成します。

1番の通常攻撃をコピーして作るのが楽だと思います。範囲は敵全体、使用効果に先ほどの減衰率をリセットするコモンイベントを指定します。

そしてここがキモですが、ダメージの計算式を以下のようにします。

d = (a.atk * 4 - b.def * 2) * ((100 - $gameVariables.value(1)) / 100);

$gameVariables.setValue(1, (100 - (100 - $gameVariables.value(1)) * 0.67));

d;

説明の都合上、3行に分けていますが、実際には続けて1行で書いてください。

まず1行目。デフォルトの通常攻撃ダメージ(a.atk * 4 - b.def * 2)に、ダメージ減衰率(1番の変数の値)をもとにした値((100 - $gameVariables.value(1)) / 100)を掛けて、変数dに代入しています。なお、変数の番号は、ダメージ減衰率に使った変数番号に合わせてください。

掛けている値がダメージの威力を表しており、最初は減衰率が0なので威力は100%、減衰率が30%のときは威力が逆の70%となります。

次に2行目で減衰率を更新します。現在の減衰率から次の減衰率を計算して、減衰率の変数に値をセットしています。ちょっと式が複雑ですが、威力が直前の67%になるようにしています。すなわち与えるダメージが、100%→67%→45%→31%……と徐々に減っていきます。0.67の部分を変更すれば減り方を調整することができます。

ダメージ計算式では最後に評価された式の値が採用されるので、最後にdを評価してやることで、初めに計算したダメージが返されます。これをしないと、減衰率の更新は何も値が返されないため、ダメージが0になってしまいます。

ダメージ計算式では、v[n]と記述することでn番の変数の値が使えます。なので上記の式で、$gameVariables.value(1)となっている2カ所の記述は、v[1]と置き換えることが可能です。

ですが、この記述法は、該当の変数が定義されていないとエラーを返すようで、結果としてダメージが0になってしまいます。通常のゲーム中であれば、一番最初に変数を初期化してやればいいのですが、戦闘テストの場合は全ての変数が未定義状態で始まるため、戦闘イベントで開始時に変数を初期化してやる必要がありますが、全ての敵グループにそれを仕込むのも面倒です。$gameVariables.value(n)であれば、未定義なら0が返ってくるので、戦闘テストでも問題なく使えます。うーん、こうするしかないのかな……。

変数の方も、減衰率ではなく威力にして、リセット時に0でなく100を代入するようにしてやれば、いちいちダメージ計算式で100 - ○○とかしなくて済むのですが、やはり戦闘テスト時の都合で面倒な式に。攻撃発動前に起動するコモンイベントとかが作れればいいのですけど。

ともかく、以上でスキルの設定ができました。

最後に、実際の武器を作成すれば完了です。

武器の特徴で、「攻撃スキル」に先ほど作成したスキルを指定すればOKです。

RPGツクールMZから新たに追加された機能の、「攻撃スキル」を利用しています。通常攻撃の代わりに特定のスキルを発動させられる機能で、数少ないMZの新機能の割に、これといった使い道が思い浮かばなかったのですが、全体攻撃とか特殊なダメージ計算とかを簡単に適用させられるので、工夫次第でいろいろできそうな気がします。

以上で、ドラクエの鞭のように、全体攻撃の代わりにダメージが減衰していく武器を、プラグインなしで作ることができました。まあ、ダメージ計算式のあたりはプラグイン&スクリプトの知識を必要としますが、デフォルトの機能で作れば競合とかを意識しないで済むので楽ですね。

いい感じで反映されています。