2024年8月23日公開、担当は StrangePan と Earendel。原題は Friday Facts #425「Behind the legs」です。前週の FFF-424 で発表された新しい敵——グレバに棲むペンタポッド(ストンパーとストレイファー)——を、ゲームに組み込むまでの舞台裏を語る回です。公開はまだ Space Age 発売(2024年10月)の約2か月前、2.0 の開発がいよいよ大詰めという時期でした。最適化の話、経路探索の話、そして「前回の発表動画はどうやって作ったのか」という撮影裏話まで、盛りだくさんの内容です。
まずスパイダートロンを速くするところから
ペンタポッドの脚は、既存のスパイダートロンの脚を動かすコードを再利用して作られています。ところがそのスパイダートロンには、もともと性能上の弱点がありました。1.1 の時代、川のような広い障害物を大群で渡らせると UPS が目に見えて落ちる——セーブデータによってはスパイダートロン10体でも影響が出るほどでした。ペンタポッドを足すには、まずこの重さを解消しなければならなかったのです。
in order to bring Pentapods to life, I first needed to optimize Spidertron.
(訳)ペンタポッドに命を吹き込むには、まずスパイダートロンを最適化する必要があった。 — StrangePan
最大の原因は、脚を置くための「空いている場所」を探すアルゴリズムでした。1.1 ではこの探索が中心から外へ渦巻き状に進み、タイルの 1/5(0.2タイル)刻みで最大 16×16 タイルの範囲を当たり判定していきます。空きが見つからない最悪ケースでは、1本の脚が1ティックあたり約6400回もの衝突チェックを行っていました。しかもそれを、スパイダートロンの全ての脚が毎ティック実行していたのです。

解決のカギは「探索の精度(0.2タイル)が細かすぎる」という気づきでした。タイルはその5倍、ほとんどのエンティティは10倍以上の大きさがあります。つまり同じタイルや物体を何度も何度も当たっているわけです。そこで、ぶつかったらその物体の当たり判定の端まで一気に飛び越す。さらに各物体の境界ボックスを覚えておけば、行や列をまるごとスキップできる。結果、チェック回数は劇的に減りました。

さらに2つ目の無駄として、近くにいる脚どうしがほぼ同じ場所を別々に探索している問題がありました。そこで、ある脚が探索して「この内側は全部ふさがっている」と分かったら、その四角を「探索除外ゾーン」としてリストに登録。同じティックの間、ほかの脚はそのゾーンを丸ごと飛ばせるようにしました。実装はごく素朴で、しかもその1ティック限りでしか有効でない仕組みなのに、効果は絶大だったそうです。
3つ目は「どの脚を動かすか」を選ぶアルゴリズムそのもの。旧方式では、歩行中は全ての脚が毎ティック空き地を探し、一番大きく踏み出す必要がある1本だけを選んで動かし、残りの探索結果は捨てていました。これを一新したのが、5本脚のペンタポッドでした。Earendel が「脚を動かす順番を完全に制御して、生き物らしい有機的な歩き方をさせたい」と求めたことがきっかけで、各脚に番号付きの「歩行グループ」を割り当て、現在のグループの脚だけが探索・移動する方式へ。無駄な探索が消え、同時にデザイナーが歩行アニメを細かく演出できるようになりました。5本脚は、バランスを保つために五芒星を描くように踏み出します。

これら3つの大きな最適化(と細かな改良)の結果、スパイダートロンの機動性を酷使するテストセーブで、1更新あたりの処理時間が平均 53.56% 減——およそ 2.15 倍速くなったとのこと。2.0 では、UPS を崩さずに以前より大きなスパイダートロン部隊を運用できるようになりました。
I measured an average of 53.56% fewer milliseconds per update (approximately 2.15× faster).
(訳)1更新あたりの時間を平均 53.56% 削減できた(約 2.15 倍速)。 — StrangePan
脚のコードを共有している関係で、スパイダートロン自身の見た目もわずかに変わりました。関節が以前より柔らかく、少しだけ不気味に動くようになっています。下の動画は 1.1(左)と 2.0(右)の歩行アニメの比較です。
新しい敵がもたらす、新しいエンジン機能
新しい敵には新しい挙動が、新しい挙動には新しいエンジン機能が必要になります。この回では、ペンタポッドの設計を支えるために加えられた仕組みがいくつか紹介されています。
壁を無視して攻めてくる経路探索
グレバの工場を壁でぐるりと囲んで守る——そんな単調な遊びにはしたくない。そこで開発陣は「こちらの壁などお構いなしに来る敵」をあえて設計しました。プレイヤーは壁ではなく、火力と新装備のロケットタレットで迎え撃つことになります。これを実現するため、既存のバイターの経路探索(FFF-317)を拡張し、水や壁などの隙間を飛び越えて進む経路を出せるようにしました。チャンク単位の抽象探索では、通行できないタイルにも「最寄りの通行可能タイルまでの距離」を記録させ、チャンクをまたいで通行可能な領域どうしをつなげています。

