読者です 読者をやめる 読者になる 読者になる

ottatiのブログ

無職学生がネットにクソアプリをまき散らしていく様子

協力してステージをクリアするブラウザゲー『Cursors.io』でチートする方法

あああ game

f:id:ottati:20150103125718g:plain     🍣

※ この記事を読むときの注意: チートしないで楽しくゲームしましょう :p

Cursorsはカーソルを操作して迷路をゴールするブラウザゲーム

第1ステージ:

f:id:ottati:20150128213127p:plain

これはただの迷路ではなく、みなで協力しないと絶対にクリアできない仕掛けとなっている。さらに協力しても相手に裏切られる、ステージ的に協力したとしても自分はいけないなど、さまざまな駆け引きを楽しむことができる。

基本的に世界中からプレイヤーが来るが、2chのどこかにスレが立った時だけ日本人がくる。

このゲームではコミュニケーションも取ることが可能だ。Shiftキー押しながらマウスをドラッグすることで文字が書けるので矢印やfuck, fagsなどを表現することが可能なのだ。

今日はこのゲームでのチートについて考える

f:id:ottati:20150103125718g:plain

最近、このゲームではチーターをよく見るかける。どうやら自分が行ける範囲(しばしばスイッチを押さないと進めない場所がある)に瞬時に移動できている。これによって複雑な道のロスを回避し、一人で4人分ほどの役割ができる。ただスイッチを押さないと壁の向こうへは行けていないチータが多い。だがこのゲームでは壁抜けは非常に強力で、それはパックマンが壁抜けできた場合と同等のレベルだ。

答え

ソースコードの2つ目のif(D)の直前にk=B>>1; q=C>>1;を挿入する。chromeの開発者ツールなどを出してsourcesから編集する。すると以下のようにゲーム的に行ける範囲には瞬時にカーソルを移動できる。

f:id:ottati:20150128223121g:plain

ソースコードを読む

カーソルが壁抜け能力を持つ程度に読む。スイッチを押さないといけないところにも壁抜け出来る方法を調べたい方の参考になれば。

ソースコード: http://cursors.io/client_out.js?7

変数名も関数名もAやaなど、非常に読みづらい。とりあえずインデントや改行などをchromeで整形したコード: https://gist.github.com/ottatiyarou/f8a440fc5323306966e4

socket.ioでプレイヤを同期している。

なにがいつサーバに送られるか

まずどのコードで、どんなものがいつサーバに送られているかを探す。そしてそれはQという関数でカーソルの座標が変更された時にだけ動くようだ。sendという名前を探していくと、それっぽいのがあった。送るデータは以下のようにセットされている。

            b.setUint8(0, 1);
            b.setUint16(1, k, !0);
            b.setUint16(3, q, !0);
            b.setUint32(5, G, !0);

k, qがカーソルのx, y座標っぽいことがわかる。

カーソルの座標変更タイミング

次にカーソルの座標が変更されるであろうマウスが動いたタイミングを見る。変数名はあれでもさすがにイベント名は変えられないのでmousemoveな処理を探す。onmousemoveにはuaという関数が指定され、uaではVという関数が呼び出される。マウスの動いた分であるx, yが取得される。動いた分はBとCに足される。BとCをカーソルのゲーム上での座標に直すにはB >> 1, C >> 1とすればいい。

最初のif文が終わった時点でBとCの値は壁判定前のものだ。だがkとqは既に修正されている。なのでここでkとqにB >> 1, C >> 1を代入するようにする。ただの壁抜けであればこれでおk

f:id:ottati:20150128223109g:plain

壁すり抜けに関してこれ以上はみていない。

壁に当たった場合にサーバから返ってくるもの

onmessageではGaという関数が呼び出される。 サーバから送られてきたデータから処理は振り分けられる。

通常はcase 1だが、送った座標が壁やスイッチを押さないと行けないような場所であった場合はcase 5となり、カーソルの座標は修正される。W関数はx, yの2つの引数を取る。関数Wが呼び出され、サーバから送られてきた"居るべき場所"に座標は修正される。ここでWを呼び出さなかったり、Wに送られてきた修正座標の代わりにk, qをつっこむとなんか上手く動かない。なのでスイッチを押さないといけない場所へいけない。

おわり

f:id:ottati:20141231225024g:plain

スイッチを押さないといけない場所へ壁を抜けて行けたら教えて下さい。