4.RPG式自作戦闘(行動順の決め方)



謝辞
このページの製作に当たってapoさんにご協力をいただきました。
どうもありがとうございました。

自作戦闘ではやることはいろいろとありますが
まずはシステムの根幹にあたる行動順の決め方について解説します。

ここでは有名どころの4種について作り方を解説します。
この講座に合わせてこちらにサンプルを用意していますので
分かりにくい部分はサンプルを開いて確認してください。


目次

ターン制
ATB(アクティブタイムバトル)
CTB(カウントタイムバトル)
ハーフリアルタイムバトル





ターン制

敵味方含めてその場にいるキャラクターが素早さの高い順に必ず一回づつ行動する戦闘方式です。
行動順の固定を防ぐためにターンの最初に乱数を振るのが一般的なようです。


さて行動順を決めるためにはまず素早さの一番高いキャラクターを選び取らなければなりません。
方法はいくつか考えられます。
一番簡単なのは敵味方それぞれの俊敏性に1づつ加算していって先に規定値に達した順番に
行動させる方法です。

簡単なように2対2の場合で解説します。

 使う変数
 0011:味方1俊敏性
 0012:味方2俊敏性
 0013:敵1俊敏性
 0014:敵2俊敏性

 0021:味方1行動値
 0022:味方2行動値
 0023:敵1行動値
 0024:敵2行動値

 0031:行動した人数

まずは変数11〜14に敵と味方の俊敏性を代入します。
俊敏性の値を直接いじると次のターンで元に戻すのが大変ですのでいったん作業用変数に移し替えます。

 ◆変数の操作:[0021:味方1行動値]代入,変数[0011]の値
 ◆変数の操作:[0022:味方2行動値]代入,変数[0012]の値
 ◆変数の操作:[0023:敵1行動値]代入,変数[0013]の値
 ◆変数の操作:[0024:敵2行動値]代入,変数[0014]の値

次に行動順の固定化を防ぐために乱数を加算します。数値は各々で調整してください。

 ◆変数の操作:[21-24]加算,乱数[0〜9]

規定値はいくらでも構いませんが、俊敏性よりも十分に大きい値にしましょう。
ここではとりあえず1000とします。

 ◆変数の操作:[0031:行動した人数]代入,0
 ◆繰り返し処理
  ◆変数の操作:[21-24]加算,1
  ◆条件分岐:変数[0021:味方1行動値]が1000
   ◆変数の操作:[0021:味方1行動値]代入,0
    〜行動の処理〜
   ◆変数の操作:[0031:行動した人数]加算,1
   ◆
  :分岐終了
  ◆条件分岐:変数[0022:味方2行動値]が1000
   ◆変数の操作:[0022:味方2行動値]代入,0
    〜行動の処理〜
   ◆変数の操作:[0031:行動した人数]加算,1
   ◆
  :分岐終了
  ◆条件分岐:変数[0023:敵1行動値]が1000
   ◆変数の操作:[0023:敵1行動値]代入,0
    〜行動の処理〜
   ◆変数の操作:[0031:行動した人数]加算,1
   ◆
  :分岐終了
  ◆条件分岐:変数[0024:敵2行動値]が1000
   ◆変数の操作:[0024:敵2行動値]代入,0
    〜行動の処理〜
   ◆変数の操作:[0031:行動した人数]加算,1
   ◆
  :分岐終了
  ◆条件分岐:変数[0031:行動した人数]が4
   ◆繰り返し処理の中断
   ◆
  :分岐終了
  ◆
 :以上繰り返し

サンプルではこれとは違い「変数並び替えパック」の「最大値検索」を使っています。
「最大値検索」は指定した範囲の最初から最後まで隣り合う2つの値を比較しながら大きい方だけを
記憶していく方法をとっています。変数の範囲が広く、数値のばらつきが大きい時にも
高速な処理が可能です。それと最大値が同値で複数あった時には等しい確率で一個を
選択するように工夫しています。
ですからこの講座を見て作る人はできるだけ「最大値検索」をご利用ください(笑)

