Last-modified: 2013-12-14 23:46:48
AI同士の戦争が終結するまでの処理を、SDK(プログラムのソースコード)を基にして解説する。
人間プレイヤーに対する振る舞いは若干異なっている部分もあるが、人間プレイヤーの絡む戦争ではそもそも和平のタイミングが人間に大きく依存するため、ここでは割愛したい。
終戦確率を決める値で高いほど停戦しにくい。
XMLで指導者ごとに予め決められている。
参照: AI指導者のパラメータ一覧表
戦争が何ターン継続しているかを表す。和平すると0にリセットされる。
戦争の性質を表すもので、全面戦争(TOTAL)、限定戦争(LIMITED)、便乗戦争(DOGPILE)などがある。
しかし、被宣戦側はそのいずれでもなく被攻撃(WARPLAN_ATTACKED)というタイプになると思われる。
つまり、宣戦側と被宣戦側のタイプは同じにはならない。
他の指導者に対する戦果を表す値で以下のように加算されていく。和平すると0にリセットされる。
- 攻撃でユニット撃破: 4
- 防御でユニット撃破: 3
- ユニット捕獲: 1
- 都市奪取: 10
- 核攻撃: 10
ある指導者と戦争を終わらせるかどうかを決めるために毎ターン計算されるスコア。
以下のように計算される。
- 初期値は100。
- 両者(つまり自分と相手)の都市数 * 3と人口を足す。
- WarSuccess * 20を足す。
- 相手の軍事力 / (自分の軍事力 + 相手の軍事力)を掛ける。
- 相手より戦力が優っていてAI同士の戦争の場合のみ、スコアを圧縮して停戦しにくくするために以下の処理を行う。
- 領土が相手よりも1.2倍より広い場合はスコアを下方修正
- 財政危機の時、WarRandが100より小さいAI(つまり戦争屋)はスコアを下方修正
さらに戦力にかかわらず以下の処理を続ける。
- 全面戦争ならスコアを上方修正する。
- 便乗戦争でタイマンになったときはスコアを上方修正する。
- 攻撃的AIの場合、都市が取れそうな状況ではスコアを下方修正する。
(詳細はCvTeamAI::AI_endWarValを参照)
戦争が終わる際の処理はAI_doWar関数を中心に行われる。
処理には大きく分けて取引を伴う処理と取引を伴わない処理の二つがある。
また、属国はAI_doWarの処理をしない。
- 相手との交戦期間(AtWarCounter)が10ターンより大きいかチェックする。
- 降伏が可能かどうかチェックする。*1
- 降伏が不能な場合、20分の1(指導者によらず一定)の確率で取引を介した和平交渉を行う。
(詳細はCvPlayerAI::AI_doPeaceを参照)
上述の取引を伴う処理が終わった後に実行される。
- 戦争中かどうかチェックする。
- 1 / iMakePeaceRandの確率で以下の処理に入る。
- 各指導者に対して交渉可能かチェックする。
- 自分から宣戦した戦争かどうかをチェックする。
*2
処理がここまで至ったなら、条件を満たせば最終的に二通りの和平がある。
- 相手との交戦期間(AtWarCounter)をチェックし、全面戦争なら40ターンより大きいとき、それ以外なら30ターンより大きいときに
終戦値(endWarVal)を比較して彼我の差が2倍より大きいなら和平する。
これを満たさない場合、
- 相手との交戦期間が20ターンより大きく、かつ便乗参戦で、かつ戦争相手にとっての敵国が1つ(つまり相手と自分だけの戦争)のとき、和平する。
なお、後者の場合は終戦値(endWarVal)を考慮しない。
(詳細はCvTeamAI::AI_doWarを参照)
- 取引を伴うケースと伴わないケースの二種類の終戦プロセスがある。
- AIが終戦するかどうかを決めるのは、開戦からの経過ターン数、乱数、戦果の三要素である。
- (おそらく)被宣戦側のiMakePeaceRandは終戦処理に全く影響しない。
- 便乗参戦をしたAIは終戦しやすい。
- 宣戦依頼をした場合、宣戦対象の交戦国が1つになるなら限定戦争、2つ以上になるなら便乗戦争となる。
(CvTeam::declareWar, CvDeal::startTrade参照)
- 領土が戦争相手の2.5倍より広いときAIは制覇モードに入り、停戦介入が不可能となる。
(CvTeamAI::AI_makePeaceTrade参照)
- 降伏の詳細な条件は未調査。
- 取引を伴う和平において、条件が折り合わない場合は和平を拒否するのか妥協して和平自体は確定するのかは不明。
- 被宣戦側のWarPlanTypeは戦争を通じてずっと被攻撃として扱われるのか。つまり、何らかの条件で戦争中に攻撃側のタイプに変化することはないのかが未確定。
- 上の項目と関連するがAI_isChosenWarの解釈が不明。
- かなり複雑な処理なのでまだ間違いが含まれている可能性があります。ソースが読める方は検証をして頂けると助かります。
- 訂正に限らずご自由に加筆、編集して下さって構いません。
- ただし、重要な訂正の場合は打ち消し線を使ったりコメントしたりしてその旨が分かるようにしてください。