XDトゲピー乱数
(3日目は…?)(書きかけです…)
https://scrapbox.io/files/6754a1ac964fa3a6f6ccf9ca.png
(サムネ用)(これはエミュで乱数を書き換えるズルをして出しました)
なにがあったの?
長らくXD乱数の難関とされてきたXDトゲピーですが、ついに不定消費が解析でき、さらに現実的な乱数調整手法も確立できました!!
仕組みもやり方もCoの不定消費調整とほとんど同じです。
XD瞬き調整の汎用ツールはまだ作れていないのでopenblinkを使ってください。
ブレイクスルーの要因は?
不定消費の解析は以前に一度チャレンジしていて、そのときに不定消費処理の解析は自体はできそうだという手ごたえはありました。
しかし、XD特有のロード時消費と不定消費が実行される順番・タイミングが不安定で、エミュレータでも再現できないっぽいことがわかり、そのときは諦めていました。
今年になって、Dolphinのログ出力機能をたまたま発見したことにより、Dolphinを使った処理の調査が格段に楽になりました。
ログ出力機能を見つけたので、ウキウキして何かしらの処理を調べようとしましたが、既にXDファイヤーすらも解析が完了してしまっていたため、トゲピーの不定消費を改めて調査することにしました。
以前調べたときともう1つ状況が変わっていたこととして、XDでも瞬きを使ったseed特定の手法が確立していました。
初回ロードでは安定していなくても、メニュー閉じからであれば安定するのでは? という可能性に賭けて調べてみたところ、見事、メニュー閉じからの場合は毎回同じタイミングでロード消費が入ることがわかりました。
そこから改めて不定消費の処理を調べ直し、エミュレータでフレーム送りしたときにseedが計算通りに更新されることが確認できたのが11月の半ばでした
30256Fから不定消費が開始してて、メニュー閉じも乗り越えて、少なくとも500Fくらいの間は計算通りに動いてくれている
https://pbs.twimg.com/media/Gcgs1XcbcAA-Ih8?format=jpg&name=large#.jpg
そこから1か月何してたの???
ツールを作ってました。
WindowsFormsで作って配布するのが何か気分的に面倒くささが勝ってしまったので、ブラウザで動くものを作ろうということにしました。
しかしここで重大な問題が発生。不定消費は内部的に32bit浮動小数点数を使っていますが、ブラウザで動かせるプログラミング言語JavaScriptは、64bit浮動小数点数しか使えません。32bitと64bitの差による誤差が影響しないとも限らないため、できれば32bitで計算できるのが望ましいです。
実は最近ではブラウザでプログラムを動すのに、JavaScriptのほかにもWASMというものを使うという選択肢もあります。 簡単に言うと、JavaScript以外の言語で書かれたコードでも、この規格に沿ったファイルに変換すれば、ブラウザで実行できるようになります。
C#も一応WASMへの対応は進んでいるんですが、出力されるファイルのサイズが結構大きめで、うっかりスマホから開いてしまったときに通信量がゴリっと増えてしまって悲しくなるのが嫌だなぁ…と思っていました。
ちょうどその頃、Moonbit という言語が話題になっていました。Rustに倣ったモダンな書き味と言語機能を持ち、しかもWASMにコンパイルして使うことを想定して作られているため、WASMにしたときのファイルサイズが非常に小さいという特徴を持っています。 当然、32bit浮動小数点数も扱えます…!
そこからC#で実装してエミュと計算が一致することを確認したコードをMoonbitに移植したり、WASMをJSから呼び出して使う方法を調べながら試したり、ドラクエ3をしたり、AoMを読み進めたりしていたら1か月過ぎていました。 ドラクエ3はまだクリアできてません。今はゾーマの城を目指してレベルを上げています。
AoMはヨロシンカンセンが出てきたあたりまで読みました。
具体的なやり方
Coライコウとかと同じなのでCoライコウとかを参考にしてください。
ツールはまだ最低限の機能しか備えておらず、これから拡充していく予定なので、スクショを載せての解説はまだしません
xdcheckでトゲピーを検索するとダミーPIDの2消費を考慮しないseedが表示されるため、xdcheckで検索したseedをトゲピーツールに使う場合は2つ前のseedを入力するようにしてください。
たとえば臆病てんのめぐみ理想個体はxdcheckでは19F0033Aになっていますが、その2消費分前の5E967EC0を入力してください
手間なのは重々承知なので、追々なんとかします
不定消費が動き始めるのは手持ちを閉じたあとです。
https://scrapbox.io/files/67549d78f557331ea3681f57.png
この画面の間は消費が発生しない
https://scrapbox.io/files/67549dd384ef11bf00295416.png
この画面では不定消費が発生している
個体決定のタイミングは「ダーク・トゲピーを 預かった!」のメッセージが消えたあとです。
https://scrapbox.io/files/67549cbc147cb143cc27dd6d.png
ここで待機。
以下、処理の詳細
不定消費を発生させているのは奥のパイプが噴き出している煙
https://scrapbox.io/files/67549e4cab3cbbf7cf38bc37.png
不定消費処理の仕組みはCoの不定消費とほぼ同じで、パラメータや追加の消費数でいうとパイラの洞窟の謎マシンが最も近い
Coパイラの処理とは、メインカウンタの並び方が左右逆になっているだけ(かつ、パイラは3台分並んでいるが、XDトゲピーは1台分だけ)
ただし、CoとXDとの大きな違いとして、XDではCoにはなかったマップロード時の消費が発生する
「持ち物消費」とか呼ばれているやつ
町外れのスタンド屋内では10消費
ゲーム開始時にマップがロードされるときは「持ち物消費」*2 +2の消費が入るが、これは不定消費の初期化と前後して発生し、しかも読込処理依存であるため、エミュレータでも再現性が取れなかった
そのため、前回解析したときは「調整は現実的ではない」として諦めた
しかし、手持ち画面を閉じる際に発生するマップロード消費はタイミングが安定している
具体的には、不定消費が開始して2フレーム目に2消費、5フレーム目に8消費入る
エミュレータで条件を変えつつ繰り返して検証したが、これ以外のパターンは確認されなかった
成功者の方々
https://pbs.twimg.com/media/GdLEODtXUAAOLxm?format=jpg&name=medium#.jpg
C#のライブラリだけ公開してたときに自前でプログラムを組んで成功されていました。さすがです。
〆&いつものやつ
なんか上手くいかないんだけどツールおかしいんじゃないの? と思ったらリプで教えてください。
実は実機での確認はしてないので、誰か人柱になってください試用してくださると助かります。
Moonbitは今のところ好き寄りです。興味がある人はちょっとでいいんで書いてみてください。
8日目の担当はラルクさんです。3種の神器とはいったい…?