AI間戦争の和平プロセス

AI間戦争の和平プロセス
Last-modified: 2013-12-14 23:46:48

概要 †

AI同士の戦争が終結するまでの処理を、SDK(プログラムのソースコード)を基にして解説する。
人間プレイヤーに対する振る舞いは若干異なっている部分もあるが、人間プレイヤーの絡む戦争ではそもそも和平のタイミングが人間に大きく依存するため、ここでは割愛したい。



用語解説 †

iMakePeaceRand †

終戦確率を決める値で高いほど停戦しにくい。
XMLで指導者ごとに予め決められている。

参照: AI指導者のパラメータ一覧表

AtWarCounter †

戦争が何ターン継続しているかを表す。和平すると0にリセットされる。

WarPlanTypes †

戦争の性質を表すもので、全面戦争(TOTAL)、限定戦争(LIMITED)、便乗戦争(DOGPILE)などがある。
しかし、被宣戦側はそのいずれでもなく被攻撃(WARPLAN_ATTACKED)というタイプになると思われる。
つまり、宣戦側と被宣戦側のタイプは同じにはならない

WarSuccess †

他の指導者に対する戦果を表す値で以下のように加算されていく。和平すると0にリセットされる。

endWarVal †

ある指導者と戦争を終わらせるかどうかを決めるために毎ターン計算されるスコア。
以下のように計算される。

  1. 初期値は100。
  2. 両者(つまり自分と相手)の都市数 * 3と人口を足す。
  3. WarSuccess * 20を足す。
  4. 相手の軍事力 / (自分の軍事力 + 相手の軍事力)を掛ける。
  5. 相手より戦力が優っていてAI同士の戦争の場合のみ、スコアを圧縮して停戦しにくくするために以下の処理を行う。
    1. 領土が相手よりも1.2倍より広い場合はスコアを下方修正
    2. 財政危機の時、WarRandが100より小さいAI(つまり戦争屋)はスコアを下方修正

さらに戦力にかかわらず以下の処理を続ける。

  1. 全面戦争ならスコアを上方修正する。
  2. 便乗戦争でタイマンになったときはスコアを上方修正する。
  3. 攻撃的AIの場合、都市が取れそうな状況ではスコアを下方修正する。

    (詳細はCvTeamAI::AI_endWarValを参照)



処理の流れ †

戦争が終わる際の処理はAI_doWar関数を中心に行われる。
処理には大きく分けて取引を伴う処理取引を伴わない処理の二つがある。
また、属国はAI_doWarの処理をしない。

取引を伴う処理 †

  1. 相手との交戦期間(AtWarCounter)が10ターンより大きいかチェックする。
  2. 降伏が可能かどうかチェックする。*1
  3. 降伏が不能な場合、20分の1(指導者によらず一定)の確率で取引を介した和平交渉を行う。

    (詳細はCvPlayerAI::AI_doPeaceを参照)

取引を伴わない処理 †

上述の取引を伴う処理が終わった後に実行される。

  1. 戦争中かどうかチェックする。
  2. 1 / iMakePeaceRandの確率で以下の処理に入る。
  3. 各指導者に対して交渉可能かチェックする。
  4. 自分から宣戦した戦争かどうかをチェックする。 *2

処理がここまで至ったなら、条件を満たせば最終的に二通りの和平がある。

これを満たさない場合、

なお、後者の場合は終戦値(endWarVal)を考慮しない。

(詳細はCvTeamAI::AI_doWarを参照)



まとめ †

TIPS †

疑問点・不明点 †

コメント †


*1 これは明らかに一方が負けているときなので詳しい条件の解説は割愛する。
*2 実はここで使われているAI_isChosenWarという関数がこういう意味合いを持つか確証が持てないのだが、仮にそうだとするなら、被宣戦側のiMakePeaceRandは和平に全く影響しないことになる。とにかく、自国のWarPlanTypesがWARPLAN_PREPARING_LIMITED、WARPLAN_PREPARING_TOTAL、WARPLAN_LIMITED、WARPLAN_TOTAL、WARPLAN_DOGPILEのいずれかの場合のみ次の処理に進むということは確実である。