変数の1に範囲の最初、変数の2に範囲の最後を代入して「最大値検索」を呼び出せば
変数の3に最大値、変数の4にその変数の番号が代入されて返ってきます。
 ◆繰り返し処理
  ◆変数の操作:[0001]代入,21
  ◆変数の操作:[0002]代入,24
  ◆イベントの呼び出し:最大値検索
  ◆条件分岐:変数[003:最大値]が0
   ◆繰り返し処理の中断
   ◆
  :分岐終了
  ◆条件分岐:変数[004:最大の値を持つ変数番]が21
    〜行動の処理〜
   ◆
  :分岐終了
  ◆条件分岐:変数[004:最大の値を持つ変数番]が22
    〜行動の処理〜
   ◆
  :分岐終了
  ◆条件分岐:変数[004:最大の値を持つ変数番]が23
    〜行動の処理〜
   ◆
  :分岐終了
  ◆条件分岐:変数[004:最大の値を持つ変数番]が24
    〜行動の処理〜
   ◆
  :分岐終了
  ◆変数の操作:[V[0004]]代入,0 (←変数の番号の変数)
  ◆
 :以上繰り返し

これでターンの流れはばっちりですね。

次はコマンドを受け付けるタイミングです。ターン制では2通り考えられます。

・順番が回ってきたらコマンド選択
プレイヤーにとっては状況に合わせて対応しやすい方式と言えます。
これは「〜行動の処理〜」の部分でコマンドを表示して、選択したものを
そのまま実行すればいいので最も簡単です。

・ターンの最初に一括してコマンド選択
プレイヤーにとっては読みを必要とする方式です。
まず最初に味方全員のコマンドを選択させるわけですが、このとき誰が何を選んだかを
記憶しておかなければなりません。そこで「行動内容記憶」変数を人数分用意します。
「攻撃」なら1、「魔法」なら2と決めておいてその値を代入していきます。
場合によっては選択した「魔法」や「特技」をさらに別の変数で管理するといいかもしれません。
このとき攻撃目標などが必要なら混乱を防ぐために「ターゲット記憶」変数を
別に用意して、「敵1」なら変数に1を、「敵2」なら変数に2を代入します。

あとは「〜行動の処理〜」のところで変数の値に合わせた行動をとらせます。



目次へ


ATB(アクティブタイムバトル)

言わずと知れたFF式の戦闘です。この方式では行動ゲージを溜めていき、先に最大まで
溜まった人から順に行動します。
コマンド選択中にはゲージが止まる「ウエイト」と、コマンド選択中もゲージが溜まり続け、
とろとろやってると敵からボカスカやられる「アクティブ」の2種があります。

・ウエイト
こちらはそんなに難しくはありません。ターン制の最大値を探すという箇所で規定値まで溜める
方法を紹介しましたが、これに適当にウエイトを挟んで、1加算の代わりに各々の俊敏性を加算していく
ようにすればすぐに実現できます。

 使う変数
 0011:味方1俊敏性
 0012:味方2俊敏性
 0013:敵1俊敏性
 0014:敵2俊敏性

 0021:味方1行動値
 0022:味方2行動値
 0023:敵1行動値
 0024:敵2行動値

 ◆繰り返し処理
  ◆変数の操作:[0021:味方1行動値]加算,変数[0011]
  ◆条件分岐:変数[0021:味方1行動値]が1000
   ◆変数の操作:[0021:味方1行動値]代入,0
    〜行動の処理〜
   ◆
  :分岐終了
  ◆変数の操作:[0022:味方2行動値]加算,変数[0012]
  ◆条件分岐:変数[0022:味方2行動値]が1000
   ◆変数の操作:[0022:味方2行動値]代入,0
    〜行動の処理〜
   ◆
  :分岐終了
  ◆変数の操作:[0023:敵1行動値]加算,変数[0013]
  ◆条件分岐:変数[0023:敵1行動値]が1000
   ◆変数の操作:[0023:敵1行動値]代入,0
    〜行動の処理〜
   ◆
  :分岐終了
  ◆変数の操作:[0024:敵2行動値]加算,変数[0014]
  ◆条件分岐:変数[0024:敵2行動値]が1000
   ◆変数の操作:[0024:敵2行動値]代入,0
    〜行動の処理〜
   ◆
  :分岐終了
  ◆ウエイト:0.1秒
  ◆
 :以上繰り返し

