動作確認はこちらからどうぞ。

前回はIndexクラスが大きくならないように別のクラスを作成して、処理はそのなかでおこないました。今回は

プレイヤーに攻め込まれようとしている敵の城
EnemyCastleIfPlayerAttackingクラス

プレイヤーに包囲されている敵の城
EnemyCastleIfPlayerSiegingクラス

別の敵に攻め込まれようとしている敵の城
EnemyCastleIfOtherEnemyAttackingクラス

別の敵に包囲されている敵の城
EnemyCastleIfOtherEnemySiegingクラス

これらを作成します。

プレイヤーに攻め込まれようとしている敵の城 EnemyCastleIfPlayerAttackingクラス

プレイヤーに攻め込まれようとしている敵の城では城の守備兵がいない場合の占領処理、包囲前の敵の逆襲の処理がおこなわれます。

まずコンストラクタを示します。

EnemyCastleIfPlayerAttacking.SoldiersJoinメソッドは援軍が到着したときの処理をおこないます。これは敵とプレイヤーが入れ替わっただけで前回示したものとほとんどかわりません。

EnemyCastleIfPlayerAttacking.RunOccupyIfNoDefenseSoldiersメソッドは城の防備兵がいないときに占領の処理をおこなうためのものです。敵の城を労せず自分のものにできるため、メッセージも変化させています。敵の滅亡判定、ゲームクリア判定もおこなっています。

EnemyCastleIfPlayerAttacking.RunCounterattackメソッドは包囲しようとしたときに敵が奇襲をかけてきたときの処理です。

奇襲をされて負けた場合、戻れる城があればいいのですが、ない場合は全滅するまで戦います。全滅した場合、ゲームクリア判定も必要です。敵の奇襲を蹴散らした場合はCastleBase.Counterattackメソッド内部の処理により自動的に城を包囲しますが、メッセージも表示させたほうがわかりやすいのでそのようにしています。。

プレイヤーに包囲されている敵の城 EnemyCastleIfPlayerSiegingクラス

プレイヤーに包囲されている敵の城の処理をおこなうEnemyCastleIfPlayerSiegingクラスを示します。

敵の援軍がいる場合は敵の援軍との戦闘を最初におこないます。そのあと防御側の兵がいないときは占領処理をおこない、敵の逆襲がある場合はその処理をおこないます。敵の動作がひととおり終わったらプレイヤーのターンとなり、強行突入をするかどうかを選択することができます。

ただし敵の援軍に敗れた場合、敵の逆襲によって撃退された場合、城に防備兵がいないため戦わずに城を占領できた場合、兵糧攻めが成功して城を奪うことができた場合はターンは回ってきません。

EnemyCastleIfPlayerSieging.RunCombatForSupportメソッドは敵の援軍による攻撃をうけた場合の処理をおこなっています。

表示されるメッセージが違っている(プレイヤーにとって有利かどうかで変化させている)のと戦闘の勝敗でターンがまわってくるかどうかの違いがあるだけです。

城の防備兵がいない場合の占領処理です。敵の城を奪い取ったことによるメッセージの表示とこれにともなう敵の滅亡判定、ゲームクリア判定もおこなっています。

兵糧攻めに関する処理です。成功の場合は勝利のメッセージと敵の城を奪い取ったことによる滅亡判定とゲームクリア判定、失敗のときは退却先の表示、退却できない場合はゲームオーバーになっているかもしれないのでその判定をおこなっています。

兵糧攻めをされている敵による逆襲がおこなわれる場合の処理をしています。敵の反撃の前に敗れた場合、プレイヤーにターンは来ません。この場合、ゲームオーバーの可能性があるのでそのチェックも行なっています。敵の逆襲を打ち砕いた場合は、プレイヤーのターンになり、強行突入か兵糧攻めの継続かを選択するボタンが表示されるようになります。

別の敵に攻め込まれようとしている敵の城 EnemyCastleIfOtherEnemyAttackingクラス

別の敵に攻め込まれようとしている敵の城の処理をするEnemyCastleIfOtherEnemyAttackingクラスを示します。

これまでの場合と同様、攻められようとしている城(敵がまだ城前まで来ていない城)の場合、支援にきた兵がいるのであれば先に城にいれます。そのあと敵がやってきます。

もし城の防備兵がいなければ占領されます。包囲されて兵糧攻めをされたときに兵糧が持たないなら逆襲をかけます。逆襲しても返り討ちにあった場合や逆襲自体をしなかった場合はその城は包囲されてしまいます。

防備兵のいない城を占領された場合や戦闘に敗北して戻る城がない場合は滅亡の場合があるのでチェックをする必要があります。

支援にきた兵がいるか調べているのであれば城にいれる処理をおこないます。この部分は敵であってもプレイヤーの城であってもかわりません。

敵がせめてきたときに防備兵がいなければ占領の処理がおこなわれます。今回は敵同士の戦いなのでゲームクリアの判定は必要ありません。城主が滅亡したかどうかをチェックするだけでじゅうぶんです。

敵は兵糧攻めをされると落城するしかない場合は逆襲に活路を見出すしかありません。EnemyCastleIfOtherEnemyAttacking.RunCounterattack()はその場合の処理をおこないます。城側の逆襲が成功した場合で攻め方の退却できる城がない場合は撃退された側は滅亡したかもしれません。そのための判定をしています。

別の敵に包囲されている敵の城 EnemyCastleIfOtherEnemySiegingクラス

別の敵に包囲されている敵の城の処理をおこなうEnemyCastleIfOtherEnemySiegingクラスを示します。EnemyCastleIfPlayerSiegingクラスにおける処理との違いはプレイヤーにターンがまわってくることを考慮する必要がないことです。

EnemyCastleIfPlayerSiegingクラス同様に、その城への援軍がいる場合は援軍と包囲軍の戦闘を最初におこないます。そのあと防御側の兵がいないときは占領処理をおこない、敵の逆襲がある場合はその処理をおこないます。

援軍が存在する場合、包囲軍との戦闘がおこなわれます。プレーヤーとは無関係な処理なのであまり難しくはないと思います。

城の防備兵がいるか調べていない場合は占領の処理をおこないます。占領が実現した場合は別の敵によって滅ぼされたかもしれないので滅亡の判定もおこないます。

兵糧攻めを継続して兵糧を減らします。ここで落城したり包囲側の兵糧がなくなり撤退先がない場合は滅亡の判定もおこないます。

兵糧攻めでは落城させることができない場合、攻め方は強行突入をおこないます。襲撃した城が包囲されてしまった場合も強行突入を実行します。

ここで落城か突入部隊全滅のどちらかになるのですが、これによって片方の陣営が滅亡してしまう場合があります。そこでその判定もおこなっています。

兵糧攻めを継続されては落城するしかない場合、城側はカウンター攻撃をするしかありません。

残すは「どこからも攻め込まれていない敵の城」ですが、これは次回にします。