2013-09-24

Cookie ClickerのJSを読んで楽しみながらチートする



Cookie Clicker良いよね…。
(良さがわかりやすい記事はこちら。)

面白すぎて、仕事ができなくなってしまうのが怖くなったので、本気出して一瞬で終わらせてやろうと思ってチートを開始しました。

とりあえず圧倒的なまでのクッキー生産速度を出せればOKなところまで頑張ります。

ソースはheadタグの中にあるmain.jsってのを読んでいきました。


■クッキーを自動クリックしてみる

クリックするでかいクッキーのhtmlを見てみたらbigCookieという名前がついていたので、chromeのコンソール(option + command + i)を出して、

$('#bigCookie').click();

を実行したら行けた。
これを繰り返して

setInterval(function(){ $('#bigCookie').click(); }, 1);

ってやったら凄い速度でクリックしてくれる。もうすでに楽しくなってきた。
ソースを読んでたら、前回クリック時間からのクリック時間を毎回チェックしてて、超速でクリックするともらえるアチーブメントがあった。この方法で取得できるはず。


■面倒なのでクッキーを直接付与してみる

ソースを探していくとあったあった

Game.Earn();

という関数。
ここに、Game.Earn(100);とやったらちゃんと100枚付与された。
よし、じゃあ

Game.Earn(10e1000000000);

ってやってみたら所持クッキー数がNaNになるw
しかしtitleタグの方を見てみると、In,fin,ityとなっていたので、所持枚数が無限大という宇宙の法則が乱れる状態になった。

もちろんアイテムも買い放題だ。


■ババア買うのもめんどくさい

クッキーババアとかの施設を買うのがめんどくさくなってくる。今の状態なら5000くらいまでは買える(理由は後述)のでこれもなんとかする。

setInterval(function() { $('#product0').click(); }, 1);

これでCursorが買えるようになる。
おなじ要領でproduct1,2,...,9までやってく。そういうスクリプトを書いてもいいだろう。


■なんか遅い

ババアとかカーソルとか工場とか、上記の方法で買って行くと普通に数千まで増えていって、動作がなんか重くなる。
どうしてかなーと思ったんだけど、どうやら描画してるババアやらカーソルやらはすべて1つ買う毎に丁寧にDOMを追加してるらしい。それは重くなるだろう。。

じゃあDOM消しちゃえばいいじゃん!と思ってElementsからDOMを直接deleteしたらゲームが動かなくなってしまった。
そういう作り方らしい。それは仕方ない。DOMを消さずに表示を何とかすれば良いので、styleでdisplay = "none"にしてしまおう。

CookieClickerのコード内でなんだか
l('bigCookie')のような記述が多くてなんだろーと思っていたら、document.getElementByIdの略だった。なんでL?まぁいいや、便利なので使わせてもらって、

l('sectionLeft').style.display = 'none';
l('sectionMiddle').style.display = 'none';

これで左と真ん中のものが増え続けるカラムが消えていく。
見えなくなっただけで、domは残っているのでゲームはちゃんと続行しているはず。


■価格がIn,fin,ity wwwwwwwwww

ババアなどの購入価格がIn,fin,ityになってたww
もうわけがわかりませんね。この時期にはcpsもよくわからない桁になってるので、そろそろ飽きてきます。
最初にやったCookie.EarnをsetIntervalで回してInfinityを付与しまくるように変更。
ただ、買うたびに一旦所持クッキー数が0になるのでなんだかだるくなってきます。


■あれ…??

Upgradeアイテムの購入がめんどいから色々探してたらなんかすげーの見つけた。。

  Game.RuinTheFun=function()
  {
   for (var i in Game.Upgrades)
   {
    Game.Unlock(Game.Upgrades[i].name);
    
    Game.Upgrades[i].bought++;
    if (Game.Upgrades[i].buyFunction) Game.Upgrades[i].buyFunction();
   }
   for (var i in Game.Achievements)
   {
    Game.Win(Game.Achievements[i].name);
   }
   Game.Earn(999999999999999999);
   Game.upgradesToRebuild=1;
   Game.recalculateGains=1;
  }

まさかと思って実行したら。。
すべてのアチーブメントとアップグレードアイテムが手に入ってました。
なんでこんなの残しておいたんや。。


■もういいかな。。

これで大体やりきった感じになる。
あとはすべての購入価格がIn,fin,ityになるまで頑張るのも良いと思います。
しかし、上記のdisplay: noneをやってないと重すぎて全く動かなくなるのでこのへんが引き際なのではないかと思いますw

色々頑張っていくとこんな感じになります。グロい。


お疲れ様でした(・ω<)