この「とびとびの経路探索(discontiguous pathfinding)」は、基本ゲームでは使われていないものの、2.0 では modding API 経由で modder が利用できるようになっています。
空気中の胞子——グレバの「汚染」を作り替える
壁で止められないなら、今度はプレイヤーが「どこから来るか分からないので工場の四方八方をタレットで囲む」羽目になりかねません。それも避けたい。そこで開発陣は、グレバでの汚染の扱いそのものを変えました。敵(バイターもペンタポッドも)は基本的に汚染の多い場所を狙って攻めてきます。ナウヴィスとグレバでは汚染を出す機械の性質が違うのに、バイターの挙動は変えずにペンタポッドだけ特定の建物を優先させたい——その答えが 汚染物質タイプ(pollutant types) でした。
2.0 では、機械・植物・巣・タイルごとに「どの汚染物質をどれだけ出す/吸う」かを設定できます。ただし性能上の理由から、1つの惑星(サーフェス)につき有効にできる汚染物質タイプは1種類だけ。既定の種類が従来どおりの「汚染」で、Space Age のグレバではそれが 胞子 に置き換わります。おかげでペンタポッドは工場の大部分を無視し、ごく一部の建物だけに狙いを絞るよう調整できました——こちらから手を出さなければ、ですが。
In Factorio: Space Age, Spores replaces Pollution on Gleba.
(訳)Factorio: Space Age では、グレバで「汚染」の代わりに「胞子」が使われる。 — StrangePan
作り直された脚
有機的な生き物らしさを出すため、ペンタポッドの脚は「伸び縮み」を抑え、膝や付け根の「曲げ」を強調するよう作り直されました。さらに、体に対する向きに応じて脚のスプライトそのものを差し替える仕組みも。Factorio 独特の斜め見下ろし視点では難しい処理でしたが、Fearghall と Earendel がライティングの角度と遠近を常に合わせ込み、作り物っぽさを消しています。
発表動画はどう撮ったのか——Earendel の裏話
後半は Earendel による「前回の戦闘動画をどう作ったか」の制作秘話です。きっかけは「前回の FFF を作る FFF を書けるんじゃないか」という冗談だったとか。手順はこうです。ランダム生成の地形を「闘技場」として切り出し、敵を配置してシナリオとして書き出す。そこにキャラクターの移動・武器操作(どの武器を選び、撃つか、どこを狙うか)を記録する「パフォーマンスキャプチャ」を適用して、戦闘を再生する——はずでした。
ところが、同じ入力を流しても敵は毎回違う動きをする。記録コードと再生コードが存在するだけで結果が変わってしまい、「録画どおりに再現する」のは原理的に不可能だと判明します。木の1本、タイル1枚、装飾1つを足すだけで、エッグラフトが産む個体の種類すら変わる。しかもキャラクターは、滑空してくるリグラーに当たると減速し、コースを外れて木に突っ込んで踏み潰される——。そこで Earendel は、意図した経路から離れすぎたら強制的に補正方向へ走らせる仕組みや、キャラクターの軌跡をならして追従させる新しいカメラ制御を組み込んでいきました。

戦闘は音楽に合わせて振り付けられているので、タイミングが命です。エッグラフトはビートが入る直前に、ストレイファーは曲が少し不穏になる瞬間に倒れてほしい。脚のある敵はテレポートさせると1フレームで元に戻ってしまうため、カメラに入る直前に LUA スクリプトで正しい位置に出現させる。それでも左右どちらに逸れるかは個体ごとに五分五分で、最初のストレイファーの向きだけは開始位置を微調整して「当たり」を引くまで粘ったそうです。極めつけは最後のストンパーで、ちょうど良い時刻に倒す制御がどうしても安定しない。そこで体力を10倍にしておき、狙った瞬間にスクリプトで即死させるという力技で解決しています。体力バーは隠してあるので違和感は出ません。
The final fix for this is just to multiply the thing’s health by 10x and use a script to insta-kill it at the correct time.
(訳)最終的な解決策は、こいつの体力を10倍にしておいて、正しいタイミングでスクリプトで即死させるだけ。 — Earendel
WLF 編集部のひとこと
スパイダートロンを川で大量に歩かせると重くなる——これは 1.1 を遊び込んだ人なら一度は体感したはずの「あるある」で、それが 2.0 で約2倍速くなっていたと数字で示されると納得感があります。しかも速くなった副産物として、5本脚のペンタポッドという新しい敵まで成立した、という順番が面白いところ。最適化が機能を生んだわけです。
実際にグレバで遊ぶと、「汚染を胞子に置き換えた」調整の効き目がよく分かります。工場全体を囲わなくても、胞子を強く出す一部の設備さえ守れば攻撃をかなりいなせる。壁で固めるナウヴィス式の防衛がそのまま通用しないぶん、遊びの質がはっきり変わっています。そして何より、あの格好いい戦闘動画の裏で体力10倍&スクリプト即死という“楽屋オチ”が行われていたと知ると、次回からの公式動画の見方が少し変わってしまいますね。
原文: Friday Facts #425「Behind the legs」(2024年8月23日)。画像・動画は原文より。この記事は AI(Claude)がまとめました。