2011年05月06日

戦闘ロジックをまとめてみる。

ダンジョンスペシャルは、探索部分を非常に単純化してRPGの戦闘部分に特化した簡易ゲームだ。
というわけで、プログラミングの一番メインになる部分は戦闘部分だ。
今回は、戦闘に必要なロジックを整理してみようと思う。いわゆる詳細設計だな。
  
戦闘ロジックの概略

ダンジョンスペシャルは通常のターン制RPGだ。前作った5つの宝島のロジックがそのまま流用できそう。
通常のターン制RPGをプログラムの関数にプロットすると、こんな感じになるでしょう。

  1. 戦闘開始 … 戦闘する敵の種類と数を決定する。敵のHP・MPを最大値に
  2. ラウンド開始 … 敵および味方の行動順番決定。
  3. ターン開始 … 行動キャラ決定。行動キャラが味方なら、行動の4. 行動選択に。敵なら行動をランダムで選ぶ。行動キャラがいないなら8.へ。
  4. 行動選択 … 攻撃・防御・特技1・特技2・アイテムのうちどれかを選択。
  5. 行動処理 … 実際の行動処理開始。もしダメージがある処理なら6.へ
  6. 死亡判定 … ダメージ処理の結果、HPが0を下回っていれば死亡。
  7. ターン終了 … 行為者を行動済みにする。敵が全滅したら9.へ。味方が全滅したら10.へ。どちらでもなければ3.へ。
  8. ラウンド終了… 毒ダメージや支援効果切れなどの判定を行う。ここの毒ダメージでも敵が全滅したら9.へ。味方が全滅したら10.へ。両方の陣営が生き残っていれば2.へ
  9. 勝利 … 戦闘勝利。財宝などを獲得し、次の通路へ
  10. 敗北 … たぶん何もイベントがなければ普通にゲームオーバー
戦闘だけでもわりとロジック多いな!

では、以下に各ロジックの詳細を記載しておこう。何よりも将来の自分のために。

戦闘開始

戦闘の開始は敵のランダムエンカウントで始まる。エンカウントの方法は以下のとおり。
  1. 敵キャラの種類を選ぶ。敵一覧からひとつをランダムで選択する
  2. 敵キャラにはそれぞれ最大遭遇数が設定されている。敵キャラの数を1〜最大遭遇数までランダムで選択する
すべての敵キャラが確定したら、各々HPとMPを最大値に設定する。

ラウンド開始

パーティおよび敵の素早さに1〜6の数字をランダムで足す。これが行動順番を決定する値になる。

ターン開始

パーティーの先頭→末尾、敵の先頭→末尾の順番で行動値を走査、一番行動値が高いキャラを行為者にする。
行為者が味方、かつ混乱していないなら行動選択フェーズへ。
行為者が混乱していれば混乱時の行動をランダムに決定。行動処理フェーズへ。
行為者が敵なら通常時の敵の行動をランダムに決定。行動処理フェーズへ。

なお、現状は実装しないけど、反撃効果など他人の行動によって行動がうながされるような特殊行動を持っているキャラは、ここで反撃フラグを確認する。フラグが立っているキャラは、行動値より優先的に行動する。

みんなの行動値が0で、しかも反撃フラグも残っていない。こういう場合はすべてのキャラクターが行動してしまったという状態を表す。そうなったら次ラウンドの支度だ。ラウンド終了フェーズに行く。

行動選択

行為者が味方の場合、武器による攻撃・防御・アイテムの使用と、
キャラクターごとに定められた特技の使用を選択する。行動処理フェーズへ。

行動処理

ダメージ・回復・攻撃力や防御力の上昇などの実際の処理を行う。
MP消費が必要な行動の場合、現在MPが消費MPに届かなければ行動は無効。
アイテム消費が必要な行動の場合、アイテムを所持していなければ行動は無効。

アイテムを所持していないのにアイテム消費行動なんてできるのかよと思う御仁もいらっしゃるかもしれないけど、これ5つの宝島で結構問題になってて、連続3回行動する「アタタタッ」の魔法を使ったとき、所持数以上の薬草を使ったりしてバグった経験があるんですよ。と、そんなシチュエーションもあるので、この手のエラー回避処理はいたるところに入れておいたほうが吉っす。

死亡判定

行動処理がダメージを与える行動で、ダメージが現在HPを超えていた場合そのキャラは死亡する。
敵や味方一覧から直ちにそのキャラクターを削除する。
一般的なRPGであれば、味方の場合はステータスを死亡状態にしておいて後で蘇生作業ができるようにするんだけど、ダンジョンスペシャルではしんだら死にっぱ。

ターン終了

行為者の行動値を0にする。これによって、次のターン開始時に同じ行動者が選ばれないようにする。
現在は実装の予定がないが、反撃効果など、他人の行動によって行動がうながされるような特殊行動の場合、
このフェーズで反撃用の行動フラグを立てる。
通常の行動値とする理由は、反撃してしまうことで未行動キャラの行動予定を上書きするのを避けるためだ。
そして反撃フラグによって行動したキャラはこのフェーズで反撃フラグを下ろす。

そして次に重要なのが戦闘終了判定。
ターン終了前の死亡判定により、味方側が全滅したら、敗北フェーズに行く。
味方側に一人でもキャラが残っていて、敵側が全滅したら、勝利フェーズに行く。
そのどちらでもない場合は、次のターン開始フェーズに行く。

ラウンド終了

すべてのキャラが1回ずつ行動した状態。毎ラウンド毒をくらうような処理はここで行う。
また、5ラウンドだけ攻撃力が+10されるなどの効果の魔法があったら、このフェーズでラウンドのカウントアップを行う。
カウントが終了したら、攻撃力のボーナスをなくす。

ちなみに毒の効果などでここでも死亡判定を行う可能性があるため、ターン終了のほかにここでも戦闘終了判定を行う場合がある。
ターン終了と同じく、味方側が全滅したら敗北、敵側が全滅したら勝利フェーズだ。

勝利

無事、敵を全滅させた場合、指定された宝物を得ることができる。

敗北

普通はゲームオーバー。だな。


ふぅ、こんなところでしょう。ここまで噛み砕けば、実装やテストプログラム作成ができそうだ!
posted by LoyalTouch at 09:08| Comment(0) | TrackBack(0) | ダンジョンスペシャル | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/199470530

この記事へのトラックバック