Posts
KFX 逆汗道中記 (3)
面白いコードが見つかったので、メモも兼ねて書きとめておくことにする。
ガードゲージは MAX になると点滅しながら減少していくが、この際に使われる通常のゲージと点滅用ゲージが上下に隣接しているのには理由があった。
以下のコードは画像を点滅させるために使われる計算式の一部。
00411673 81e101000080 and ecx,80000001 0041167b 49 dec ecx 0041167c 83c9fe or ecx,-02 0041167f 41 inc ecx
ecx に入る値は 8 ビットの範囲 (0 ~ 136) だったので、それより上位のビットは無視した状態で計算テストを行ってみる。
// ecx = 0 とした場合。 00000000 & 00000001 = 00000000 // and 00000000 - 00000001 = 11111111 // dec 11111111 | 11111110 = 11111111 // or 11111111 + 00000001 = 00000000 // inc ecx = 0
// ecx = 1 とした場合。 00000001 & 00000001 = 00000001 // and 00000001 - 00000001 = 00000000 // dec 00000000 | 11111110 = 11111110 // or 11111110 + 00000001 = 11111111 // inc ecx = -1
このコードは偶数が来ると 0 になり奇数がくると -1 を返すようになっている。
ecx に実際のゲージ値を入れた場合、ゲージは減少する時に 1 づつ変化するので 0 と -1 を交互に繰り返すことになり、この値を画像切り出し時の Y 座標に足せば、ゲージの値の変化と共に表示する画像を上下交互にチェンジすることができる、という仕組み。