みが@乱数調整

動画で紹介するには難しそうなことを解説します

SVの裏IDを特定する方法 & 過去作でニックネーム変更済みの個体をリネームしてみる

こちらはPokémon Past Generation Advent Calendar 2023の51日目の記事となります。

第八世代以降、言語が一致していて尚且つNNを変更したことの無いポケモンならトレーナーIDが異なっていてもNN変更を行えるようになっています。
しかし、NN変更済みの個体のNNを変更したいとは思いませんか?
というわけで過去作のIDをSVと同じにし、過去作側でニックネームを変更してからSVに送ってもニックネームを変更できることを確かめてみましょう。(手段と目的が逆転している気がする)
 
では、実際にNNを変更できるための条件はどうなっているのでしょうか?第六世代や第七世代と同じと仮定した場合、ポケモンとトレーナーの以下の要素が一致する必要があります。  

  • 親名

  • 言語

  • ID(表ID・裏ID)

  • 親の性別

  このうち、ID以外は簡単に同じにできますね。しかし、裏IDを観測するのは難しい上に第六世代以前と第七世代以降ではIDの仕様が変更されています。

第七世代以降のIDは内部的には第六世代以前同様、表IDと裏IDの合計32bitで構成されています。そして表示上のIDはこのような式で計算されます。

$G7TID=(TID+SID\times65536) \mod 1000000$

例えば表IDが12345、裏IDが54321の時は12345+54321×65536が3,559,993,401なので993401になります。(某極悪違法ツールのデフォルトID)
内部的に保持されている出身ソフトと照らし合わせ、どちらの方式で表示するのか決めているわけです。

ところがLEGENDSアルセウスにはSV出身ポケモンのIDを旧方式で表示、つまり元の表IDを表示してしまうという仕様が存在します。(どう考えてもプログラムのミス)

表IDとG7TIDが分かっているなら裏IDを求められそうですね。
数学的に頑張って解いてみましょう。(総当たりでいいだろとか言ってはいけない

$(SID\times65536+TID)\mod1000000=G7TID$
これを変換すると
$SID\times65536=G7TID-TID+n\times1000000$
となる。この両辺を65536で割ると
$SID=\frac{G7TID-TID}{65536}+n\times(15+\frac{16960}{65536})$
と変形できる。
($1000000=65536\times15+16960$)
 SIDの数値は必ず整数なので、$\frac{G7TID-TID} {65536}+\frac{n\times16960}{65536}$が整数にならなければいけない。
つまり$((G7TID-TID)\mod65536)+n\times16960$が65536の倍数になればいい。
つまり更に式変形して表すと
$65536x-16960y=(G7TID-TID)\mod65536$となる。
$G7TID-TID=SID×2^{16}\mod(2^{6}×5^{6})$なので
$G7TID-TID$は必ず64の倍数になる。 65536と16960の最大公約数も64なので両辺を64で割ることができ、それぞれ1024と265になる。 $1024x-265y=\frac{G7TID - TID}{64}$の特殊解を求めていく。
まずは拡張ユークリッドの互除法を用いて$1024x+265y=1$を解く。
$1024-265\times3=229$
$265-229\times1=36$
$229-36\times6=13$
$36-13\times2=10$
$13-10\times1=3$
$10-3\times3=1$

$1=10-3\times3$
$1=10-(13-10\times1)\times3$
$1=10\times4-13\times3$
$1=(36-13\times2)\times4-13\times3$
$1=36\times4-13\times11$
$1=36\times4-(229-36\times6)\times11$
$1=36\times70-229\times11$
$1=(265-229\times1)\times70-229\times11$
$1=265\times70-229\times81$
$1=265\times70-(1024-265\times3)\times81$
$1=265\times313-1024\times81$

$1024×(-81)+265×313=1$と求まるので
$1024×(-81)-265×(-313)=1$である。
-81と-313を$\frac{G7TID - TID}{64}$倍してそれぞれ265と1024(互いに素)で割れば一般解が求まるので
$SID\times65536=G7TID-TID+n\times1000000$ のnにyを代入すればよい。

例として筆者のSV上のIDは151020、LA上のIDは9452なので $\frac{G7TID-TID}{64}=\frac{151020-9452}{64}= 164$
$-81×164=-13284,-313×164=51332$
$-13284\equiv231(\mod -265)$
$-51332\equiv892(\mod1024)$
$x=265m+231,y=1024m+892$
mが0の時のy=892を代入すると
$SID×65536=892×1000000+151020-9452$ $SID×65536=89214568$
$SID=13613$となる。
同様にmが1から3の時29238,44863,60488である。(4以上の時はSIDが65536を超えてしまうため除外)
$1024000000÷65536=15625$なので各IDの差も15625になる。

実際にBWにてこのIDの組み合わせを調整し、その個体をSVに連れてくると無事ニックネームを変更できた。

元のニックネームの情報をも保持したままキーボードの画面へと遷移するため、第七世代以前に使えた記号とSwitchでしか入力できない記号を両立できる。(それ以上のメリットはない)
第六世代と同様、アットマークを記憶して変更しようとしても弾かれてしまうのが残念である。

最後に上記の方法で裏IDを求める計算器を作ったので皆さんも真似してみてください。
今後調べるべき点

  • 言語が一致している必要があるか(BDSPでは必要ないので)

  • 全角七文字以上のポケモンを編集しようとするとどうなるか(三世代でID一転狙いする必要があるので面倒)

追記:てあさんがこの記事の手法を用いて混合NN個体を作ることに成功しました。是非ご覧ください。

teara.hateblo.jp

SVでのIDを入力
LAでのIDを入力

SID候補: