異やけき木

異やけき木

気が向いたら。たぶん遊んでるゲームに関係することだけ。

IDとSV

 IDはID、SVはSVとして別々に認識してる人が多いので、SVはIDから計算できるよ、ってことを書きます。すでに仕組みを知っている人には大したことはないです。

 

 IDは色違い判定に使われています。TIDを前回の記事で説明に使った0xC9E184C0、PIDを0x00004E86として説明します。

 

計算が面倒なら関数電卓に10進数と16進数の切り替えやXORがあるので、それでも求まります。その際はわざわざ2進数に直す必要もないです。

C9E184C0(16進数)

=11001001111000011000010011000000(2進数)

内部的なTIDがこのように記録されているとして、

1100100111100001 | 1000010011000000

と半分に分けます。

さらに、上位と下位の16bitでXOR(排他的論理和)をとります。XORとは、

0+0=0

0+1=1

1+0=1

1+1=0

と、双方が一致するなら0、異なるなら1となる計算です。上位と下位の同じ位同士でそれぞれこの計算を行うと、

1100100111100001⊕1000010011000000

=0100110100100001 ...①

が求まります。(⊕はXORの演算子です。)

同様にして、PIDも計算します。

00004E86(16進数)

=00000000000000000100111010000110(2進数)

0000000000000000⊕0100111010000110

=0100111010000110 ...②

さらに、TIDとPIDから求めた値でXORをとります。

①⊕②

=0000001110100111(2進数)

=935(10進数)

計算結果の16bitの数が、第5世代までは8未満(⇒上位13bitが0)、第6世代以降では16未満(⇒上位12bitが0)になると、そのポケモンは色違いであるとされます。今回は935なのでどちらであっても色違いにはなりません。

 

 

 これらの計算を色違い判定の都度計算し直すのは面倒です。そのため、わかりやすく表現するのにSVと呼ばれる値が利用されます。

ビット毎のXORが0になることは、その桁の値が一致しているということのため、TID、PIDから得られる値の上位12(あるいは13)bitが一致すれば色違いになる、と言い換えられます。そこで、IDから計算できる16bitの値からそれらを取り出し、10進数に直したものがSVと呼ばれるものになります。

 今回のTIDから求まった①でいえば

0100110100100001

⇒010011010010

=1234(10進数)

となり、SVは1234です。(12bitを取り出したので、第6世代以降の場合。)

 

 SVもIDのように、トレーナーのものをTSV、ポケモンのものをPSVと言うことが多いです。TSVと一致するPSVを持ったポケモンが出現や孵化することで、色違いが入手できます。

 

なお、剣盾で★ではなく◇のエフェクトが出るには、先ほどのTID⊕PIDが完全に0となる必要があります。この場合SVには使わなかった下位4(または3)bitを16進数にしたものがRVと呼ばれ、SVと共にRVも一致することで◇であるという扱い方をするようです。

 

 計算自体は大したことはないですが、わかりやすい形にするのは大事ですね。