ピンボールの裏技を紹介する前にバグを直す方法を紹介してくれよ

WindowsMe・NT・2000・XPに標準で付属しているゲーム「ピンボール」ですが、これにはいくつか裏技があります。中でも最も強力なのが、ボールをマウスで自由自在に動かすことができるようになるというもの。
 - Windows付属ピンボールのボールをマウスで動かす裏コマンド - GIGAZINE

実はピンボールにはバグがいくつかあります。

  • ゲーム中「サテライトリトリーバル」ミッションを選ぶと落ちてしまう
  • Windows2000やXPなどではフリッパーのパワーが弱くてゲームが普通に遊べない。しかしこの現象はBGMをonにすると直る。


特に一番上のは致命的。2番目も知らなかったらヤバい。
2chのスレ「3Dピンボール「Space Cadet」でイライラするスレ」で解析が進んでいて、

407 :350(規制中):2005/09/10(土) 10:36:13 id:CIZ27o9r

「サテライト リトリーバル」バグを一通り解析しました。
原因は非常に単純で、
sprintf(buf, "発射ランプを狙って %s ミッションを確定せよ!", <ミッション名文字列>)
というようなコードがあるわけですが、バッファのサイズが64バイトしかなく、ミッション名が長いとスタックを破壊します。
ミッション名の長さの許される最大値は(シフトJISで)22バイトになります。
"サテライト リトリーバル"は23バイトです。

ちなみに文字列リソースのバイナリはユニコードですが、LoadStringA()を使っているのでシフトJISに変換されています。

PINBALL.EXEでも、Windows95 Plus!についていたバージョンでは、カナ文字はすべて半角になっているので、このバグは発生しません。


上から3つまでのバグは、Win95のときには発生していなくて、
その後いろんなことがあって顕在化してきたものなので、
ソフトウェアの再利用が難しいということを説明する例として出すといいかも。
サテライトリトリーバルのバグについては、単純なリソース変更で、これまで顕在化してなかったバグが重要な問題になる例。
フリッパーが弱くなるのは、完全に独立した別のソフトウェアコンポーネント(この場合はOS)の変更によってこっちが影響を受ける例。