【RPG制作講座】戦闘バランスC-2 ボス戦のサイクル

2022年05月31日

 以前、以下の記事でボス戦のバランス調整について考察した。

 戦闘バランスC ボス敵の設定
 https://newrpg.seesaa.net/article/206919474.html
 なお、この記事を書いた2022/05/31の時点で10年以上が経過している模様。月日の流れは早い……。

 ボス戦を面白くするためには、戦闘を単調化させないことが何より重要。基本はザコ戦と同じで、無闇に戦闘を長引かせないこと。特に何十ターンも同じ攻撃と回復を延々と繰り返し続けるような、長いだけの戦闘はつまらないの一言に尽きる。

 ……なんてことを書いていたけど、もう少し理論的に掘り下げてみたい。

目次


ボス戦のサイクル

安定サイクルを崩そう

強力すぎる回復の弊害

プレイヤーの戦術性

まとめ


ボス戦のサイクル


 ボス戦のバランス調整において、まず考えたいのは「ボスの攻撃をプレイヤーが安定して受けられるか否か?」である。
 これは逆の事象――「プレイヤーの攻撃をボスがどの程度耐えられるか?」よりも優先して考えておきたい。

 なぜかというのは、オーソドックスなRPGのボス戦の特徴を考えてみれば分かりやすいだろう。


  • ボスは一体、味方は複数人。
  • ボスのHPは味方の何倍も高い。十倍以上も当たり前。
  • 味方は強力な回復能力を持ち、何度も使える。
  • ボスは回復能力を持たないか、あっても限定的。

 これらの特徴により、プレイヤーは「ボスの攻撃を受ける」→「回復する」→「合間に攻撃する」というサイクルを繰り返すことになる。そして、その繰り返しによってダメージを蓄積し、ボスを倒すという流れになるはずだ。

 これはドラクエ3の時代には確立されていた様式である。
 ストーリーと絡めて考察すれば「強大な人外の敵を人間達が力を合わせて倒す」という構図をゲームデザインに落とし込んだものといえそうだ。

 例えば、剣で何十回と斬られても倒れない巨竜と、人間の戦士が同程度にタフならば違和感があるだろう。
 そこでHPに大差をつけた上で、味方には回復能力を付与することでバランスを取るという仕組みである。

 ※当前、例外も存在するが、有名なのはポケモンだろう。モンスター同士の戦いであるため、味方と敵の条件はほぼ同じ。ボス戦であっても短期決戦が基本となるため、必ずしも耐久側が優先事項にはならない。

 これにより、サイクルを維持できるかどうかが、勝敗を分ける基準となることが分かる。難易度調整をする上で大きな目安となるだろう。

 そして、重要なのは「サイクルを安定して維持できる」ならば事実上、勝利は確定するということだ。
 つまり、『安定サイクル』が達成できた時点で、ボス戦は事実上の作業と化してしまう。これは見た目上、どんなに派手な演出や数値が飛び交っていても変わらない。

 また、こうなると「プレイヤーの攻撃をボスがどの程度耐えられるか?」はほとんど問題にならない。「時間がかかるかかからないか」の違いでしかないからだ。
 ※あくまで難易度面の問題であって、ゲームテンポ面では重大です。

安定サイクルを崩そう


 では、具体的なバランス調整方法を考えてみよう。
 例えば、以下のケースはほぼ完全な安定サイクルとなって、勝ちは確定したも同然である。

  • ターン制
  • ボスは単体で出現、かつ一回行動&単体攻撃のみ。
  • 最もHPが低い味方キャラのHPが100
  • 受ける最大ダメージが99
  • 味方は回復魔法で全回復できる。
  • 回復魔法は30回使える。
  • 回復役は必ず先制できる。

 唯一の不安定要素は回復魔法の回数制限(30回)だけ。普通のRPGならば、十分な安定状態と言ってもいいだろう。
 理論上、回復魔法を30回使い切るように敵の耐久度を調整すれば、ギリギリの戦いになる。……が、まず面白くならないのでやめよう。30回は明らかに長すぎる。

 当然ながら、これでは戦闘に緊張感がなく同じことを延々と繰り返すだけである。面白くすることは難しいだろう。

 そこで、少し不安定となるように崩してみよう。
 例えば、以下のような手段が考えられる。

  • 敵味方の行動順にランダム性を出し、死人が出る可能性を生む。
  • ボスを二回行動にしたり、お供を付けたり。
    HPの低いキャラに攻撃が集中すると倒れるようにする。
  • ターンによってボスの攻撃の強さに格差をつける。
    時折、強力な全体攻撃を使ってくるなど。
  • ボスのHPが減ると行動が強化される。
  • 味方の回復魔法の使用回数をもっと限定する。
  • ボスに異常や補助を使わせて、こちらの計算を崩す。
  • ボス戦前の戦闘やダンジョンで消耗させる。

 わずかな不安定感を演出するだけでも、意外と緊張感が出る。

 例えば、ドラクエシリーズ(正確には4以降)で隊列の4番目のキャラが狙われる確率は約10%である。
 最もHPの低い4番目のキャラにボス(二回行動)の攻撃が連続ヒットした場合、死亡するバランスにしたとしよう。
 一見、厳しそうに見えるが、その確率は1ターン辺りわずか1%。
 ボス戦が5〜10ターン程度で終わると想定した場合、それが原因でプレイヤーが全滅まで追い込まれる確率はほとんどなかったりする。

 このようにして、理不尽でない範囲で崩しを入れてみよう。

 この崩しは厳密である必要はない。
 事実上の安定状態でも、ほどよいランダム性があれば意外と緊張感が出たりする。プレイヤーはデータを完全に把握していないため、安定サイクルに入ったかどうかは容易には分からないためだ。
 逆に言えば、「パターン入った!」と簡単に分かるようでは困るということでもある。

