ゲームのバグ技をプログラムの観点で解説してみる – 1
投稿が遅れておりますつーじーです。今回はいつもと趣向を変えてみます。
プログラム技術の結晶である”ゲーム”には特有の『バグ技』があったりします。「開発が意図的に仕込んだ」などと揶揄されたり、実際に開発が仕込んだものだった技も実在するのですが、大半は「プログラムが想定外の動きをした結果起きてしまったバグ」といった『考慮漏れ』であることがほとんどです。
先日、とあるバグ技が「プログラムの考慮漏れであった」ことがニュース化されており、内容が興味深いものでしたので、そちらをなるべくプログラム主体で解説していこうと思います。
『DQ4』で8回逃げると必ず『かいしんのいちげき』になるバグ技
引用元:『DQ4』で8回逃げると必ず“会心の一撃”になる理由が明らかに。当時のプログラマーがYoutubeで明かす
https://www.famitsu.com/news/202105/18220895.html
バグ技の内容は見出しの通り、
「ファミコン版のドラゴンクエスト4で8回「にげる」を行うと、必ず『かいしんのいちげき』が発生する」
というものです。ゲームの紹介については割愛させていただきます。
なぜこのようなことが起こるのか、
原因は『パルプンテ』でした。
ドラクエシリーズを知らない人に簡潔に説明しますと、パルプンテは「何が起こるかわからない呪文」であり、その「何が起こるかわからない」のパターンの一つに
『かいしんのいちげきが発生する』
というものがあります。実はこのイベントが発生していたのです。
なぜ「にげる8回」と「パルプンテのかいしんのいちげきイベント」が関係するのか?
ここがプログラムの観点が必要になるポイントです。
プログラムは、突き詰めれば「0と1の2進数で成り立つフラグのTRUE/FALSEを判定するもの」ですが、パルプンテのパターン決定も、内部のとある場所にあるフラグが「1」になっていたら「かいしんのいちげきを発動する」という仕組みになっております。ざっくり書くと
... 0 0 0 0 ...
といった0と1の羅列の内、一番左の0が1になっていたらかいしんのいちげきが発動します。
この羅列の中の「右側の3つの『0』」が重要で、
実は「右の3つの『0』」は「にげるの回数をカウントするカウンター」だったのです。
察しの良い人はもうお気づきになられたと思いますが、にげるの回数も2進数でカウントされております。そのカウントが8回まで続くとどうなるか。
↓パルプンテのかいしんのいちげきフラグ
にげる0回 0 0 0 0
にげる1回 0 0 0 1
にげる2回 0 0 1 0
にげる3回 0 0 1 1
にげる4回 0 1 0 0
にげる5回 0 1 0 1
にげる6回 0 1 1 0
にげる7回 0 1 1 1
にげる8回 1 0 0 0
このように、パルプンテのかいしんのいちげきフラグが1になってしまうのです。
これが「8回にげるを行うとかいしんのいちげきが発生する」の正体でした。
しかしここで疑問が生まれます。「開発途中にこのパターンは全く想定されなかったのか?」
実はドラクエ4には『にげるは4回目までには必ず成功する』という仕様があるのです。
そのため回数カウンターは3桁までで十分で、上記のような桁あふれは起きない想定でした。
ではなぜ8回も逃げることができるのか? それは、
『ボス戦では何度逃げても逃げられない』仕様があるからです。RPGあるあるです。
ここが考慮漏れのポイントでした。開発者も「4回以上逃げれることは想定していなかった」と語っておりますが、「ボス戦で何度も無駄ににげるコマンドを行う」というパターンは想定できていなかったようです。
結論をまとめると以下の通りとなります。
にげるを8回行うと桁あふれが発生し、桁あふれの発生先がかいしんのいちげき発生フラグだったため、8回逃げたらかいしんのいちげきが出ていた。 にげるは4回目までには必ず成功するシステムだったが、ボス戦で何度も無駄に逃げる想定はされていなかった。
仕組みがわかってしまえば、完全にプログラムの構造上の欠陥で説明できるものでした。
とはいえ、当時まだ開発言語はアセンブラが主流で、容量も512KBしかなかったため、データの管理も最小限にしなければならなかったという事情もあります。容量がふんだんに使える今の時代に感謝しなければなりません。
こうしたバグ技はある意味ゲーマーのロマンではあるのですが、品質管理の人間としてはバグは見逃せないという想いもあるので、何とも言えない板挟みな心境です。
とはいえ、バグの構造が理解できるということは、結果的にテストの際の想定パターンづくりにも役立つため、今後もこう言った話にはアンテナを伸ばしていきたいと思います。
本日はこれにて