プログラムの最近の記事

これはすごい裏ワザを発見しました!という何をイマサラな話ではなく。

たまにファミコンで遊んだりすると、ファミコン時代のゲームクリエイターは本当にすごいなあと思う。(もちろん今のクリエイターもすごいのですが)

なにしろファミコン版のドラクエ4のROM容量が4メガビット=512KB。iPhoneで撮影した写真1枚分より小さな容量で、あれだけのゲームと世界観がつくりだされていたことを思うと、何とも隔世の感がありますね。

ちなみに初代ドラゴンクエスト(いわゆるドラクエ1)のROM容量は512キロビット=64KB(ひゃ~)。

容量削減の工夫のひとつとして、カタカナは50音すべて搭載されていなかったそうです。

さてタイトルの話題に戻りますが、ファミコン版のドラゴンクエスト4では、逃げるを8回繰り返すと、攻撃の際、会心の一撃しか出なくなります。

いわゆるバグ技として、例の「カジノのメダルをすごい枚数買えちゃう件」と同様に広く知られていますが、その理由が「逃げた回数」用のカウンターがオーバーフローするから、というのを知ったのはわりと最近のこと。

逃げる回数は以下のようにカウントしていきます。

  • 0回逃げた状態:00000000
  • 1回逃げた状態:00000001
  • 2回逃げた状態:00000010 ※ボス戦以外での逃走成功率25%アップ
  • 3回逃げた状態:00000011 ※ボス戦以外で必ず逃げられるようになる

ファミコン版ドラクエ4の場合、通常戦闘時、「3回逃げた状態」で逃げると、必ず逃げられるようになっています(4回めの逃走は必ず成功するということ)。

したがって3桁め以降は必要ないメモリー領域になってしまうわけで、これを他のフラグ用に有効利用しようとしたわけです。

逃げた回数のカウンターとその周辺ビットは以下のようになっています。

1桁め:逃げた回数(1ビットめ)

2桁め:逃げた回数(2ビットめ)

3桁め:直前ターン状況保存フラグ(時の砂動作補助・0なら保存)

4桁め:パルプンテで「ちからがみなぎってきた」フラグ(1だと会心の一撃連発)

5桁め:敵を1匹倒すとONになるフラグ(戦闘終了時のメッセージ0:○○はいなくなった、1:○○をやっつけた)

6桁め:(Reserved)

7桁め:戦闘開始時に2種類以上のモンスターがいるとONになるフラグ(0:モンスター名表示、1:まもののむれ表示)

8桁め:パルプンテで「ふしぎなきりにつつまれた」フラグ

こんなふうになっているようです。

通常戦闘では「4回逃げた状態」は発生しませんが、逃走不可能なボス戦ではそれが起こります。逃げた回数のカウントは以下のように続きます。

  • 4回逃げた状態:00000100
  • 5回逃げた状態:00000101
  • 6回逃げた状態:00000110
  • 7回逃げた状態:00000111
  • 8回逃げた状態:00001000

逃げた回数が想定外にカウントされることで、容量がもったいないから他の用途で使っちゃえ!とした部分にまで繰り上がってきてしまいました。

そして8回逃げた状態のとき、ついに「パルプンテでちからがみなぎってきたフラグ」がONになるため、会心の一撃が連発するわけです。

ちなみにこのバグは初期出荷版のROMだけで発生し、後期出荷版のROMでは別アドレスで管理するよう修正されたそうです。

何ともおもしろいですね。

参考:『ドラゴンクエスト大辞典を作ろうぜ!!第三版 Wiki』 http://wikiwiki.jp/dqdic3rd/ (2015年4月6日閲覧)

カルノー図

| コメント(0) | トラックバック(0)

同軸ケーブルに関して調べていて、ふと特性インピーダンスについて気になり、さらに、さほど関係のない、デジタル回路のハイインピーダンス状態(出力が電気的に切り離されている状態)を思い出した。

ハイインピーダンスというと、BOSEの101HIはなかなかの名機だったなあ、などということも思い出しつつ、インピーダンスという言葉の難しさを思い知ったのでした。

デジタル回路ついでに、久しぶりにカルノー図を書きました。

00、01、11、10と、ビットがひとつずつずれるように(ハミング距離)書かないとだめですよー、なんて言われたことを懐かしく思い出しながら。

