Seaside Laboratory

Posts

KFX 逆汗道中記 (3)

面白いコードが見つかったので、メモも兼ねて書きとめておくことにする。

ガードゲージは MAX になると点滅しながら減少していくが、この際に使われる通常のゲージと点滅用ゲージのスプライトが上下に隣接しているのには理由があった。

以下のコードは画像を点滅させるために使われる計算式の一部。

00411673 81e101000080       and     ecx,80000001
0041167b 49                 dec     ecx
0041167c 83c9fe             or      ecx,-02
0041167f 41                 inc     ecx

ecx に入る値は 8 ビットの範囲だったので、それより上位のビットを無視した状態で計算を行ってみる。

// 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 座標に足せば、ゲージ量の変化に応じて表示する画像を上下交互に切り替えることができる。