強力すぎる回復の弊害


 何度も似たようなことを書いているけれど、全体回復、蘇生、MP回復が容易な調整だった場合、ちょっとやそっとでは安定サイクルを崩せないため調整が難しくなる。

 それは今回の安定サイクル理論を元に考えれば、より明白になる。
 例えば、蘇生アイテムが誰でも簡単に使えるようなバランスならば、単体即死攻撃ですらサイクルを崩壊させられない。
 従って、ボス戦が容易に作業となり得る危険性を秘めている。

 それ以上の攻撃手段をボスに設定するとなると、かなり際どいところを突くしかなくなってくる。一歩間違えれば、ライトユーザお断りの理不尽ゲーだ。

 また、「強力な全体攻撃」→「強力な全体回復」の繰り返しや「単体即死攻撃」→「蘇生」の繰り返しは非常に目立つ。回復側に選択の余地が少ないため、単調になりやすい。必然的にパターンに入ったことが、プレイヤーに見抜かれやすいのも注意すべき点だ。

 その他についても、以下の記事で散々書いたので割愛する。

 回復魔法の問題点
 https://newrpg.seesaa.net/article/462407181.html

プレイヤーの戦術性


 さて、ある程度まで安定サイクルを崩せたとする。
 無策では確実な勝利を望めないとなると、プレイヤーは勝率を高める対策を練る必要がある。そして、そこに戦術性が生まれる。

  • 防具を見直す。
  • 異常で敵の攻撃を妨害する。
  • 補助で味方の防御を強化する。
  • お供がいる場合はお供を倒し、敵の戦力を削る。
  • 節約しながら、回復魔法を使う。
  • ピンチに防御する。
  • やられる前にやる。

 無論、プレイヤーが最適解を取れば、理論上100%勝ててしまう調整でも問題ない。大事なのは、何の工夫もなく安定状態にならないことだ。

 この中で最も基本的な対策は「やられる前にやる」である。
 これは最初に掲示した逆の事象――「プレイヤーの攻撃をボスがどの程度耐えられるか?」に対応する。

 その内実も様々で、ダメージ効率の高い技を模索したり、武器を整えたりといった選択肢がある。
 そして、これによって、プレイヤーが勝利するための戦術の軸が倍になる。戦術性を高める上ではかなり有用だ。

 そのため、ボス戦は「やられる前にやる」がある程度成り立つバランスを心がけておくとよいだろう。基本は過度にボスをしぶとくしないこと。これはゲームテンポをよくする効果も得られる。

 ボスがしぶとすぎると「やられる前にやる」が成り立たなくなる。結果、敵の攻撃をしのぎ切る以外の選択肢がなくなってしまう。
 そうなると、戦闘が単調になってしまう上に、戦闘テンポも悪化するので注意したい。

まとめ


 今回の記事で、面白いボス戦とつまらないボス戦の一つの境界線を示せたと思う。

 現行のオーソドックスなRPGを何も考えず踏襲すると、この安定サイクルに陥りやすい。面白い戦闘を目指すならば、何らかの崩しを入れてみよう。
 もちろんポケモンのようにゲームデザインの段階で崩すのも面白いだろう。

 なお、ストーリー重視などで難易度が低い作品を目指す場合や、重要度の低いボス戦を難しくしたくない場合は、無理に安定サイクルを崩す必要はない。そういった場合も長期戦でテンポが悪くならないようにだけ注意しておきたい。

>RPG制作講座目次に戻る
posted by 砂川赳 at 18:55 | RPG制作講座 | このブログの読者になる | 更新情報をチェックする

