今回は戦闘とエンディング処理をおこないます。戦闘がおきるのはフィールド上と敵の城です。

まずフィールド上における戦闘の処理を実装します。

BeginBattleイベントの定義

Form1クラスではBeginBattleイベントに対応する処理をおこないます。

Formに自分のHPとMPを表示するLabelと敵の姿を描画するためのPictureBoxをはりつけておきます。

<でざいな>

InitDungeonsメソッド内でBeginBattleイベントに対応できるようにしておきます。

敵はスライムともうひとつ(自分でもよくわからないキャラ)です。HPは3と7のザコ敵の名にふさわしい敵キャラです。

戦闘関連のクラス

次に戦闘関連のクラスを示します。

EnemyStatusクラス

まず敵の状態を管理するクラス EnemyStatusをつくります。

BattleResultクラス

戦闘をするとボタンをおすことでコマンド選択時はコマンドの選択、それ以外のときは結果を一行ごとに表示します。そして結果を表示する文字列はBattleResultオブジェクトに格納し、これが複数存在するときはリストに格納してひとつずつ取り出して表示させます。

そのために必要となるBattleResultクラスを示します。

ひとつのアクションをすることで、敵へのダメージ、敵の反撃によるダメージが表示されるのですが、HPの変化はじっさいにダメージをうけたときにあわせて変更させたいものです。そこで

Battleクラス

次にBattleクラスを示します。ここではプレイヤーのHPとMP、敵を攻撃したりされたときのダメージの計算をおこないます。また敵は1体だけとします。

戦闘が開始されるときはBeginBattleメソッドで敵をEnemyStatus1に格納します。そしてコマンド入力可能の状態にします。

EnemyStatus1がnullであり、Results.Countが0のとき戦闘が終了し、メッセージの表示も完全に終了したことになります。そうでない場合は戦闘中であるとみなします。

PopResultメソッドは戦闘に関するメッセージのうち表示されていないもので最初に格納されたものを返します。GetMessageCountメソッドはまだ表示されていない表示待ちのメッセージの個数を返します。

敵を攻撃するメソッド

敵を攻撃するコマンドが選択されたときの処理を示します。乱数で敵に与えるダメージを決定し、敵の残りのHPを計算します。0以下になったら敵は死んだことになり、戦闘も終了します。そうでない場合は敵による攻撃の処理がおこなわれます。

HPを回復するメソッド

プレイヤーが回復魔法を使ったときの処理を示します。

敵が攻撃してきたときの処理

敵が攻撃してきたときの処理を示します。

プレイヤーのHPとMPを全回復させる処理

王女さまに話しかけるとプレイヤーのHPとMPを全回復させますが、そのためのメソッドをつくります。

Form1クラスにおける処理

Form1クラスにおける処理を示します。

これは王女さまに話しかけるとプレイヤーのHPとMPを全回復させる処理です。

キー操作にかんする処理

Map1.BeginBattleイベント関連の処理は冒頭で示したので、キーがおされたときの処理を示します。

戦闘中にキーを押したときの処理を示します。

戦闘が終了してすべてのメッセージが表示され終わっている場合、しかもlabel1が表示されているときにキーが押されたのであれば、それは戦闘が終了してはじめてキーが押されたことになります。この場合はBattle1_Finishedメソッドを呼び出します。

対ボス戦の処理

敵の城で魔王に話しかけると戦闘が開始されます。その処理を示します。

戦闘終了時の処理

対ボス戦でもそれ以外でも戦闘が終了するとBattle1_Finishedメソッドが呼び出されます。ザコ敵との戦闘に勝利した場合はとくに処理はおこなわれません。プレイヤーが死亡した場合は最初の城に戻され、「おお、死んでしまうとは情けない」と表示させます。そのあとHPとMPをゲーム開始と同じ状態に戻します。

対ボス戦に勝利した場合はエンディングの処理に移ります。それ以外のときはフィールド上におけるBGMを再生します。

エンディングの処理

エンディングの処理を示します。エンディングが始まるとキー操作を無効にします(OnKeyDownメソッド内でisEndingがtrueなら何もしない)。場所を最初の城に移動し、プレイヤーを王女さまの前に移動します。そのあと王女さまのお礼とゲームクリアの文字を表示させます。