あとは変数の値をゲージが溜まる様子と連動させなければいけませんが、
その解説は別の機会に譲ります。

さてここで大きなお世話かもしれませんが、この方式はあまりお勧めできません。
アクティブならプレイヤーに考える時間を与える必要がありますが、ウエイトでは
ゲージが溜まるまでの時間にまったく意味がありません。待ち時間の分だけ戦闘が長引くだけです。
ATBのウエイトにするくらいなら待ち時間のないターン制やCTBにすることをお勧めします。


・アクティブ
つねに素早いコマンド選択が要求されるためスリリングな展開が続きます。
コマンド選択中もゲージを動かすためには「コマンド選択」と「ゲージ処理」を
別のイベントに分けて並列処理をします。このとき2つのイベントで同じスイッチや変数を
使っていると思わぬバグが発生することがありますので注意が必要です。
そしてアクティブ方式で一番難しいのは敵と味方の行動が重なってしまったときの処理です。
これを解消1つの方法として誰かが行動する時に[行動中]スイッチをONにして、
行動が終わったらOFFにします。
そしてプレイヤーのコマンド処理の直後に繰り返し処理を置いて[行動中]スイッチがONの間
先へ進まないようにしましょう。

 ◆繰り返し処理
  ◆条件分岐:スイッチ[行動中]がOFF
   ◆繰り返し処理の中断
  :分岐終了
  ◆ウエイト:0.0秒
 :以上繰り返し

実際の戦闘ではこの直後にそのキャラが行動可能かどうかを判定しましょう。
というのもこの待ち時間中に状態異常や戦闘不能になることがあるからです。



目次へ


CTB(カウントタイムバトル)

FF10はやっていませんが、おそらくこんな感じだろうということで解説します。
私の理解ではCTBは敵味方の素早さの違いから換算して、あらかじめ行動順を決めておく方式のようです。

それではまず行動順を記憶しておく変数を用意しましょう。

 使う変数
 0011:味方1俊敏性
 0012:味方2俊敏性
 0013:敵1俊敏性
 0014:敵2俊敏性

 0021:味方1行動値
 0022:味方2行動値
 0023:敵1行動値
 0024:敵2行動値

 0031:行動順代入用
 0041〜0050:行動順の1番〜10番


例によって俊敏性を代入し、その値を作業用変数に移し替えます。
ここから最大値検索をしてまず一番数値の大きいキャラの数字を変数の41に代入、
そのキャラの行動値を0に戻して再び俊敏性を加算、最大値のキャラの数値を変数42に代入…
これを変数50まで繰り返します。

 ◆変数の操作:[0031:行動順代入用]代入,41
 ◆変数の操作:[0021〜0024]代入,0
 ◆繰り返し処理
  ◆変数の操作:[0021:味方1行動値]加算,変数[0011]の値
  ◆変数の操作:[0022:味方2行動値]加算,変数[0012]の値
  ◆変数の操作:[0023:敵1行動値]加算,変数[0013]の値
  ◆変数の操作:[0024:敵2行動値]加算,変数[0014]の値
  ◆変数の操作:[0001]代入,21
  ◆変数の操作:[0002]代入,24
  ◆イベントの呼び出し:最大値検索
  ◆条件分岐:変数[004:最大の値を持つ変数番]が21
   ◆変数の操作:[V[0031]]代入,1 (←変数の番号の変数)
   ◆
  :分岐終了
  ◆条件分岐:変数[004:最大の値を持つ変数番]が22
   ◆変数の操作:[V[0031]]代入,2 (←変数の番号の変数)
   ◆
  :分岐終了
  ◆条件分岐:変数[004:最大の値を持つ変数番]が23
   ◆変数の操作:[V[0031]]代入,3 (←変数の番号の変数)
   ◆
  :分岐終了
  ◆条件分岐:変数[004:最大の値を持つ変数番]が24
   ◆変数の操作:[V[0031]]代入,4 (←変数の番号の変数)
   ◆
  :分岐終了
  ◆変数の操作:[V[0004]]代入,0 (←変数の番号の変数)
  ◆変数の操作:[0031:行動順代入用]加算,1
  ◆条件分岐:変数[0031:行動順代入用]が51
   ◆繰り返し処理の中断
   ◆
  :分岐終了
  ◆
 :以上繰り返し

