本の虫

著者:江添亮
GitHub pages: https://ezoeryou.github.io/blog/
Blogger: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合、住所をメールで質問してください。

Outer Worldsでコンパニオンが死んでいないのに死亡したと認識されるバグ

https://twitter.com/_taylorswope/status/1205252714680045568

今日、#TheOuterWorldsのパッチ1.2をリリースした。これには「ゲームがコンパニオンを死んだとみなす」バグの修正も含まれている。このバグは俺のキャリアで最も長い時間を費やしたデバッグ作業となった。

このバグの概要は、一部のプレイヤーで、コンパニオンクエストが失敗とクエストログにでる。その理由はコンパニオンが死んだからだ。しかし字祭にはコンパニオンは死んでいないにもかかわらずだ。

これは解せないもので、というのも超新星モードでもなければ、コンパニオンは死なないからだ。

リリース前に1度か2度だけこの問題が発生したが、QAチームは再現できなかったので、その原因を特定することはできなかった。

原因の特定が困難だった理由は、どこで問題が発生しているかわからなかったことだ。問題が発現したすべての例で、10時間以内に問題が起こったのでクエストが壊れたらしい、ぐらいしかわからなかった。

この問題の調査にはすべてのスクリプトとコードで、コンパニオンが死亡すると認識する場所を洗い出す必要があった。

論理的に考えて問題の原因箇所となりうる唯一のスクリプトが実行される状況は、コンパニオンのヘルスがゼロになったときだ。銭湯が終わるまで待ち、復活させる。それ以外の場合に、本当に死んだとマークする。

ゲーム中、コンパニオンが存在するがアクティブなパーティには加入していない常用というのは、船の中だけだ。問題は、コンパニオンが船の中にいるときは、ダメージを受けないはずなのだ。

「ダメージを受けない」というのは「死なない」という意味ではない。攻撃によってダメージを受けないが、他の要素ではダメージを受ける。そのうちの一つは、とても高い距離から落下するというものだ。

問題は、船の中には落下死できる場所はない。そこで、今度はなぜコンパニオンがそんな高い場所に移動するのかということを突き止めなければならなかった。

大量の仮説を考えた。「もしかしたらファストトラベルで他のマップに移動したとき時に位置データが維持されているのではないか」とか「もしかしたら2人のコンパニオンが衝突した時に物理演算によって上方向に加速したのではないか」

個人的にお気に入りの仮説は、「コンパニオンがランダムイベントで牛がスポーンする場所に立っていて宇宙に打ち上げられるのではないか」 だ。仮説が否定されたときはちょっと落ち込んだものだ

そしてゲームがリリースされたが、たまたま発生した本来起こりえない不具合だったという希望は打ち砕かれた。世界中のプレイヤーがコンパニオンクエストが失敗したぞと報告し始めたからだ。

最終的に、ユーザーのレビューの中にあった何気ないコメントに、コンパニオンが虚空を登っているという変なバグを見たというものがあり、このコメントによって問題箇所の特定ができた。

開発上、NPCが周りとインタラクトするシステムは、「家具」とよばれている。これは文字通り椅子に座ると言った家具であることもあるが、端末使用とか壁に寄りかかるといった動作もすべてそうだ。

家具システムの奥深いところに、プレイヤーが会話中は、すべてのNPCに新しい家具インタラクションを無効化するコードがあった。

問題は、ハシゴの使用は2つの異なる家具インタラクションになっていた。一つはハシゴに取り付いて登る動作、もう一つは登るのを辞めてハシゴから降りる動作だ。

そのため、誰かがハシゴを登り始め、停止する前にプレイヤーが会話に入った場合、ハシゴから降りることができず・・・まあ、その・・・

So, if someone started climbing a ladder and the player entered a conversation before they stopped, they wouldn't be able to exit the ladder, and, well…. (18/18) pic.twitter.com/xcduTy4d12

— Taylor Swope (@_taylorswope) December 12, 2019

なかなか笑えるバグだ。