戦闘背景をスクロール【RPGツクールMZ&MVプラグイン】

2022年05月17日

 戦闘背景をスクロールさせます。



 背景の雲をスクロールさせたり、乗り物の上で戦ったり、謎の異空間で戦ったり、落ちながら戦ったりといった用途を想定しています。

 なお、戦闘背景をスクロールさせるプラグインについては、BattleBackScroll.js(トリアコンタン様)など既存のものがあります。戦闘背景の画像単位で設定できるようにした以外は機能に大差ありません。

目次


導入方法(Install)

更新履歴(History)

使用方法(Usage)

プラグインパラメータ(Plugin Parameters)

戦闘背景1の設定(Battleback1SettingList)

戦闘背景2の設定(Battleback2SettingList)

戦闘背景のプラグインパラメータ(Plugin Parameters Battleback)

戦闘背景(Battleback)

X速度(SpeedX)

Y速度(SpeedY)

X速度の変数(SpeedXVariable)

Y速度の変数(SpeedYVariable)


導入方法(install)


 以下のファイルをダウンロードし 、[プロジェクト]\js\plugins に放り込みます。ツクールのプラグイン管理から機能をONにしてください。
 ※このプラグインはMV、MZの両方で有効です。

 NRP_BattleBackScroll.js ver1.00(2022/05/17)

更新履歴(History)


2022/05/17(ver1.00)

  • 公開!

使用方法(Usage)


 設定は戦闘背景(battlebacks1, battlebacks2)のファイル毎に行います。
 各設定リストにファイルとスクロール設定を指定してください。
 変数を指定すれば速度を可変にすることもできます。

 このプラグインの設定はごく簡単ですが、どちらかというと背景素材をいかに確保&設定するかが課題になると思います。
 遠景用の素材を使用するなど柔軟に考える必要があります。


 参考として、上記の動画では『戦闘背景1』に空&雲、『戦闘背景2』に平原の画像を設定しています。
 これは通常ツクールの仕様で想定されている構図とは逆の位置関係となります。戦闘背景1のほうが表示優先度が低いため、このようにしています。

プラグインパラメータ(Plugin Parameters)


戦闘背景1の設定(Battleback1SettingList)

 戦闘背景1(下)の設定一覧です。
 詳細は戦闘背景のプラグインパラメータをご覧ください。

戦闘背景2の設定(Battleback2SettingList)

 戦闘背景2(上)の設定一覧です。
 詳細は戦闘背景のプラグインパラメータをご覧ください。

戦闘背景のプラグインパラメータ(Plugin Parameters Battleback)


 戦闘背景用のプラグインパラメータです。
 戦闘背景1(Battleback1)と戦闘背景2(Battleback2)の二種類があります。

戦闘背景(Battleback)

 スクロール効果を設定する戦闘背景です。
 戦闘背景1(Battleback1)と戦闘背景2(Battleback2)の二種類があります。

X速度(SpeedX)

 横方向へのスクロール速度です。

Y速度(SpeedY)

 縦方向へのスクロール速度です。

X速度の変数(SpeedXVariable)

 横方向へのスクロール速度を決定する変数です。
 設定時は『X速度』より優先されます。

Y速度の変数(SpeedYVariable)

 縦方向へのスクロール速度を決定する変数です。
 設定時は『Y速度』より優先されます。

 >RPGツクールMZ&MV目次に戻る
posted by 砂川赳 at 12:43 | RPGツクールMZ&MV | このブログの読者になる | 更新情報をチェックする

PixiのエフェクトをDynamic系プラグインから呼び出す【RPGツクールMZプラグイン】

2022年05月13日

 DynamicAnimation&Motionプラグインから、Pixiのフィルターエフェクト機能を呼び出します。
 以下のように画面を歪ませるなどの演出が可能です。

 ※PixiとはツクールMV〜MZの標準で使用しているライブラリのことです。
 ※当然ながらDynamicAnimationプラグインが必須です。(Motionは任意)




目次


導入方法(Install)

更新履歴(History)

使用方法(Usage)

パラメータ(Parameters)

filterType

filterTarget

filterSpeed

filterX

filterY

filterParameter

filterId

filterErase


導入方法(install)


 以下のファイルをダウンロードし 、[プロジェクト]\js\plugins に放り込みます。ツクールのプラグイン管理から機能をONにしてください。
 ※このプラグインはMZ専用です。

 NRP_DynamicPixiFilter.js ver1.00(2022/05/13)

 FilterControllerMZ.js(Tsukimi様)の機能を経由しているため、こちらのプラグインも必須となります。
 FilterControllerMZ.js

 以下に解説やサンプルプロジェクトもあります。
 https://forum.tkool.jp/index.php?threads/4306/

