RPGのバトルパートについて考えてみる(1)
RPGのバトルシーン
8bit 風 RPG を開発しはじめました。
まずはバトルシーン(内部処理のみ)から着手することにしました。
考えたことをメモしていこうと思います。
考えながら書いているのではじめと終わりで内容が違う…(^^;
前提
ファミコンのターン制のコマンド式 RPG を思い浮かべてください。
あれです。とりあえず 1 ターン実行するという部分を考えてみます。
全体の流れ
1ターンの流れを確認してみます。
- 全体コマンド(たたかう、にげる)を選択する
- 各味方キャラクタの行動を選択する
- 行動順にメッセージと画面効果が表示され、パラメータやステータスが変動する
※敵味方のいずれかが全滅していた場合は戦闘終了の流れへ移動する
※全キャラクタの行動が終わり、敵味方いずれの全滅もない場合は(1)に戻る
こんな感じでしょうか。
ターン再生
まずは一番最後の「行動順にメッセージと画面効果が表示され、パラメータやステータスが変動する」を考えてみます。
イメージとしては↓のようなメッセージが出て、画面が揺れたりフラッシュしたりする感じです。
◯◯◯◯のこうげき!
◯◯◯◯◯◯に✕✕のダメージ!
名前はとりあえず「ターン再生(PlayTurn)」としておきます。
メッセージを次々と表示していくにはそのテキストを予め溜めておいて順番に表示していく
ような処理になると想像できます。
ただし、画面が揺れたりフラッシュしたり、ウェイトがあったりするので、
単なるテキストというよりは画面表示のための命令という感じでしょうか。
例えば
- [命令]ウェイト
- [テキスト]◯◯◯◯のこうげき!
- [命令]ウェイト
- [命令]画面揺らす
- [テキスト]◯◯◯◯◯◯に✕✕のダメージ!
のような。
画面のプログラムはそれをひとつひとつ実行していくことになりますが、
ここではまだ考えないことにします。
とりあえず「ターン再生」の出力としては例で上げたような命令群を出力できれば良さそうです。
出力は決まりましたが入力はどうすれば良いでしょうか。
画面だけをイメージした場合、各キャラクタ毎に選んだ選択(コマンド)が入力となりそうですが
例えば攻撃しようとした相手が別のキャラクタの攻撃によって既に死んでいた時は別の相手を自動的に
選んで攻撃したいですし、他にも眠っているキャラクターがいた場合、コマンドは選んでいませんが
眠っているというメッセージを出したいですよね。
そう考えると、各キャラクタ毎に選んだコマンドを入力として先ほどのメッセージ出力を得ようとすると乖離が大きくなり過ぎている気がします。 間にワンクッション挟んだ方が良さそうなので、アクション(Action)という名前の中間物を作ることにします。
コマンド→アクション→メッセージ(命令)という形です。
アクションを実行することでパラメータの変動が起き、メッセージ(命令)が生成されるというイメージです。
入力としてはアクション群ということで良さそうです。
「ターン再生」という名前なのに具体的にアクションからパラメータの変動を起こすのは変なので
名前はアクション実行(ActionExecutor)に変更します。
とは言え、メッセージ(命令)を入力として、画面と連携(演出の完了を待つなど)をとりつつ
1ターン分の再生をする部分というのはそれはそれで必要なので、
(3)がアクション実行とターン再生の2つに分かれたという感じですね。
まとめ
(3)のターン再生部分は以下の2つから成る
◆アクション実行
入力:各キャラクタの選択したコマンドおよび敵キャラクタのコマンド
出力:画面への命令を含むメッセージ
役割:全キャラクタのコマンドをひとつずつ実行することで、パラメータの変動を行い、メッセージを生成する
◆ターン再生
入力:アクション実行が生成したメッセージ
出力:なし
役割:アクション実行が生成したメッセージを順に解釈し、外部への通知を行う