Seaside Laboratory

Posts

KFX 逆汗道中記

KFX を逆アセンブルして解析したときの情報を元に仮説を述べてみたいと思う。アセンブラや Windows の理解不足による間違いがあるかもしれないので注意すべし。

voice.lst の登録領域は静的確保

voice.lst の登録数を増やすことができれば表現の幅が広がり、KFX が安定して動作するようになるので改造にチャレンジしてみたが、登録数を拡張することはできなかった。

逆アセしたコードはすさまじい量なので全部のコードを目で追ったわけではないが、怪しいと思われるコードを追ってみたり、確保すべきヒープ領域数で絞り込んでみたりしたが、それらしきコードは見つからなかった。このことから領域は動的 (malloc or new) ではなく静的 (配列) に確保されている可能性が高い。

バグの再現性

voice.lst で範囲外の領域 (マイナス表記など) を使った際に起こる不具合はなぜ再現性があるのだろうか。例えば、マイナス指定をしたときにスーパーコンボ用の影が出なくなることがあるが、これは影を制御しているシステム領域が上書きされ、破壊されてしまったのが原因だと思われる。

マイナス指定によってシステム領域を破壊。

確実に SYSTEM 領域を破壊するには VOICE 領域が SYSTEM 領域に隣接してなければならないが、もしプログラムが動的に VOICE 領域を確保していた場合、この理論は成り立たたなくなる。領域の動的確保は OS が見つけた空き領域を使うことになっているので、VOICE 領域が毎回同じ位置に来るとは限らない。

前回ロードしたキャラのリソースが使用できる

時々 voice.lst の記述ミスが原因で、前回ロードしたキャラの音声が再生されてしまうことがある。これは、前回のキャラが使用した VOICE 領域を参照したことが原因だと予想がつく。もし、VOICE 領域が動的に確保された場合、前回のキャラが使った領域を参照できる可能性は低い。