藍緑日記

検証したものとかを置いておきます

【CookieClicker】Ascendマイナスバグの謎に迫る

はじめに

Cookie Clickerというゲームをご存知でしょうか。

https://orteil.dashnet.org/cookieclicker/

↑のリンクから遊べるブラウザゲームです。その高い中毒性から、2013年9月に日本で大流行しました。また数々のフォロワーゲームを生み出した、放置系ゲームの草分け的存在です。

リリース8年経った今でも遊ばれており、またアップデートが続けられているかなり息の長いゲームです。

そんなCookie Clickerですが、2021年9月1日にSTEAM版がリリースされました。値段は520円。

store.steampowered.com

C418氏*1によるbgmや、様々なMODを簡単に導入出来たりと、色々追加要素があります。気になる方はぜひ購入してみてください。

それはさておき。今回はこのゲームをプレイしているときに発生するあるバグの話です。

なんだこのマイナス

このゲームでは、クッキーの生産速度向上のため、定期的にリセットを行います。リセットをすることで今までに焼いたクッキーの枚数に応じてPrestige Level(名声レベル)が上がり、生産力が向上します。またこれと同量のチップが貰え、これで特別なアップグレードを買うこともできます。この時、右上の「遺産(legacy)」というボタンをクリックする必要があります。このボタンの下にはゲージがついており、次のレベルまでの目安になっています。

なっているんですが……

以下の画像をご覧ください。

f:id:lc06454:20211011230326p:plain
 
f:id:lc06454:20211011230502p:plain
(和訳:次のレベルまであと-1正1570澗枚のクッキーが必要です。)

 

???????????????

 

次のレベルまでに必要なクッキーの量が何故かマイナスになっています。これが出てくる頃は既に1054枚程度クッキーを焼けているので、大した問題にはなりません。ただ少し見栄えが悪いです。

この少しモヤっとする問題を解決すべく、ソースコードを覗き見ることにしました。このゲームは実はJavaScriptで書かれているので、結構簡単に解析とかできます。

問題解決

結論から言うと、演算誤差です。

現在、名声レベルは以下の式により決定されています。

L = \sqrt[3]{\frac{C}{10^{12}}}

式内のLは名声レベル、Cは今までに焼いたクッキーの量を表しています。つまり焼いたクッキーの量を1兆分の1して、それの3乗根を計算したものがレベルになっています。

そして、次のレベルまでの値は、現在のレベルより1大きいものの3乗から現在のレベルの3乗を引き、1兆倍することで求めています。

式に表すとこんな感じです。

((L+1)^3-L^3)\cdot10^{12}

このように、名声レベルの決定は3乗根、次のレベルまでの表示には3乗を用いています。この計算方法の違いがバグの元となっていました。

実は3乗根を計算してレベルが上がるクッキーの量は、本来必要な量より多くなっています。

図にするとこんな感じ。

f:id:lc06454:20211012235713p:plain

つまり本来必要な量より多いクッキーを持っているが、3乗根を計算するとレベルが上がっていないので、必要数がマイナスになるとうことです。これの理由は良く分かってませんが、多分計算するプログラムとかの精度の問題だと思います。扱う数字がかなり大きいので、まともに計算できなくなっていると思います。

そしてこの誤差ですが、500兆あたりから1を超えます。1を超えると、下の写真のように常にLegacyの下のゲージが満タンになり、次のレベルまでの表記も常にマイナスとなります。こうなるともうゲージの意味は無くなります。信頼できるのは左の数字だけです。

f:id:lc06454:20211013003452p:plain

こんな感じで、見栄えが悪くなるだけでなく、本来よりレベルが低く計算されるという実害もあります。ですが、実際のところ殆ど影響はないです。数レベル損していようが、500兆レベルから見れば誤差の範囲だからです。

ちなみに、500兆からは演算誤差によりゲージが壊れますが、9000兆より先は奇数を表現できず、1レベル先が存在しなくなるため、完全に壊れます。V2.031(Steam版はV2.042)ではクッキーを1063枚焼くという実績が存在しますが、ゲージを壊すのに必要な枚数は7×1059枚です。とっくの昔に壊れているので、あまり気にしないようにしましょう。

おわりに

このバグは計算機のバグそのものなので、特に作者が悪いとかそういう話ではありません。このバグを1年以上放置していたのは悪い気もしますが……

このAscendシステムはV2でリニューアルされたもので、その時には1040枚が精々だった気がします。V2が実装されたのは5年前で、その時からクッキーは1020倍も焼けるようになったので、ここらでまたシステムを作り直す必要が出てきそうです。それがいつになるのかは分かりませんが、作者のやる気次第といったところでしょうか。Steam版もヒットしているみたいですし、なるべくいい感じに修正されたらいいなと思っています。

で、このバグは結局何なの?

用いる数字がクソデカなせいで起きたバグです。レベルが500兆(500Trillion)程度になるとゲージが完全に壊れて使い物にならなくなります。それ以外に影響は特にないです。

*1:Minecraftのbgmを作曲した方