Seaside Laboratory

Post

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 座標に足せば、ゲージの値の変化と共に表示する画像を上下交互にチェンジすることができる、というわけです。