⇒ 動作確認はこちらからどうぞ。
前回はIndexクラスが大きくならないように別のクラスを作成して、処理はそのなかでおこないました。今回は
プレイヤーに攻め込まれようとしている敵の城
EnemyCastleIfPlayerAttackingクラス
プレイヤーに包囲されている敵の城
EnemyCastleIfPlayerSiegingクラス
別の敵に攻め込まれようとしている敵の城
EnemyCastleIfOtherEnemyAttackingクラス
別の敵に包囲されている敵の城
EnemyCastleIfOtherEnemySiegingクラス
これらを作成します。
Contents
プレイヤーに攻め込まれようとしている敵の城 EnemyCastleIfPlayerAttackingクラス
プレイヤーに攻め込まれようとしている敵の城では城の守備兵がいない場合の占領処理、包囲前の敵の逆襲の処理がおこなわれます。
まずコンストラクタを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public class EnemyCastleIfPlayerAttacking : CastleBase { public EnemyCastleIfPlayerAttacking(Index obj, CastleStatus status) : base(obj, status) { // 敵の援軍がいる場合は先に合流させる SoldiersJoin(); string str = string.Format("わが{0}軍は{1}周辺に到着しました。", status.AttackingCorps.BaseCastleOwner, status.CastleName); obj.AddSituation(str); status.Done = true; // 防御側の兵がいない場合は占領できる if (RunOccupyIfNoDefenseSoldiers()) return; // 敵は兵糧が持たないなら反撃するしかない if (status.MilitaryFood <= status.SoldierCount * 3 * 2) { RunCounterattack(); return; } // 反撃されなかった場合はそのまま包囲する str = string.Format("心配していた抵抗はありませんでした♪ これより{0}軍は{1}を包囲します。", status.AttackingCorps.BaseCastleOwner, status.CastleName); obj.AddSituation(str); Corps corps = status.AttackingCorps; status.SiegingCorps = corps; status.AttackingCorps = null; } } |
EnemyCastleIfPlayerAttacking.SoldiersJoinメソッドは援軍が到着したときの処理をおこないます。これは敵とプレイヤーが入れ替わっただけで前回示したものとほとんどかわりません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class EnemyCastleIfPlayerAttacking : CastleBase { void SoldiersJoin() { if (_status.SupportCorps != null) { string str = String.Format("{0}に{1}軍の援軍が到着しました。", _status.CastleName, this.oldOwner); _obj.AddSituation(str); _status.SoldierCount += _status.SupportCorps.SoldierCount; _status.MilitaryFood += _status.SupportCorps.MilitaryFood; _status.SupportCorps = null; } } } |
EnemyCastleIfPlayerAttacking.RunOccupyIfNoDefenseSoldiersメソッドは城の防備兵がいないときに占領の処理をおこなうためのものです。敵の城を労せず自分のものにできるため、メッセージも変化させています。敵の滅亡判定、ゲームクリア判定もおこなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class EnemyCastleIfPlayerAttacking : CastleBase { bool RunOccupyIfNoDefenseSoldiers() { if (OccupyIfNoDefenseSoldiers()) { string str1 = string.Format("{0}に兵はいませんでした。", _status.CastleName); string str2 = string.Format("わが軍は空き巣同然に{0}を手に入れることができました♪", _status.CastleName); _obj.AddSituation(str1 + str2); // この城から出撃した軍団はこの城に戻れなくなる CastleOccupied(oldOwner); // 敵の滅亡判定、ゲームクリア判定 CheckGameClearIfEnemyRuin(oldOwner); return true; } return false; } } |
EnemyCastleIfPlayerAttacking.RunCounterattackメソッドは包囲しようとしたときに敵が奇襲をかけてきたときの処理です。
奇襲をされて負けた場合、戻れる城があればいいのですが、ない場合は全滅するまで戦います。全滅した場合、ゲームクリア判定も必要です。敵の奇襲を蹴散らした場合はCastleBase.Counterattackメソッド内部の処理により自動的に城を包囲しますが、メッセージも表示させたほうがわかりやすいのでそのようにしています。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class EnemyCastleIfPlayerAttacking : CastleBase { bool RunCounterattack() { string str = string.Format("{0}を包囲しようとしたところ、{1}軍が逆襲してきました。", _status.CastleName, _status.CastleOwner); _obj.AddSituation(str); Corps defenseingCorps; if (_status.SoldierCount < _status.MilitaryFood) defenseingCorps = _status.SendingForDefense(_status.SoldierCount); else defenseingCorps = _status.SendingForDefense(_status.MilitaryFood); if (Counterattack(defenseingCorps)) { if (atCanReturn) _obj.AddSituation(string.Format("{0}軍の抵抗の前に我が軍は敗走することになりました。", oldOwner)); else _obj.AddSituation(string.Format("{0}軍の抵抗の前に我が軍は壊滅です。", oldOwner)); _obj.AddSituation("攻め急ぐとロクな事がありません。兵糧もとられて散々です。"); CheckGameOverIfRuin(); return true; } else { _obj.AddSituation(string.Format("{0}軍の抵抗を撃退して城を包囲することができました。", oldOwner)); return false; } } } |
プレイヤーに包囲されている敵の城 EnemyCastleIfPlayerSiegingクラス
プレイヤーに包囲されている敵の城の処理をおこなうEnemyCastleIfPlayerSiegingクラスを示します。
敵の援軍がいる場合は敵の援軍との戦闘を最初におこないます。そのあと防御側の兵がいないときは占領処理をおこない、敵の逆襲がある場合はその処理をおこないます。敵の動作がひととおり終わったらプレイヤーのターンとなり、強行突入をするかどうかを選択することができます。
ただし敵の援軍に敗れた場合、敵の逆襲によって撃退された場合、城に防備兵がいないため戦わずに城を占領できた場合、兵糧攻めが成功して城を奪うことができた場合はターンは回ってきません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
public class EnemyCastleIfPlayerSieging : CastleBase { public EnemyCastleIfPlayerSieging(Index obj, CastleStatus status) : base(obj, status) { string str; obj.AddSituation(string.Format("ここは {0} 周辺です。現在、兵糧攻めをしています。", status.CastleName)); // 敵の援軍がいる場合 if (status.SupportCorps != null && RunCombatForSupport()) { status.Done = true; return; } // 防御側の兵がいない場合は占領できる if (RunOccupyIfNoDefenseSoldiers()) { status.Done = true; return; } // 兵糧攻めの継続 ResultSiege rs = RunSiege(); if (rs != ResultSiege.Sieging) { status.Done = true; return; } // 敵は包囲側よりも長期間の兵糧がないと城を守れない。足りない場合は無理があっても逆襲にかけるしかない。 int d = 0; if (status.SoldierCount > 0) d = status.MilitaryFood / status.SoldierCount / 2; int s = 0; if (status.SiegingCorps.SoldierCount > 0) s = status.SiegingCorps.MilitaryFood / status.SiegingCorps.SoldierCount; if (d < s) { if (RunCounterattack()) return; } str = String.Format("兵糧攻めを継続しますか?それとも突入しますか? 敵は{0}人、我が軍は{1}人です。", status.SoldierCount * 1000, status.SiegingCorps.SoldierCount * 1000); // 自分のターンに // 強行突入をするかそのまま兵糧攻めを続けるかを選択できる obj.CurentCastleStatus = status; obj.AddSituation(str); obj.ShowSituation(); return; } } |
EnemyCastleIfPlayerSieging.RunCombatForSupportメソッドは敵の援軍による攻撃をうけた場合の処理をおこなっています。
表示されるメッセージが違っている(プレイヤーにとって有利かどうかで変化させている)のと戦闘の勝敗でターンがまわってくるかどうかの違いがあるだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
public class EnemyCastleIfPlayerSieging : CastleBase { bool RunCombatForSupport() { _obj.AddSituation(String.Format("{0}軍の援軍が攻撃してきました!", spOwner)); int ret = CombatForSupport(); if (ret > 0) { if (sgOwner == _obj.PlayerName) _obj.AddSituation(String.Format("{0}軍の援軍の前に敗北しました・・・", spOwner)); if (sgCanReturn) _obj.AddSituation(String.Format("{0}に退却します・・・", sgCastle)); else { _obj.AddSituation(String.Format("{0}軍には撤退できる城がありません。このまま全滅です。", sgOwner)); // 撃退され退却できない場合、ゲームオーバーになっているかもしれない CheckGameOverIfRuin(); } // 敵の援軍に負けた場合、プレイヤーにターンは来ない _status.Done = true; _obj.ShowSituation(); return true; } else { _obj.AddSituation(String.Format("{0}軍の援軍を蹴散らしました♪", spOwner)); if (spCanReturn) _obj.AddSituation(String.Format("{0}軍は{1}に撤退したようです。", spOwner, spCastle)); else _obj.AddSituation(String.Format("{0}軍には撤退できる城がありません。このまま全滅です。", spOwner)); return false; } } } |
城の防備兵がいない場合の占領処理です。敵の城を奪い取ったことによるメッセージの表示とこれにともなう敵の滅亡判定、ゲームクリア判定もおこなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class EnemyCastleIfPlayerSieging : CastleBase { bool RunOccupyIfNoDefenseSoldiers() { if (OccupyIfNoDefenseSoldiers()) { string str1 = string.Format("{0}に兵はいませんでした。", _status.CastleName); string str2 = string.Format("わが軍は空き巣同然に{0}を手に入れることができました♪", _status.CastleName); _obj.AddSituation(str1 + str2); // ここから出撃した敵の軍団は戻ってこれない CastleOccupied(oldOwner); // 敵の城を奪い取ったことによる滅亡判定とゲームクリア判定 CheckGameClearIfEnemyRuin(oldOwner); return true; } return false; } } |
兵糧攻めに関する処理です。成功の場合は勝利のメッセージと敵の城を奪い取ったことによる滅亡判定とゲームクリア判定、失敗のときは退却先の表示、退却できない場合はゲームオーバーになっているかもしれないのでその判定をおこなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public class EnemyCastleIfPlayerSieging : CastleBase { ResultSiege RunSiege() { ResultSiege rs = Siege(); if (rs == ResultSiege.Protected) { _obj.AddSituation(String.Format("{0}軍の兵糧攻めは失敗しました・・・", _obj.PlayerName)); _status.Done = true; if (sgCanReturn) _obj.AddSituation(String.Format("{0}に退却します・・・", sgCastle)); else { _obj.AddSituation(String.Format("{0}軍には撤退できる城がありません。このまま全滅です。", sgOwner)); // 撃退され退却できない場合、ゲームオーバーになっているかもしれない CheckGameOverIfRuin(); } _obj.ShowSituation(); return ResultSiege.Protected; } if (rs == ResultSiege.Occupied) { _obj.AddSituation(String.Format("{0}軍の兵糧がなくなりました。{1}は落城しました♪", oldOwner, _status.CastleName)); CastleOccupied(oldOwner); CheckGameClearIfEnemyRuin(oldOwner); _status.Done = true; _obj.ShowSituation(); return ResultSiege.Occupied; } return ResultSiege.Sieging; } } |
兵糧攻めをされている敵による逆襲がおこなわれる場合の処理をしています。敵の反撃の前に敗れた場合、プレイヤーにターンは来ません。この場合、ゲームオーバーの可能性があるのでそのチェックも行なっています。敵の逆襲を打ち砕いた場合は、プレイヤーのターンになり、強行突入か兵糧攻めの継続かを選択するボタンが表示されるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public class EnemyCastleIfPlayerSieging : CastleBase { bool RunCounterattack() { Corps defenseingCorps = null; if (_status.SoldierCount < _status.MilitaryFood) defenseingCorps = _status.SendingForDefense(_status.SoldierCount); else defenseingCorps = _status.SendingForDefense(_status.MilitaryFood); _obj.AddSituation(String.Format("{0}軍:座して死を待つよりは・・・", this.oldOwner)); _obj.AddSituation("敵が決死の反撃をしてきました!!"); if (Counterattack(defenseingCorps)) { // 敵の反撃に負けた場合、プレイヤーにターンは来ない if (sgCanReturn) { _obj.AddSituation("敵が逆襲の前に敗走を余儀なくされました・・・"); _obj.AddSituation(String.Format("やむなく{0}にもどります・・・", sgCastle)); } else { _obj.AddSituation("敵が逆襲の前に全滅です・・・"); CheckGameOverIfRuin(); _obj.ShowSituation(); } _status.Done = true; return true; } else { _obj.AddSituation("敵の逆襲を打ち砕きました!落城まであと少しです!"); return false; } } } |
別の敵に攻め込まれようとしている敵の城 EnemyCastleIfOtherEnemyAttackingクラス
別の敵に攻め込まれようとしている敵の城の処理をするEnemyCastleIfOtherEnemyAttackingクラスを示します。
これまでの場合と同様、攻められようとしている城(敵がまだ城前まで来ていない城)の場合、支援にきた兵がいるのであれば先に城にいれます。そのあと敵がやってきます。
もし城の防備兵がいなければ占領されます。包囲されて兵糧攻めをされたときに兵糧が持たないなら逆襲をかけます。逆襲しても返り討ちにあった場合や逆襲自体をしなかった場合はその城は包囲されてしまいます。
防備兵のいない城を占領された場合や戦闘に敗北して戻る城がない場合は滅亡の場合があるのでチェックをする必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public class EnemyCastleIfOtherEnemyAttacking : CastleBase { public EnemyCastleIfOtherEnemyAttacking(Index obj, CastleStatus status) : base(obj, status) { status.Done = true; string attackOwner = status.AttackingCorps.BaseCastleOwner; // 支援にきた兵がいるのであれば先にいれる SoldiersJoin(); // 防御側の兵がいない場合は占領される if (RunOccupyIfNoDefenseSoldiers()) return; // 兵糧が持たないなら反撃するしかない if (status.MilitaryFood <= status.SoldierCount * 3 * 2) { RunCounterattack(); return; } // 反撃がない場合はそのまま包囲する Corps corps = status.AttackingCorps; status.SiegingCorps = corps; status.AttackingCorps = null; string str = string.Format("{0}にたどり着いた{1}軍はたいした抵抗を受けることなく城を包囲しました。", castleName, attackOwner); obj.AddSituation(str); return; } } |
支援にきた兵がいるか調べているのであれば城にいれる処理をおこないます。この部分は敵であってもプレイヤーの城であってもかわりません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class EnemyCastleIfOtherEnemyAttacking : CastleBase { void SoldiersJoin() { if (_status.SupportCorps != null) { string str = String.Format("{0}に{1}軍の援軍が到着しました。", _status.CastleName, this.oldOwner); _obj.AddSituation(str); _status.SoldierCount += _status.SupportCorps.SoldierCount; _status.MilitaryFood += _status.SupportCorps.MilitaryFood; _status.SupportCorps = null; } } } |
敵がせめてきたときに防備兵がいなければ占領の処理がおこなわれます。今回は敵同士の戦いなのでゲームクリアの判定は必要ありません。城主が滅亡したかどうかをチェックするだけでじゅうぶんです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class EnemyCastleIfOtherEnemyAttacking : CastleBase { bool RunOccupyIfNoDefenseSoldiers() { if (OccupyIfNoDefenseSoldiers()) { _obj.AddSituation(string.Format("{0}に兵はいませんでした。{1}軍は労せずに{0}を手に入れました。", castleName, atOwner)); // この城から出撃した軍団はこの城には戻ってこれない CastleOccupied(oldOwner); // 滅亡したかを判定する if (RuinCheck(oldOwner)) _obj.AddSituation(String.Format("{0}家は滅亡しました!!!", oldOwner)); return true; } else return false; } } |
敵は兵糧攻めをされると落城するしかない場合は逆襲に活路を見出すしかありません。EnemyCastleIfOtherEnemyAttacking.RunCounterattack()はその場合の処理をおこないます。城側の逆襲が成功した場合で攻め方の退却できる城がない場合は撃退された側は滅亡したかもしれません。そのための判定をしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public class EnemyCastleIfOtherEnemyAttacking : CastleBase { bool RunCounterattack() { Corps defenseingCorps = null; if (_status.SoldierCount < _status.MilitaryFood) defenseingCorps = _status.SendingForDefense(_status.SoldierCount); else defenseingCorps = _status.SendingForDefense(_status.MilitaryFood); string str = String.Format("城を包囲しようしている{0}軍に{1}軍({2})は逆襲をかけました!", atOwner, _status.CastleOwner, castleName); _obj.AddSituation(str); if (Counterattack(defenseingCorps)) { string str1 = string.Format("{0}軍の逆襲が成功しました!", _status.CastleOwner); if (sgCanReturn) _obj.AddSituation(str1 + string.Format("{0}軍は{1}へ退却しました。", atOwner, atCastle)); else { string str2 = String.Format("{0}軍には撤退できる城がありません。このまま全滅です。", atOwner); _obj.AddSituation(str1 + str2); if (RuinCheck(atOwner)) _obj.AddSituation(String.Format("{0}家は滅亡しました!!!", atOwner)); } return true; } else { _obj.AddSituation("逆襲失敗!兵糧を奪われただけでさんざんな結果になりました。"); _obj.AddSituation(string.Format("{0}は{1}軍によって包囲されました。", castleName, atOwner)); return false; } } } |
別の敵に包囲されている敵の城 EnemyCastleIfOtherEnemySiegingクラス
別の敵に包囲されている敵の城の処理をおこなうEnemyCastleIfOtherEnemySiegingクラスを示します。EnemyCastleIfPlayerSiegingクラスにおける処理との違いはプレイヤーにターンがまわってくることを考慮する必要がないことです。
EnemyCastleIfPlayerSiegingクラス同様に、その城への援軍がいる場合は援軍と包囲軍の戦闘を最初におこないます。そのあと防御側の兵がいないときは占領処理をおこない、敵の逆襲がある場合はその処理をおこないます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public class EnemyCastleIfOtherEnemySieging : CastleBase { public EnemyCastleIfOtherEnemySieging(Index obj, CastleStatus status) : base(obj, status) { status.Done = true; string oldOwner = status.CastleOwner; // 支援にきた兵がいるのであれば包囲軍と戦闘になる if (status.SupportCorps != null && RunCombatForSupport()) return; // 防御側の兵がいない場合は占領される if (RunOccupyIfNoDefenseSoldiers()) return; // 兵糧がつきたら占領される ResultSiege rs = RunSiege(); if (rs != ResultSiege.Sieging) return; // 包囲側は城側が2ヵ月以上の兵糧をもつ場合は強行突入する。そうしないと兵糧攻めは失敗する // また戻れる城がない場合も強行突入する。 if (status.SiegingCorps.BaseCastle == null || status.MilitaryFood >= status.SoldierCount * 2 * 2) { RunForcedRush(); return; } // 城側は包囲側よりも長期間の兵糧がないと城を守れない。足りない場合は無理があっても逆襲にかけるしかない。 int d = 0; if (status.SoldierCount > 0) d = status.MilitaryFood / status.SoldierCount / 2; int s = 0; if (status.SiegingCorps.SoldierCount > 0) s = status.SiegingCorps.MilitaryFood / status.SiegingCorps.SoldierCount; if (d < s) { RunCounterattack(); } } } |
援軍が存在する場合、包囲軍との戦闘がおこなわれます。プレーヤーとは無関係な処理なのであまり難しくはないと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public class EnemyCastleIfOtherEnemySieging : CastleBase { bool RunCombatForSupport() { _obj.AddSituation(String.Format("{0}に{1}軍の援軍が到着しました。包囲軍と交戦します。", _status.CastleName, spOwner)); int ret = CombatForSupport(); if (ret > 0) { string str1 = "包囲軍と援軍の戦闘は援軍側が勝利しました。"; if (sgCanReturn) { string str2 = String.Format("{0}軍は{1}に撤退します。", sgOwner, sgCastle); _obj.AddSituation(str1 + str2); } else { string str2 = String.Format("{0}軍には撤退できる城がありません。このまま全滅です。", sgOwner); _obj.AddSituation(str1 + str2); if (RuinCheck(sgOwner)) _obj.AddSituation(String.Format("{0}家は滅亡しました!!!", sgOwner)); } return true; } else { string str1 = "包囲軍と援軍の戦闘は包囲側が勝利しました。"; if (spCanReturn) { string str2 = String.Format("{0}軍は{1}に撤退します。", spOwner, spCastle); _obj.AddSituation(str1 + str2); } else { string str2 = String.Format("{0}軍には撤退できる城がありません。このまま全滅です。", spOwner); _obj.AddSituation(str1 + str2); } return false; } } } |
城の防備兵がいるか調べていない場合は占領の処理をおこないます。占領が実現した場合は別の敵によって滅ぼされたかもしれないので滅亡の判定もおこないます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class EnemyCastleIfOtherEnemySieging : CastleBase { bool RunOccupyIfNoDefenseSoldiers() { if (OccupyIfNoDefenseSoldiers()) { string str = string.Format("{0}に兵はいませんでした。{1}軍は労せずに{0}を手に入れました。", _status.CastleName, sgOwner); _obj.AddSituation(str); CastleOccupied(oldOwner); if (RuinCheck(oldOwner)) _obj.AddSituation(String.Format("{0}家は滅亡しました!!!", oldOwner)); return true; } return false; } } |
兵糧攻めを継続して兵糧を減らします。ここで落城したり包囲側の兵糧がなくなり撤退先がない場合は滅亡の判定もおこないます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class EnemyCastleIfOtherEnemySieging : CastleBase { ResultSiege RunSiege() { ResultSiege rs = Siege(); if (rs == ResultSiege.Occupied) { _obj.AddSituation(String.Format("{0}軍の兵糧がなくなりました。{1}は落城しました。", oldOwner, castleName)); CastleOccupied(oldOwner); if (RuinCheck(oldOwner)) _obj.AddSituation(String.Format("{0}家は滅亡しました!!!", oldOwner)); return ResultSiege.Occupied; } if (rs == ResultSiege.Protected) { string str = String.Format("{0}軍の兵糧がなくなりました!{0}軍の兵糧攻めは失敗しました。", sgOwner); _obj.AddSituation(str); if (sgCanReturn) _obj.AddSituation(String.Format("{0}は{1}に撤退します。", sgOwner, sgCastle)); else { _obj.AddSituation(String.Format("{0}は撤退できる城がないのでこの場で全滅です。", sgOwner)); if (RuinCheck(sgOwner)) _obj.AddSituation(String.Format("{0}家は滅亡しました!!!", sgOwner)); } return ResultSiege.Protected; } return ResultSiege.Sieging; } } |
兵糧攻めでは落城させることができない場合、攻め方は強行突入をおこないます。襲撃した城が包囲されてしまった場合も強行突入を実行します。
ここで落城か突入部隊全滅のどちらかになるのですが、これによって片方の陣営が滅亡してしまう場合があります。そこでその判定もおこなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public class EnemyCastleIfOtherEnemySieging : CastleBase { bool RunForcedRush() { string str = ""; if (sg.BaseCastle == null) { string newOwner = _obj.CurentCastleStatusList.First(x => x.CastleName == sg.BaseCastleName).CastleOwner; str += "戻る城を" + newOwner + "軍に占領された"; } else if (sg.BaseCastle.SiegingCorps != null) str += "戻る城を" + sg.BaseCastle.SiegingCorps.BaseCastleOwner + "軍に包囲されている"; str += sgOwner + "軍は"+ castleName + "への強行突入を決断したようです。"; _obj.AddSituation(str); if (ForcedRush()) { _obj.AddSituation(String.Format("強行突入した{0}軍は{1}を奪い取りました。", sgOwner, _status.CastleName)); CastleOccupied(oldOwner); if (RuinCheck(oldOwner)) _obj.AddSituation(String.Format("{0}家は滅亡しました!!!", oldOwner)); return true; } else { _obj.AddSituation(String.Format("{0}軍は強行突入したものの全滅してしまいました。", sgOwner)); _obj.AddSituation(String.Format("{0}軍は{1}を守り抜きました。", _status.CastleOwner, _status.CastleName)); if (RuinCheck(sgOwner)) _obj.AddSituation(String.Format("{0}家は滅亡しました!!!", sgOwner)); return false; } } } |
兵糧攻めを継続されては落城するしかない場合、城側はカウンター攻撃をするしかありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
public class EnemyCastleIfOtherEnemySieging : CastleBase { bool RunCounterattack() { Corps defenseingCorps = null; if (_status.SoldierCount < _status.MilitaryFood) defenseingCorps = _status.SendingForDefense(_status.SoldierCount); else defenseingCorps = _status.SendingForDefense(_status.MilitaryFood); string str = String.Format("兵糧攻めをしている{0}軍に{1}軍({2})は逆襲をかけました!決死の反撃です!", sgOwner, _status.CastleOwner, _status.CastleName); _obj.AddSituation(str); bool ret = Counterattack(defenseingCorps); if (ret) { str = string.Format("{0}軍の逆襲が成功しました!", _status.CastleOwner); if (sgCanReturn) _obj.AddSituation(str + string.Format("{0}軍は{1}へ退却しました。", sgOwner, sgCastle)); else { _obj.AddSituation(String.Format("{0}軍には撤退できる城がありません。このまま全滅です。", sgOwner)); if (RuinCheck(sgOwner)) _obj.AddSituation(String.Format("{0}家は滅亡しました!!!", sgOwner)); } return true; } else { _obj.AddSituation(string.Format("逆襲失敗!決死の反撃をしてみたものの{0}軍の包囲網を破ることができません。", sgOwner)); _obj.AddSituation(string.Format("{0}軍は余計に苦しくなりました。まだまだ兵糧攻めが続きます。", _status.CastleOwner)); return false; } } } |
残すは「どこからも攻め込まれていない敵の城」ですが、これは次回にします。