ドラクエ4で学ぶコンピュータサイエンス

メルマガバックナンバー 第14回

こんにちは、プログラミング書籍の館の江畑です。

前回から少し間が空いてしまいました。
MacBookの電源が入らなくなり、しばらく修理に出してまして…
思っきりテンション下がってたのが理由です。

はるか昔にAppleのサポートは切れていたので、スマホドック24名駅店さんに持ち込みました。
その結果
 「調査中に動くようになったので、修理代はゼロで良いです」
との事でした。

結局原因は分からずでしたが、とにかく直って良かったです。
スマホドック24さんの良心的な対応に感謝です。

さて今回のテーマはドラクエ4とコンピュータサイエンスです。

ドラクエ4で学ぶコンピュータサイエンス

コイン増殖の裏技?

今回のテーマはゲームのバグです。
バグの原因をコンピュータサイエンス的な視点で見てみましょう。

よくプログラマーはバグを「裏技」と呼んで、修正せず発売しようとします。
今回のバグも、僕は裏技だと思ってました。

さてそのバグとは、有名な?ドラクエ4のコイン増殖です。

ドラクエ4ではカジノがあり、初めに「コイン」を買ってポーカーやスロットで賭けれます。
そしてコインが増えると、交換所で景品(はぐメタの盾とか)をゲットできます。

で、そのコインは1枚20ゴールドするのですが…

なぜか枚数を838861枚にすると、わずか4ゴールドで買える裏技があります。
当時の子供達(僕含む)はこれを知ってヒャッハーしました。

※リメイク版では修正済みです

かんたんな解説

さてこの裏技、実はバグです。

1枚20ゴールドのコインを838861枚買うと、必要なゴールドは…
 20×838861 = 1677万7220ゴールド
になります。

ところがドラクエ4では、ゴールドの最大値は1677万7215になってます。

つまり、上限を超えた金額を表示しようとしてる訳です。

ゴールド最大値:1677万7215
必要なゴールド:1677万7220 ←5多い!

その結果、数字がループして一旦ゼロへ戻ってしまい、すごく安い金額になったのです。

この時、支払う金額は以下のような関係になります。
 1多い:0ゴールド ←無料
 2多い:1ゴールド
 3多い:2ゴールド
 4多い:3ゴールド
 5多い:4ゴールド ←今回はこれ
 6多い:5ゴールド
 (以下略)

本来なら、1だけ多い1677万7216ゴールドにして、無料でゲットしたい所ですが…
コインの金額(20ゴールド)で割り切れないため、一番安いのは4ゴールドになってます。

コンピューター的な解説

多分ここからが本題です。
この話をもっとコンピューターサイエンス的に見てみましょう。

前述のように、ドラクエ4のゴールド最大値は1677万7215でした。
これは2進数で表すと次のようになります。
111111111111111111111111

ゲシュタルト崩壊しそうですね…コレ1が24個ならんでます。
つまり24ケタの2進数です。これを24ビットと言います。

言い換えると、ドラクエ4のゴールドは24ビットの整数って事です。
現在ほとんどの環境(CやJava)で整数型(int)は32ビットですから、かなり小さいですね。

さて、この1677万7215に1を足すとこうなります。
==ゴールドの最大値を超える 1677万7216)
1000000000000000000000000

なんだかキリの良い数字になりました。足す前と比べてみましょう
111111111111111111111111 前
1000000000000000000000000 後

1ケタ増えて25ケタ、つまり25ビットになっています。

しかし困ったことに、ゴールドの変数は24ビットしか認識しません…
よって増えた25ケタ目の1は無視されます。

その結果ゴールドは↓のようになり、0に戻ってしまいました。
000000000000000000000000

これがコイン増殖バグの仕組みです。

さて、最初に戻ります。
1枚20ゴールドのコインを838861枚買うと、必要なゴールドは
1677万7220でした。

1677万7220を2進数にするとこうなります。
1000000000000000000000100

さっきと同じように25ケタ目は無視されるので、ゲーム内では
000000000000000000000100
と認識されます。3ケタ目だけが1ですね。

これは10進数で4になるので、コインが4ゴールドで買えてしまう訳です。

本当は怖いコイン増殖

中の仕組みはともかく、当時の僕はこのバグを裏技だと歓喜し使いまくりました。
でもですね。このバグ、一歩間違うと危険なんですよ。

なぜなら25ケタ目は別の変数の領域だからです。

プログラムはゴールド以外にも色んな値を記憶してます。
敵味方のステータス、進行フラグ、町やダンジョンの場所などなど
ところがこのバグを使うと、ゴールドの隣に記憶してあった値を意図せず変更してしまうのです。

・もしも隣の変数が全滅フラグで、1ならゲームオーバーになるプログラムだったら…
・現段階で1にすると進行不能になるフラグだったら…
・不用意に変更したせいで影響が連鎖的に広がり、ゲームがフリーズしたら…

