TSV・PSVとは何か

6世代、7世代の乱数方面の話題においてよく名前を見聞きする「TSV」「PSV」という単語についてやや突っ込んだ話をしていきます。
同時に5世代以前の話にも通じる色違いについての話に少し触れていきます。誰か既に書いてそうな内容だけど。

2進数と16進数の最低限の知識がある人向けです。

※コメントでご指摘頂いたbit表記、桁表記の誤りを修正しました。(2017/1/18)



・色違いの判定について

ポケモンの各個体には「性格値」と呼ばれる値が設定されています。
性格値は便宜上16進数8桁で用いられることが多いです。2進数で表す場合32bitです。

色違いの判定に用いる計算式は以下。
(TID)xor(SID)xor(性格値上4桁)xor(性格値下4桁)≦15(5世代以前は7)

TID、SIDはそれぞれ「表ID(TrainerID TID)」「裏ID(ShinyID SID)」のこと。
また、TIDとSIDは16進数4桁・2進数32bitで表されますが、これをさらに10進数に変換したものが馴染み深いと思います(6世代以前でトレーナーカードに表示されているもの)。

7世代ではトレーナーカードに表示されるIDが6桁に変更されましたが、これは計算式が変更されただけで今までと仕様上の違いはありません。
計算式は以下。
ID = (SID + TID * 65536) mod 1000000


・色判定式の解釈

前項で出た色違い判定式
(TID)xor(SID)xor(性格値上4桁)xor(性格値下桁)≦15
について細かく考えていきます。

計算に用いる4つの項の内、TIDとSIDはロム毎に存在する固有の数値であり定数です。
ということは、(TID)xor(SID)の部分は予め計算しておきロム依存の数値として一つにまとめることが可能です。これを仮にAとしましょう。
更に(性格値上位4bit)xor(性格値下位4bit)の部分はポケモンの個体それぞれに依存する値のため、こちらも予め計算できそうです。こちらをBとします。

つまり、色判定式を
{(TID)xor(SID)}xor{(性格値上4桁)xor(性格値下4桁)}≦15
(ロムに依存する16進数4桁の値A)xor(個体に依存する16進数4桁の値B)≦15
と変形します。

xorは排他的論理和のことで、2進数各bitを比較して一致していなければ1を、一致していれば0を返す演算。
左辺でxor演算をした最終結果が15以下であるということは即ち下位4bitまでで収まる数字であればよいということで、言い換えると
終結果の上位12bitが0であれば色違い判定を通過することになります。
よってAの上位12bitとBの上位12bitが一致していること」が色違いになる条件です。



・TSVとPSV

色違い判定で必要なのはAの上12桁とBの上12桁ですので、下4桁は必要ありません。
下4桁をカットして12bitの値としたものがTSV(TrainerShinyValue)とPSV(PokemonShinyValue)の正体です。
決して色違いの仕様が大きく変わったわけでも、新たに数値が実装されたわけでもありません。
6世代以降急速にこれらの単語の知名度が上がったのはSV孵化法というものが広まったときに、こちらの方が便利だったからでしょう。
2進数や16進数で扱うのは面倒ですので、通常は10進数(0~4095)で表します。


一応まとめておくと
TSV→(TID)xor(SID)の上位12bit
PSV→(性格値上4桁)xor(性格値下4桁)の上位12bit
色違いの個体に限り(TSV)=(PSV)

これで自力でTSV、PSVを計算できますね。
7世代乱数ではTSVを求めるためにまず色違いが出るまで孵化をし、PSVを計算する手法をとります。
乱数列の出力リストから性格値に用いられる値を探し、PSVを計算することになります。
その方法はいずれまた。

追記:書きました→自然発生色違いからTSVを求める