なぜそうしなければならないのか、理解するまではムズムズしていたものですが、一度00、01、10、11でカルノー図を書けばすぐ「なるほどー」と思うのでした。(とんでもない式になってしまいます)

論理設計の本を、もう一度、読み直したくなった。

ちょっとおもしろいことを思いついたので(たぶん私以外の誰もがおもしろいとは思わないくだらないこと)、超久しぶりにDirectSoundを使ったアプリケーションを作りました。アプリケーションというか、どちらかというとサービスかな?

このたびVisualStudio2008Proを自由に使わせてもらえることになったので(ありがたや)、ついでにDirectX SDKも最新版を導入して早速・・・と思いきや、出鼻をくじかれました。VisualStudio2005+DirectX8.1のころからだいぶ変わってる?

以前はCreateBufferFromFileメソッドを使っていましたが、今回はなぜかうまくいかない。仕方なくSecondaryBufferメソッドでファイルを読み込みつつ、引数としてBufferDescriptionを渡したり。とりあえずこれで目標は達成ですが、CreateBufferFromFileの使い方が気になります。

そのあたりの詳しいところは、また検証したあとにご報告できればと思います。

***

閑話休題で、私のDirectX SDK遍歴をご紹介します。

初めて使ったのがDirectX6+VisualC++。当時VisualBasic5をメインで使っていましたが、DirectXのSDKがVBに対応していなかったので、泣きそうになりながらC++をお勉強しました。今みたいにネット情報が豊富じゃなかったのでとても苦労しました。C++の入門書はやけに高いし。Cの経験はありましたが、実用レベルのソフトを組んだことは無かったので、未経験に等しい状態(でも第二種の午後問題はCを選んだ)。

C++のお勉強の途中にDirectX7のSDKが登場して、そのときからVisualBasic用のライブラリも含まれるようになりました。アリガタヤ。折りしもNEC PC-9821シリーズの終焉期にあって、DirectX7はPC-9821で利用できる(公式にサポートされた)最後のDirectXとなりました。このころの私の開発環境は、PC-9821V200(青札)+Windows2000Pro(こちらもPC-9821最後のWindowsOS)+VisualBasic6といった感じでした。

このころになると、DirectX SDKのアンチョコ本も少しずつ増えてきて、開発もだいぶしやすくなりました。Microsoftから公式の日本語ドキュメントが公開されたのもありがたかったです。いまの作品の礎になった時期で、バージョンアップも大幅に進みました。

VisualStudio.NETが出るころ、VisualBasicの大幅な仕様変更に絶望、不貞寝していたため、.NETをまともに触ったのはVisualStudio2003のときです。アカデミック版よりももっと安い(たしか3000円?4000円くらいだったかと!)、学生向けのパックみたいなのが出て、それに手を出したのがきっかけでした。マイクロソフトに身分証明書を送るとか面倒な手続きはあったものの、その後VisualStudio2005Proがもらえるという特典もあって、かなりオイシイサービスでした。学生がWindowsアプリケーションを勉強すれば、Microsoftとしてもウマーなことになりますので、一応Win-Winってことで。

VisualStudio2005+DirectX8.1の環境下では、ついにVisualBasic.NETでの開発を余儀なくされましたが、思っていたよりスムーズに移行できました。とはいえ、インタフェースは刷新され、デバッグの際にも一度ビルドしてexeファイルを吐き出すあたり、「インタプリタ言語としてのBasic」の時代は終わったのだと認識したものです。

何より驚いたのは、「コントロール配列」が廃止になったことです。本当に便利だったんですがねえ。.NETでは、擬似的なindexみたいなのを設定して、それを引っ張ってくるという面倒な手続きが必要になりました。

VisualBasic2005+DirectX8.1の記述構文や構造体は、VB6+DirectX7のころとほとんど同じだったため、あまり苦労せず.NET化することができました。ただ残念なことに、バッファの状態によってノイズが交じるようになってしまい、対策を施さなければならなくなりました。

.NET化が済んで安心して、その後の拡張はほとんどしないまま今に至ります。たまにはやらないと感覚を忘れてしまいそうなので、やっとこさ再開したという感じです。

プログラムの記事一覧

アーカイブ