2019年12月23日

ドラクエ4で「にげる×8」をすれば会心の一撃がでるし、Win8でリモデ許可を100回繰り返せば…?

先日、Twitter上で、ちょっと話題になっていたWindowsのバグの話がありました。


普段エンジニアをやっていて思うのは、このバグって、発生させる方がむしろ難易度が高いんじゃないか?と思うところですね。
ON/OFFの切替って、普通に考えれば、ONとOFFを切り替えるだけなので、バグが発生するならば1発目で発生するとか、2発目で発生するとか、そんなに複雑にはなりえない気がします。

100回以上繰り返さないと発生しないバグとなると、ブラックボックステストで検出するのは、極めて難しいから、このバグが製品出荷まで残ってしまうのは仕方がないかもしれませんが、そもそもどうしてこんなバグが作りこまれたのかには、興味が湧いてきます。

そこで連想したのは、ファミコン版「ドラゴンクエスト4」(初期出荷分)のバグ技であるところの、「ボス戦で8回にげるコマンドを実行すると、その後は会心の一撃が出続ける」というもの。

小学生の頃は、これでよくデスピサロを倒しました。

その当時は小学生だったのであまり理解していませんでしたが、その後、プログラミングを学ぶにつれ、何でこんなバグが作りこまれたのか?を不思議に思っていました。

その後、20年くらい経ってから、ある企業のプログラミングの勉強会に出席させてもらった時、詳しい方に教えてもらいました。

  • ドラクエ4では、戦闘中の救済策として、同一戦闘内で4回「にげる」コマンドを入力すれば、必ず先頭から逃げられるようになっている(実は、「にげる」回数が増えると、「にげる」成功確率が徐々に上昇する制御もあったりする)。
  • これを実現するため「にげる」回数をカウントする処理が存在する。このカウント変数は2ビットで管理されている。
  • ただし、ボス戦からは逃げられない。しかしカウントアップは行われる。このカウントアップにバグがあり、2ビットの範囲を超えてメモリの書き換えが行われる。
  • 「にげる」回数のすぐ隣には、「時の砂動作フラグ」がある。
  • その隣には、「パルプンテ」の「ちからがみなぎった」フラグがある。これが立っていると、常時、会心の一撃が発動する。
(フラグについてはこちらのサイトに詳しいことが書いてありました)
こんな感じで、様々な事情から、想像もつかないようなバグが発生するというのは、よくあること。

最初に述べた、Windows 8/8.1 の「リモート デスクトップ接続の許可する/許可しないの設定変更を繰り返し100回以上実施すると、リモート デスクトップ接続ができない事象が発生する」というのも、何かしら背景事情がありそうです。

上記のページには、「変更回数が内部の制限に達するため発生」というようなことが書かれていますので、レジストリのリストアのための制御であるとか、トランザクション処理のための制御であるとか、何かしらの仕掛けが起因していそうな気がします。


posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | PC