【CookieClicker】Ascendマイナスバグの謎に迫る
はじめに
Cookie Clickerというゲームをご存知でしょうか。
https://orteil.dashnet.org/cookieclicker/
↑のリンクから遊べるブラウザゲームです。その高い中毒性から、2013年9月に日本で大流行しました。また数々のフォロワーゲームを生み出した、放置系ゲームの草分け的存在です。
リリース8年経った今でも遊ばれており、またアップデートが続けられているかなり息の長いゲームです。
そんなCookie Clickerですが、2021年9月1日にSTEAM版がリリースされました。値段は520円。
C418氏*1によるbgmや、様々なMODを簡単に導入出来たりと、色々追加要素があります。気になる方はぜひ購入してみてください。
それはさておき。今回はこのゲームをプレイしているときに発生するあるバグの話です。
なんだこのマイナス
このゲームでは、クッキーの生産速度向上のため、定期的にリセットを行います。リセットをすることで今までに焼いたクッキーの枚数に応じてPrestige Level(名声レベル)が上がり、生産力が向上します。またこれと同量のチップが貰え、これで特別なアップグレードを買うこともできます。この時、右上の「遺産(legacy)」というボタンをクリックする必要があります。このボタンの下にはゲージがついており、次のレベルまでの目安になっています。
なっているんですが……
以下の画像をご覧ください。
???????????????
次のレベルまでに必要なクッキーの量が何故かマイナスになっています。これが出てくる頃は既に1054枚程度クッキーを焼けているので、大した問題にはなりません。ただ少し見栄えが悪いです。
この少しモヤっとする問題を解決すべく、ソースコードを覗き見ることにしました。このゲームは実はJavaScriptで書かれているので、結構簡単に解析とかできます。
問題解決
結論から言うと、演算誤差です。
現在、名声レベルは以下の式により決定されています。
式内のLは名声レベル、Cは今までに焼いたクッキーの量を表しています。つまり焼いたクッキーの量を1兆分の1して、それの3乗根を計算したものがレベルになっています。
そして、次のレベルまでの値は、現在のレベルより1大きいものの3乗から現在のレベルの3乗を引き、1兆倍することで求めています。
式に表すとこんな感じです。
このように、名声レベルの決定は3乗根、次のレベルまでの表示には3乗を用いています。この計算方法の違いがバグの元となっていました。
実は3乗根を計算してレベルが上がるクッキーの量は、本来必要な量より多くなっています。
図にするとこんな感じ。
つまり本来必要な量より多いクッキーを持っているが、3乗根を計算するとレベルが上がっていないので、必要数がマイナスになるとうことです。これの理由は良く分かってませんが、多分計算するプログラムとかの精度の問題だと思います。扱う数字がかなり大きいので、まともに計算できなくなっていると思います。
そしてこの誤差ですが、500兆あたりから1を超えます。1を超えると、下の写真のように常にLegacyの下のゲージが満タンになり、次のレベルまでの表記も常にマイナスとなります。こうなるともうゲージの意味は無くなります。信頼できるのは左の数字だけです。
こんな感じで、見栄えが悪くなるだけでなく、本来よりレベルが低く計算されるという実害もあります。ですが、実際のところ殆ど影響はないです。数レベル損していようが、500兆レベルから見れば誤差の範囲だからです。
ちなみに、500兆からは演算誤差によりゲージが壊れますが、9000兆より先は奇数を表現できず、1レベル先が存在しなくなるため、完全に壊れます。V2.031(Steam版はV2.042)ではクッキーを1063枚焼くという実績が存在しますが、ゲージを壊すのに必要な枚数は7×1059枚です。とっくの昔に壊れているので、あまり気にしないようにしましょう。
おわりに
このバグは計算機のバグそのものなので、特に作者が悪いとかそういう話ではありません。このバグを1年以上放置していたのは悪い気もしますが……
このAscendシステムはV2でリニューアルされたもので、その時には1040枚が精々だった気がします。V2が実装されたのは5年前で、その時からクッキーは1020倍も焼けるようになったので、ここらでまたシステムを作り直す必要が出てきそうです。それがいつになるのかは分かりませんが、作者のやる気次第といったところでしょうか。Steam版もヒットしているみたいですし、なるべくいい感じに修正されたらいいなと思っています。
で、このバグは結局何なの?
用いる数字がクソデカなせいで起きたバグです。レベルが500兆(500Trillion)程度になるとゲージが完全に壊れて使い物にならなくなります。それ以外に影響は特にないです。