更新履歴(History)


2022/05/13(ver1.00)

  • 公開!

使用方法(Usage)


 適用すれば、DynamicAnimationおよびMotionプラグインから簡単に呼び出せるようになります。

 最も扱いやすいエフェクトは『shockwave(衝撃波)』です。
 ……というか、それ以外を戦闘に組み込むのは難しいので、以降の解説もそれを前提にします。
 ※他のエフェクトも今後、使い道が見つかれば検討します。

DynamicAnimation

 例えば、以下でアニメーションと同時に衝撃波のエフェクトが表示されます。
 ※アニメーションが不要なら画像を設定しなければOKです。
 ※標準ではアニメーションの始点にエフェクトを表示します。

<D-Animation>
filterType = shockwave
</D-Animation>


DynamicMotion

 DynamicMotionの場合も同じです。
 ※標準ではモーション実行者側にエフェクトを表示します。
<D-Motion>
filterType = shockwave
</D-Motion>


パラメータ(Parameters)


 パラメータを指定することでエフェクトを調整できます。
 大半のパラメータはFilterControllerMZ.jsに準じますので、詳細はそちらの解説をご確認ください。

 パラメータは以下のように指定します。
 ※//から右は単なる注釈です。
<D-Animation>
filterType = shockwave // エフェクトの種類
filterTarget = Battlers // エフェクト対象
filterX = b.width / 2 // X座標
filterY = b.height / 2 // Y座標
filterParameters = [0,0,-1,30,160,1] // X,Y,半径,振幅,波長,明るさ
filterId = 1 // ID
</D-Animation>

 詳細は下をご覧ください。

filterType

 フィルターエフェクトの種類です。
 基本的には『shockwave』を使っていけばよいと思います。

filterTarget

 エフェクトをかける対象です。
 標準では全画面を対象としますが、その他にも以下が使用できます。

  • Battlers:バトラーのみ
  • Battleback:戦闘背景のみ
  • FullScreenWithWindow:全画面(ウィンドウ含む)

 ※BattlersおよびBattlebackの指定は、当プラグインで追加した機能です。
 ※Battlersを指定した場合は原点が、バトラーの左上になります。座標を変更する場合はご注意ください。

filterSpeed

 エフェクトの速度です。
 shockwaveの場合は衝撃波が広がる速度になります。
 shockwaveの標準値は『0.01』なので、その辺りを基準にしてください。
 うっかり『1』などを入力すると、早すぎて見えなくなります。

 また『0』にした場合はその場に残りますので、後で削除を行う必要があります。

filterX

filterY

 エフェクトを表示するX座標、Y座標です。
 標準ではアニメーションの始点(もしくはモーション実行者)に表示されるため省略しても構いません。

filterParameter

 FilterControllerMZ.jsおよびPixiに渡すパラメータですが、少し上級者向けかもしれません。
 例えば、shockwaveの場合、以下のように6つのパラメータを渡しています。

filterParameters = [0,0,-1,30,160,1]

 ※値はFilterControllerMZの標準値

 ……が、それぞれの値の意味は、FilterControllerMZ.jsの実装と、Pixiのドキュメントを照らし合わせないと分からないと思います。
 https://filters.pixijs.download/main/docs/PIXI.filters.ShockwaveFilter.html

 実際には以下の順番で対応していますので、お好みで調整してください。

  • center(1):X座標補正
  • center(2): Y座標補正
  • radius:最大半径(0以下で無制限)
  • amplitude:振幅(揺らぎの強さ)
  • wavelength:波長(揺らぎの大きさ)
  • brightness:明るさ

 上2つは『filterX』『filterY』を指定すればよいので基本は変更不要です。

 ちなみに未入力の場合も標準値が使用されるため、不要な項目は以下のように空白にしても構いません。
filterParameters = [,,,,,0]


filterId

 フィルターエフェクトを操作するためのIDです。
 IDは数値でも文字列でも構いませんが、文字列の場合は""で囲ってください。

 なお、以下の削除(filterErase)などの操作を行わない場合は不要です。
 ※shockwaveなら速度が0の場合を除いて、時間経過で自動的に消滅します。

filterErase

 指定した『filterId』のエフェクトを削除します。
 例えば、以下のような流れになります。
<D-Animation:wait>
filterId = 1
filterType = godray
</D-Animation>

<D-Animation>
filterErase = 1
</D-Animation>

 また『filterErase = true』にすると、全てのエフェクトを削除します。
 FilterControllerMZ.jsで呼び出した全てのエフェクトが対象になるので、ご注意ください。

 >RPGツクールMZ&MV目次に戻る
posted by 砂川赳 at 19:24 | RPGツクールMZ&MV | このブログの読者になる | 更新情報をチェックする