ボットは何を考えて線を引くか
ボットは毎フレーム考えているわけではありません。数秒おきに「次はどこへつなぐか」を1回決めて、その手を実行します。判断の中身は意外なほど素直です。
01考えてから動くまでの流れ
ボットは minDecisionMakingTime と maxDecisionMakingTime のあいだのランダムな秒数だけ待ち、そのあと候補の建物を全部評価して、いちばん高い1棟へ線を引きます。引いたらまた待ちます。
待ち時間を持たせているのは、人間が操作できる速度に合わせるためだと考えられます。4〜8秒設定のボットは平均6秒で手を出すので、こちらの2手に対して1手くらいのペースです。
02判断値の作り方
候補の建物1棟ごとに、次の3つを足して、最後に係数を掛けます。ビルドのソースでは、この合計がそのまま「つなぐ価値」になります。
- 建物タイプ係数:四角1.0、円1.2、三角1.2、星1.5。形が強いほど高い。
- 人口比スコア:候補の人口を上限で割った値。自軍の建物には線形(Linear.None)、敵の建物には Sinusoidal.Out の曲線を当てる。
- 周囲係数:候補につながっている建物の成長速度を合計し、タイプ(攻撃・防御)で重みを変えて足す。
- 最後に decisionValueFactor(既定1)を掛ける。
03待ち時間の2大パターン
288体中150体が4〜8秒、117体が1〜15秒です。前者は安定して干渉してくる相手、後者は長い沈黙がある代わりに、動き出したときの判断が遅いぶん読みやすい相手です。
同じステージでも、どのチームのボットがどの設定かで難易度が変わります。3体いるステージでは、4〜8秒のボットが2体混ざっていることが多く、こちらが2手打つあいだに2手返ってくる形になります。
04奪うか、育てるか
allowTakeover が true のボットは、相手の建物を奪いに行きます。false のボットは奪わず、自分の建物を育てる側に回ります。288体中 false は2体だけで、ほとんどのボットは攻めてきます。
奪う動きが入ると、判断値のうち「敵の建物の人口比」が効いてきます。人口が上限に近い敵の建物は Sinusoidal.Out で高い値が出るため、ボットは「太った敵」を狙いやすい計算になります。
05開幕だけは台本がある
91体のボットには botActions が入っています。これは「何秒待って、どの建物からどこへ線を引く」という指定で、ステージ開始直後の数手だけ台本どおりに動きます。
台本がある理由は、開幕の形を作者が揃えたいからだと推測できます。たとえば level-96 は8手ぶんの指定があり、星だらけの街で最初の数手が固定されています。台本を消化したあとは通常の判断ループに戻ります。