ええ、怖いですね。ちびりますね。
こういうのをメモリ破壊バグと言います。

今回は特に影響なくて済みましたが、これで回収騒ぎになったゲームもあります。

8逃げ会心

ドラクエ4には、もう一つ有名な裏技があります。それは

 8回逃げた後に攻撃すると必ず会心の一撃が出る

というトンデモナイ技です。よく「8逃げ会心」と言います。
※初期ロットのみ可能

実はこれもメモリ破壊バグです。

ドラクエ4では、逃げた回数を2進数2ケタ(2ビット)の変数に入れてます。
ところが、8という数字は2進数では
1000
のように「4ケタ」になってしまいます。

あふれ出た4ケタ目の1は、やはり別の変数を書き換えるのですが…

これが偶然にも、パルプンテ(何が起こるか分からない魔法)の会心発生フラグだった為、会心の一撃がバシバシ出るようになったのです。
(なお3ケタ目は時の砂に関するフラグらしい)

このバグもメモリを破壊してますが、たまたまプレイヤーが喜ぶ現象だったので「裏技」として広まったケースです。

【今日の格言】
バグと裏技、紙一重

 

さて、今回はドラクエ4のバグをコンピュータサイエンス的に見てみました。
無味乾燥で退屈な2進数も、こうやってゲームを例にすると少し鮮やかに見えて来ませんか?

色んなゲームバグの仕組みを知ると、ゲーム画面とリンクしてコンピューターの動きが分かります。
こんなコンピュータサイエンスの学習も面白いと思います。

僕も講義をする際はいつも楽しげな具体例を話すようにしてますぜヒャッハー。
メルマガでも色々なゲームバグを紹介したいと考えてます。コンゴトモヨロシク。

Twitterハイライト

今月はこんなこと呟きました。

1989年の美少年ゲームキャラコンテスト

お姉さま方の妄想が炸裂中

これがザクに見えたら貴方は疲れてます

プログラミングを学ぶ気が1ビットもない少女

僕の自慢できる白歴史ドヤァァァ

ひどい話クイズの答え

さて、前回出題した「ひどい話クイズ」の答えです。
こんな問題でした。

次のうち、僕が実際にやった事の「ない」ものはどれでしょうか?
(つまり3つは本当です)
A:同僚が椅子を投げて喧嘩を始めたけど、面倒なので止めもせず昼飯へ行った
B:バグを解明しても報告せず、究明してるふりして2ch見てた
C:デスマーチがダルくて、勤務中に酒を飲んでいた
D:前向きなメールに縦読みで本音を仕込んでた(例:たぶんむり)

正解はでした。
デスマでSAN値削れてステ異常な時に酒なんか飲んだらリバース確定ですからね…

今回は13人の方に応募いただき、正解者は6名でしたパチパチ。
うち3名の方には、Amazonギフト券をメールで送信しました。
これで家でも買うといい。

ちなみに解答の内訳は A:2 B:2 C:6 D:3 でした。
み、見抜かれてる。。。だと

クイズあのゲームの文字??

では今回のクイズです。超シンプルに行きます。

—————————

次の○に入る文字は何でしょうか?

か → こ → く → ぜ → ○ → け

ヒント
・ある有名ゲームに関する問題です
・プログラミングを知らなくても解けます。

—————————

応募は本メールに返信すればOKです。

正解した方の中から抽選で3名様に、Amazonギフト券コード(500円)を送信致します。
締切は次号の配信まで。ご応募お待ちしてます!
※募集は終了しました

今回はここまでです。読んでいただきありがとうございました。

プログラミング書籍の館 江畑


Kuniaki Ebata 登録者

大学中退(文系)の専門卒 日本で唯一のプログラミング書籍評論家 プログラマーで現役のスキー国体選手です 頭と体を動かすのが大好きなフレンズなんだね 専門学校で先生もやってます プログラミングは21歳から 貴族じゃない独身 持病:重度うつ病(薬とサポートのおかげで何とか生きてます) 教え子をゲーム業界へどんどん送り込み、世界を面白くする野望を実現中 プログラミングが上達するメルマガやってます ここを見たゲーム業界の卒業生へ 新作が出たら、連絡するか現物を送ってくれると嬉しいです ただし18禁・CERO-Dの場合は、厳重に梱包の上、品名をパソコン部品にて送る事(だいじ) このページが参考になった方へ ぜひSNSやブログでシェアして欲しいです お願いします(少し上にボタンあります) 最近Google先生が中身の無い「いかがでしたか?」サイトを優遇するので困っています助けて下さい(>_<) シェアしてくださった方には 小冊子 プログラミング書籍が10倍わかる読み方(pdf) を差し上げます こちらからご報告頂くか、こっそりDMを送って下さい