SeedHack
C++で実行できるファイルはつくっていたのだが、MacやLinuxで検索しようとすると別途ビルドが必要でめんどくさかったです。
また、調べたシードからアセンブラをつくり、機械語に翻訳するのも手間でした。じゃあもう全部ブラウザでやればいいんじゃない?っていうのがすべての発端でした。
詰まった点
ブラウザでやるからには基本的にはPHPかJavascriptで実装することになります。全シード情報は43億通りなので、予め全部計算して4GB程度のデータベースを作っておけば、そこから検索してすぐに値をリターンすることはできるのですが(これが動作としては一番速い)、それだと計算するのが面倒なのと43億もレコードがあるDBが果たしてどのくらい負荷がかかるのかわからなかったのでやめました。
JSは32bit以上のビットシフトに未対応
Javascriptでビットシフト演算をするためにはmSeed >>> 30
といったように書く必要があります。なお、疑似乱数生成器はすべての値がunsigned
なので負数を考慮に入れないために符号を無視する>>>
を使わねばなりません。
ここが最初に詰まったところで>>
と書いて値が一致せずに苦しみました。
更に、JavascriptはNumber型は53bitまで扱えるのに対してビット演算は32bitまでしか対応していないらしく、32bitを超える巨大な数に対しては>>>
が全く見当違いの値を返します。
ビットシフトは結局2の何乗で割るかという計算なのでmSeed / Math.pow(2, 30)
のように対応したのですが、もっと良い等価な式があるはずなので書き直したいですね。
C言語ライクな乗算
Math.imul(a, b)
という関数を使えばC言語のように高速に演算が行なえます。これ、知らなかったので結構役立ちました。
ただし、32bitでオーバーフローするのでそこだけは注意。
WebApp
仕様について
- 0xFFFF(65535)までのシード値から好みのWAVEを検索
- 検索と同時にARM機械語での出力にも対応
- フラットデザイン&ダークモードでかっちょいいUI
- 0xFFFFまで検索が終わるか、合致するシードが20件見つかると検索を終了する
アセンブラから機械語への変換はARM to HEX ConverterのAPIを利用させてもらいました。既存の問題点としてはシード検索を非同期処理にしても何故かループが終わるまで全くDOMが更新されないことです。
本当は検索中に「どこまで検索したか」「どのくらいみつかっているか」がリアルタイムに見れればよかったのですが、これは後々の宿題ということにします。
0xFFFFより大きい値が検索できない問題ですが、これは単に0xFFFF以上の値を代入しようとするとどうしても命令が二つ必要になるためです。現在のコーディングではシード一つに対して機械語が一対一対応するようなプログラムになっているため、表示することができないのです。
が、やろうと思えばできないことはないのでそのうちアップデート予定です。
ちなみにJavascriptの処理力的に0xFFFFFF(約1677万)件くらいの検索に15秒ほどかかるので、このアタリで検索を打ち切るようにするつもりです。どんなに珍しい潮位・イベントの組み合わせでもここまで調べれば一件くらいは見つかるはず。
ちなみに同じ夜イベントは連続して発生しないので、存在しないWAVEの組み合わせで検索すると常に0件のヒットになります。バグりはしないけど、意味がないのでやらないこと。
今後のアップデート予定
- 0xFFFFFFまでの検索に対応
- リアルタイム描画システム
- キンシャケ探しでのアタリ位置表示に対応
これくらいできればまあまあウェブアプリとしては良いのではないでしょうか。
てか、特に出力された値が正しいかチェックしてないのでバグってたら報告ください。
使い方
オンラインで使えてしまう可能性があるので5.2.0 – 5.3.0でのアドレスは載せることができませんが、3.1.0であれば以下のコードで実行することが可能です。
// SeedHack 202020 [tkgling] @disabled 00208C74 A00080D2
ただし、プレイヤーが一人の場合は夜イベントが発生しないのでそれだけ注意してください。以下のコードは強制的にアクティブプレイヤーを二人にしてイベントを発生させるコードです。
// Event Occurs [tkgling] @enabled 005C5E24 40008052
ただし、当然ノルマが倍になるので難しくなります。まあ、検証用ということで。
自身を天才と信じて疑わないマッドサイエンティスト。二つ上の姉は大英図書館特殊工作部勤務、額の十字架の疵は彼女につけられた。
コメント
これは自分が例えばWAVE1はキンシャケ探しでWAVE2はグリルWAVE3はドスコイ大量発生
とかにするコードがわかるってことですかね?
はい。そのとおりです。
JavaScriptにもBigIntが導入されましたね
Doubleの使用を強制されないので便利ですよ
BigIntは使おうとしたのですが、使い方がよくわからなかったという!