これで1番から10番までの行動順が決まりました。
あとは変数41のキャラを行動させ、終わったら42〜50までの数値を一つ前に詰め、
変数50に新しく一人分を追加していきます。

さてここで、
  ◆変数の操作:[V[0004]]代入,0 (←変数の番号の変数)
とキャラクターの行動値を0でリセットしましたが、問題が浮上しました。
それはある二人のキャラクターに注目した時、第三のキャラクターの素早さによって
その二人の行動順が変わってしまうという怪現象が起こってしまうことです。

Aの俊敏性が30、Bの俊敏性が50のとき、Cの俊敏性が40なら行動順はB→C→B→A
になります。ここでCの俊敏性を20にすると、その行動順はB→A→B→Cに
なるという具合です。

それというのも0でリセットするとMaxになったときの数値が反映されず、
結果として俊敏性の小さいキャラがせっかく積んだ数値を損しているからです。
ATBでも同じ問題がありますが、こちらは1回の素早さ加算ごとに判定しているので
その差がよりダイレクトに反映されてしまうのです。
そこで選び取った変数を一律同じ値で減算すると多少は改善されます。
減算する値は小さすぎても大きすぎてもまずいので、
素早さの値が2桁なら3桁、3桁なら4桁あたりを目安にします。

こうするともう一つ気にかけることがあります。
値の範囲が固定されなくなるので戦闘が長引くと999999や-999999を突破する
可能性がでてきます。そこで基準値を設定してそれ以上またはそれ以下になったら
全員分の行動値を修正する必要があります。

 ◆変数の操作:[V[0004]]減算,100
 ◆条件分岐[003:最大値]が100000以上
  ◆変数の操作:[21〜24]減算,100000
 :分岐終了
 ◆条件分岐[003:最大値]が-100000以下
  ◆変数の操作:[21〜24]加算,100000
 :分岐終了

完全ではありませんがこれでいくぶん改善されます。
まあ細かいことは気にしないという手もありますが(笑)



目次へ


ハーフリアルタイムバトル

グランディア式の戦闘です。ATBのウエイトに近い方式と言えます。
規定値が2つあって、行動値が1つ目の規定値に達したら行動選択、
2つ目の規定値に達したらその行動を実行します。
1つ目の規定値から2つ目の規定値へ移るまでの時間は通常攻撃なら瞬時に、
大魔法なら遅いといったように選択した行動内容によって変動します。
その間に敵からダメージを受けるとゲージが一定数戻され、
最悪行動をキャンセルさせられたりします。状況がめまぐるしく変化する戦闘方式です。

サンプルでは行動値が1000まで溜まったらコマンド選択をさせ、
「行動内容」変数及び「ターゲット」変数に記憶させています。
そして「行動内容」変数が0か0以上のときで行動値の溜まり方を分岐し、
規定値が1500に到達したら記憶した変数の値に合わせて行動させるようにています。
少し複雑ですが基本はATBの作り方と同じですので詳しくは省略します。



基礎講座
第一回:RPGツクールでハローワールド(04' 4/10)
第二回:トラブル対処法(04' 4/17)
第三回:オープニングを作ろう(04' 4/24)

自作システム講座
第一回:マップイベントとコモンイベント(04' 1/10)
第二回:カーソル移動あれこれ(04' 1/10)
第三回:RPG式自作戦闘の下準備(スイッチ・変数の管理)(03' 6/15)
第四回:RPG式自作戦闘(行動順の決め方)(03' 6/15)
第五回:変数の値を画面上に表現(03' 7/6)
第六回:アイテムメニューを作る(04' 1/10)
講座一覧へ戻る
トップへ戻る



公開日時:'03 6/15 18:00
更新日時:'04 10/17 17:00
管理人:すっぴぃ ◆ADGYPSYxII