解析というほどでもないですが、メモがてら残しておきます。アドレス0x9eに現在のマップIDが書かれています。マップIDとマップの名前の対応は下記のとおりです。
| マップID | マップ名 | マップID | マップ名 |
|---|---|---|---|
| 0x00 | - | 0x20 | E2 |
| 0x01 | ソーピガル | 0x21 | E3 |
| 0x02 | ポートスミス | 0x22 | E4 |
| 0x03 | アルガリー | 0x23 | デューム城 |
| 0x04 | ダスク | 0x24 | ホワイトウルフ城 |
| 0x05 | エルキューン | 0x25 | アラマー城 |
| 0x06 | ソーピガルの地下 | 0x26 | ブラックリッジノース城 |
| 0x07 | ノーザンバリアー洞穴 | 0x27 | ブラックリッジサウス城 |
| 0x08 | ポートスミスの地下 | 0x28 | ドラガデューン城 |
| 0x09 | エルキューンの地下 | 0x29 | ドラガデューン城B1 |
| 0x0a | ダスクの地下 | 0x2a | ドラガデューン城B2 |
| 0x0b | コリンブルッフ洞穴 | 0x2b | ドラガデューン城B3 |
| 0x0c | ボルカノ神殿 | 0x2c | 魔法の砦B1 |
| 0x0d | 鷹の目洞穴 | 0x2d | 魔法の砦B2 |
| 0x0e | ホワイトウルフ洞穴 | 0x2e | 森のあばら屋B1 |
| 0x0f | A1 | 0x2f | 森のあばら屋B2 |
| 0x10 | A2 | 0x30 | レイバン砦B1 |
| 0x11 | A3 | 0x31 | レイバン砦B2 |
| 0x12 | A4 | 0x32 | エルドラドB1 |
| 0x13 | B1 | 0x33 | エルドラドB2 |
| 0x14 | B2 | 0x34 | エルドラドB3 |
| 0x15 | B3 | 0x35 | エルドラドB4(※) |
| 0x16 | B4 | 0x36 | アストラル世界(※) |
| 0x17 | C1 | 0x37 | イドの迷宮(※) |
| 0x18 | C2 | 0x38 | - |
| 0x19 | C3 | 0x39 | - |
| 0x1a | C4 | 0x3a | - |
| 0x1b | D1 | 0x3b | - |
| 0x1c | D2 | 0x3c | - |
| 0x1d | D3 | 0x3d | - |
| 0x1e | D4 | 0x3e | - |
| 0x1f | E1 | 0x3f | - |
エミュレータなどメモリ書き換えできるツールであれば、地上のマップが切り替わる地点に行って、0x9eを行きたいマップに書き換えてから移動する(C2の [12, 0] を南下するなど)と、任意のマップに飛ばせてIDとマップの対応が楽に確認できます。無効なマップ(0x00や0x38以上)には、そもそも移動できなかったりハングしたりバグったりします。
(※)0x35以上のマップはオートマッピング不可
Might and Magicのオートマッピングの踏破フラグは1マス1ビットで、0が未踏破、1が踏破済みの意味です。1マス1ビット、16ビット(2バイト)でY: 1行分、32バイトで1マップ(16 x 16)分を表しています。並び順はマップで見たときの左上から右下に向かって並んでいます。
左上からデータを並べるときは、画像処理で良く見かける座標の取り方(左上がX: 0, Y: 0、右下に向かいX, Yが増える)を良く見かけますが、Might and Magicは数学と同じ座標の取り方(左下がX: 0, Y: 0、右上に向かいX, Yが増える)なので、マップの左上は [X: 0, Y: 15] です。
このようにYの降順(15 -> 0の順)で行単位に並んでいます。Xの小さい側がアドレスの小さい側に対応、バイト内でいうとMSB側に対応します。例えば、あるX座標1マスだけ訪れた場合の踏破済みフラグの値は下記のようになります。
踏破済みフラグが記録されている場所はマップのIDがわかれば計算できます。IDがNだとすると0x6880 + (N - 1) * 0x20です。
| マップID | アドレス | マップ名 | マップID | アドレス | マップ名 |
|---|---|---|---|---|---|
| 0x00 | - | - | 0x20 | 0x6c60 | - |
| 0x01 | 0x6880 | ソーピガル | 0x21 | 0x6c80 | - |
| 0x02 | 0x68a0 | ポートスミス | 0x22 | 0x6ca0 | - |
| 0x03 | 0x68c0 | アルガリー | 0x23 | 0x6cc0 | デューム城 |
| 0x04 | 0x68e0 | ダスク | 0x24 | 0x6ce0 | ホワイトウルフ城 |
| 0x05 | 0x6900 | エルキューン | 0x25 | 0x6d00 | アラマー城 |
| 0x06 | 0x6920 | ソーピガルの地下 | 0x26 | 0x6d20 | ブラックリッジノース城 |
| 0x07 | 0x6940 | ノーザンバリアー洞穴 | 0x27 | 0x6d40 | ブラックリッジサウス城 |
| 0x08 | 0x6960 | ポートスミスの地下 | 0x28 | 0x6d60 | ドラガデューン城 |
| 0x09 | 0x6980 | エルキューンの地下 | 0x29 | 0x6d80 | ドラガデューン城B1 |
| 0x0a | 0x69a0 | ダスクの地下 | 0x2a | 0x6da0 | ドラガデューン城B2 |
| 0x0b | 0x69c0 | コリンブルッフ洞穴 | 0x2b | 0x6dc0 | ドラガデューン城B3 |
| 0x0c | 0x69e0 | ボルカノ神殿 | 0x2c | 0x6de0 | 魔法の砦B1 |
| 0x0d | 0x6a00 | 鷹の目洞穴 | 0x2d | 0x6e00 | 魔法の砦B2 |
| 0x0e | 0x6a20 | ホワイトウルフ洞穴 | 0x2e | 0x6e20 | 森のあばら屋B1 |
| 0x0f | 0x6a40 | - | 0x2f | 0x6e40 | 森のあばら屋B2 |
| 0x10 | 0x6a60 | - | 0x30 | 0x6e60 | レイバン砦B1 |
| 0x11 | 0x6a80 | - | 0x31 | 0x6e80 | レイバン砦B2 |
| 0x12 | 0x6aa0 | - | 0x32 | 0x6ea0 | エルドラドB1 |
| 0x13 | 0x6ac0 | - | 0x33 | 0x6ec0 | エルドラドB2 |
| 0x14 | 0x6ae0 | - | 0x34 | 0x6ee0 | エルドラドB3 |
| 0x15 | 0x6b00 | - | 0x35 | 0x6f00 | (以降、キャラクターのステータス格納場所) |
| 0x16 | 0x6b20 | - | 0x36 | 0x6f20 | - |
| 0x17 | 0x6b40 | - | 0x37 | 0x6f40 | - |
| 0x18 | 0x6b60 | - | 0x38 | - | - |
| 0x19 | 0x6b80 | - | 0x39 | - | - |
| 0x1a | 0x6ba0 | - | 0x3a | - | - |
| 0x1b | 0x6bc0 | - | 0x3b | - | - |
| 0x1c | 0x6be0 | - | 0x3c | - | - |
| 0x1d | 0x6c00 | - | 0x3d | - | - |
| 0x1e | 0x6c20 | - | 0x3e | - | - |
| 0x1f | 0x6c40 | - | 0x3f | - | - |
マップIDと対比しやすくするため、あえて詰めず同じ並びにしておきました。オートマッピングが無効なマップは2つのグループがあって、1つ目はバーン地上エリア全域20マップです。このメモリ領域は別の用途に使われているようですが、何の用途か良く知りません。もう1つのグループはエルドラドB4、アストラル世界、イドの迷宮で、キャラクターステータスの格納場所となっています。
この記事にコメントする
Might and Magicの攻略サイトを眺めていたら、ゲーム進行を大幅に高速化できる仕掛けを見つけました。エリアC1にある「魔力がみなぎる泉」(一時的に全員の魔法レベルMLが最大の7になる)です。
エリアC1の攻略情報は何回も見ていたのに、全然気づいていませんでした。TASVideosに投稿した矢先にこんなことに気づくとは。うーむ。
ML7になると全魔法が使えるようになりますから、魔法使いML3「ひこう」とML6「つうか」、僧侶ML6「まちへ」を利用して大幅にショートカットできます。ML7になる効果は「やすむ」と消えますがTASでは「やすむ」必要がありません。マップ移動と戦闘では効果解除されないので、実質、ゲームクリアまでML7を維持できます。これは素敵だ。
問題はLv.1ゆえにMPが少ないことです。初期キャラの魔法使い、ユーリエール(MP 10)でも「ひこう(消費MP3)」と「つうか(消費MP6, GEM 4)」でMPがなくなります。MPを増やしたり回復する手軽な方法はなさそうなので、他のキャラクターも魔法使いに転職させ、なるべく高いMPの初期値(「ひこう」が2回使える、6以上)を引き、頭数でゴリ押ししかありません。
あと「ひこう」の欠点、町から町に飛べない点を補うため、僧侶も1人仲間に入れて、僧侶ML6「まちへ(消費MP6、GEM 4)」を使います。
時間が掛かるルートを潰すことを重視して「まちへ」を1回、「ひこう」を5回で試しました。内訳は、
GEMはコリンブルッフで20個手に入るので「つうか」「まちへ」「転送x6」でも消費数は14個で、十分お釣りが来ますが、GOLDと違ってGEMは足りない時に1人に集める方法がありません。所持数4個未満になる分け方をすると「つうか」も「まちへ」もGEM不足で使えなくなり(どちらも消費GEM 4)、GEMを持っている意味がなくなります。
魔法はGEMがないと「つかえません」と冷たく言われるだけですけど、ソーピガルの転送おじさんは挙動が違います。基本的には先頭の人からGEMを1つ持っていきますが、先頭の人がGEM 0だったら次の人から持っていくみたいです。分け方を気にしなくて良いんだ、便利じゃん……。
今回紹介するルートはおそらく最速ではないです。下記は思いついたアイデア。
たぶん6人の方が早くなると思うんですけど、パーティー人数変えるときは、ほぼ最初からやり直しでしんどい(エンカウントの調整、タイミングのズレ修正が辛い)ので、まだ試していません。
下記では試作した更新版5人パーティーのTASで使った攻略ルートを簡単に説明します。まずは準備です。
メインクエストを解く順番は変えていませんが、地上をちんたら歩いていた部分を「ひこう」で積極的にぶっ飛ばします。
以上がMight and Magicの世界に起こった事件と、その謎に迫るメインクエストを超スピード解決する手順となります。初めてプレイする方がこの手順でクリアすると、たぶん訳が分からないと思います。
お時間がある方は、攻略サイトを見ながらでも構わないので、金の板や町のヒント、囚人たちなどに出会い話すと、しっかり作られた世界感が味わえると思います。
もう一つのメインクエストの流れです。オーラのクエストは、ストーリーにはあまり関係ないです。ラストダンジョンの歯ごたえを増すためのクエストという感じです。アストラル世界は全てのストーリーの終着点で、ああ、そういうことだったんだ!と思うはずです。
この記事にコメントする
そろそろ改善できそうな点がなくなったので、18m43s版をTASVideos(サイトへのリンク)に投稿(TASVideos submissions: #7229: katsuster's NES Might and Magic in 18:43.92)しました。
私もあまり詳しい訳じゃないし、TAS動画の集まる有名サイトってくらいの認識しかなくて、仕組みを知りませんでした。投稿にあたりHow toを読んだ限りでは、下記のような仕組みみたいです。
YouTubeにTASVideosの投稿者名でTAS動画が投稿されていますが、あれはPublishされた動画のみです。ま、そりゃそうか。
この記事にコメントする
Might and MagicのTAS動画を作るときは戦闘を全く行わない(全部逃げる)ので、いかに最速で移動するか?の勝負になります。もはやRPGとは何だったのか……?という感じですが、TASならこんなもんでしょう。キー入力の基本ルールとして、
最後のルールがわかりにくいと思うんで、画像で紹介します。

1フレーム空けて(6523フレーム目)同じキー入力をすると認識する
一番わかりやすい例を挙げると、開けたマスへ前向きに移動する場合です。↑キーでもBキーでも前に進めますが、ルールを勘案すると↑を連打、もしくは、Bを連打(1フレーム空けなければならない)より、↑とBを「交互に連打」した方が速いです。面白いですね。
前向き1マスの移動につき1フレームずつ差が出ます。微々たる差ですが、歩くシーンは多いため意外と効きます。
キー入力を受け付けた後に、何フレーム入力禁止になるか?をまとめておきます。先ほどの画像で言うと赤くなっているフレームの数です。
Might and Magicはキー入力チェックと画面描画が全く同期していないせいなのか、入力禁止期間が ±1フレーム変化します。しかも頻繁に変化します。通常プレイなら気に留める必要すらないことです。が、TASは1フレームしかキーを押さないので、1フレームズレるだけで入力が認識されなくなり、めっちゃウザいです……。
まずは前後左右などの移動方法を紹介します。左右旋回は前後直進の倍時間が掛かります。特に入口、出口、イベントなどは特定の方向しか発生しない場合が多いので、なるべく旋回せずに済むルートを構築しましょう。
罠や壁を無視、強制エンカウントマスを無視して目的地に飛べます。歩きでは侵入できない場所にも行けるため、必須の魔法です。
非常に便利な反面453〜フレームと長い時間を要するのが欠点です。迷路の構造によっては歩いたほうが速い時もあります。
なんとLv.1で使える長距離移動の手段では最も速い(230〜フレーム)です。マップごとに固有の地点にしか行けないこと、乱数調整があるので必要フレーム数が不安定なことが欠点ですが、下手なテレポート+歩きよりずっと速いので、使える場所では積極的に使いましょう。
Might and Magicはエンカウント率がかなり低めなので、当てずっぽうだと1度エンカウントするだけで試行回数が数百回を超え、めっちゃしんどいです。正直やってられませんでした。リバースエンジニアリングしてエンカウント予測できるようなってからというもの、気軽にエンカウント+逃げが使えて、TAS作成時に非常に役立ちました。技術力の勝利。
モンスターとの出会い方は3種類あります。
通常エンカウントが最速です。選択肢が出るタイプは時間が掛かり、「おそいかかってきた」は逃げられません、どちらも論外です。3種を振り分けるルールが解析できていませんが、幸いにも通常戦闘の発生率が一番高いみたいで、さほど試行錯誤は必要ありませんでした。
この記事にコメントする
目次: GCC
コンパイラの-nostdlibと -nostartfilesの効果についてメモしておきます。確認方法は簡単で、gccに -vオプションを付けるだけです。
結果が大量に出力されるので、collect2のオプションのみ抜粋して、さらに今回の話題と関係ない余計なオプションは省きます。
/usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginT.o AAAAA.o --start-group -lgcc -lgcc_eh -lc --end-group /usr/lib/gcc/x86_64-linux-gnu/9/crtend.o /usr/lib/x86_64-linux-gnu/crtn.o
初期化を行うcrt1, crtiと、終了時の処理を行うcrtend, crtnが暗黙のうちにリンクされています。また -lgccや -lcといったCライブラリ系も暗黙のうちにリンクされます。
AAAAA.o --start-group -lgcc -lgcc_eh -lc --end-group
先ほどの結果と比べるとcrt何とかが全部消えましたが、-lgccなどは健在です。Cライブラリ関数は使えますが、crt何とかが呼んでくれていたmainが呼ばれなくなります。代わりに _startという関数を定義せよと言われます。
AAAAA.o
暗黙のうちにリンクされるオブジェクトやライブラリが全てなくなりました。printfのようなCライブラリ関数も使えなくなります。
この記事にコメントする
目次: GCC
コンパイラオプションで-ffreestanding -nostdlibを指定したときと、-nostdlibだけを指定したときの挙動の違いをメモしておきます。
int printf(const char *a, ...);
void _start(void)
{
printf("\n");
}
おそらくこの例がわかりやすいと思います。-ffreestanding -nostdlibの場合は「freestanding環境」をしてします。C言語の規格ではhostedとfreestandingの2つが定められていて、hostedは全ての標準ライブラリ関数が使える環境、freestandingは標準Cライブラリが存在しない環境(※)を意味します。OSのない環境などを想定しています。
このときprintf() は素直にprintf() 関数の呼び出しとしてコンパイルされます。したがって、
$ gcc -g -Wall -ffreestanding -nostdlib a.c /usr/bin/ld: /tmp/ccclc296.o: in function `_start': a.c:4: undefined reference to `printf'
リンクエラーも「printfがないよ」となります。これはnostdlibを指定しているので、暗黙のうちにリンクされる標準Cライブラリ(-lc)すらもリンクされないからです。
一方、ffreestandingを指定しない場合は、標準Cライブラリが存在するものとして最適化が働きます。この例で言えば、printf("\n"); はputchar('\n') に置き換えた方が良いね!という最適化が働きます。したがって、
$ gcc -g -Wall -nostdlib a.c /usr/bin/ld: /tmp/ccZ5E2Qq.o: in function `_start': a.c:4: undefined reference to `putchar'
リンクエラーは「putcharがないよ」となります。
(※)標準ヘッダのうちfloat.h, iso646.h, limits.h, stdarg.h, stdbool.h, stddef.hのみ使えます。
正確な意味が知りたければ、C99 draft TC3 (N1256) 4.Conformanceの6. を参照ください。
どちらが良いとかではなくて、作りたいシステム次第です。
標準Cライブラリを使わず、CライブラリのAPIを前提とした最適化をされると困るなら、-ffreestandingを指定しなければなりません。コンパイラが抱えているCライブラリの代わりに、あえて別の標準Cライブラリ準拠のライブラリを使う(つまりfreestandingではない)ときは、-ffreestandingは使わず -nostdlibだけの方が実行速度などで有利だと思われます。
この記事にコメントする
いくつか改善を盛り込んで19m30sになり、さらにもう一工夫で1分半以上早くなって18m43sにできました。YouTubeにも載せておきました([TAS] NES Might and Magic Book One (J) 18:43 - YouTube)。
基本的なルートは当初から変えていません。最初のバージョンからの変遷23m30s → 20m28s → 19m30s → 18m43sを見ると、5分くらい無駄を削ったことになりますね。
最初のバージョンを作ったときは、3〜4分は削れそうだけど19分切るのは無理かな〜?と思ってましたが、意外と早くなってびっくりです。でも、そろそろ限界を感じるのでここらで打ち止めにします。
前のバージョン(19m30s版)では、持ち物が溢れるので2人パーティーでクリアしましたが、実は1人旅でも問題ありません。Might and Magicは必須アイテムでも容赦なく捨てられるからです。
例えば、ゴロスの目玉を手に入れるとき、フック付きロープはもちろん、その時点で用済みとなった必須アイテム(金のカギ、ルビーの笛)も捨てて構いません。
改善点の一覧はYouTubeの説明と同じになりますが19m30s版では、
次の18m43s版では、
これ以上を目指すなら、劇的にルート改善するか、メインクエストを飛ばすようなバグがないと厳しそうです。
Might and MagicのTASに挑みたいという奇特な方が居るとはあんまり思えないんですけど、将来の参考のために「やったけどダメだったこと」も残しておきます。
失敗その1、コリンブルッフ洞穴ではなく、エルキューンの町でGEMを取るルート。
エルキューンは宝物を「ぬすむ」とGEMが取れます。GEMを得るまでは早いんですが、エルキューンからソーピガルに帰る時間が掛かるので、総合では遅いです。Might and Magicは町同士が絶妙に離れた嫌らしい場所にありますね。良くできてるじゃん……。
失敗その2、コリンブルッフ洞穴 → デューム城のポータルでエリアA1を無視するルート。
エリアA1はテレポート使用不可のMAPで、迷路が非常に長くて時間が掛かります。コリンブルッフ洞穴からデューム城に行けば、大きく時間削減できるのでは?と期待しましたが、エリアA1の巧妙な仕掛けに阻まれて実現不可能でした。
デューム城はざっくりいうと外部と内部に分かれていて、クエストで用事があるのは内部です。コリンブルッフ洞穴のポータルから行くと外部に着きます。外部から内部には「つうか」の魔法があれば行けます。しかしながらLv.1のキャラクターで「つうか」の魔法を使う容易な方法はないです(少なくとも私は知らない)。
エリアA1に一度出て、デューム城内部に入ろうとしてもダメで、エリアA1の迷路開始点 [15, 7] を踏まないと、デューム城内部へ行く入り口(石垣の隙間 [7, 14])が出現しない仕掛けになっていました。コリンブルッフから来ても、エリアA1の迷路を歩かないと、デューム城内部には入れません。そうか、ズルは許さんってことね。良くできてるじゃん……。
この記事にコメントする
引き続きMight and Magic TAS動画に挑んでいます。前回書いた通り、町以外のMAPではエンカウント判定用のカウンタ変化量が予測できません。しかしコントローラ入力後だけは、カウンタの変化量が必ず0もしくは1になることに気づきました。これを利用し、町以外のMAPのエンカウントが50%の確率で予想できるようになりました。
残念ながら今の知識ではエンカウント予想を100%にはできなさそうです。Might and Magicはキー入力チェックと画面更新が全く同期しないので、フレーム単位(=画面更新)しか動くタイミングがないTASのツールだと、うまく挙動が推定できません。技術的にはモヤっとしますが、動画を作る分にはこれでも十分です。
地上エリアA1やA2のように、歩きだと脱出に時間が掛かるMAPで「わざとエンカウント+逃げる」手段を使えるようになったので、格段に早く脱出できるようになりました。
他にも細かい点を更新して3分くらいタイムを更新し、20分28秒になりました。
メッセージスキップも、未だに仕組みは良くわからないものの、
とすると、比較的メッセージスキップが実現しやすいことが判明しました。
もはや興味のある人はいないと思うので、自分向けのメモです。改善点は下記のとおりです。
TASなら戦闘結果も制御してなんぼだろ!?というご指摘はごもっともですけど、どうも良い乱数が引けず、極端に時間が掛かったり、ドロップアイテムのGEMが足りなくて詰んでしまったり、うまく行かないことが多いです。TASですら戦闘が鬼門なの?このゲーム……??
再現性が不安定すぎるので戦闘をルートから外し、GEMはコリンブルッフ洞穴で拾うことにしました。これでだいぶ安定します。動画をアップロードしてから気づきましたが、5人パーティになっていますが、戦闘しないならメンバーは2人でも良かったかな。うーん、まあいいか。
この記事にコメントする
引き続きMight and Magic TAS動画に挑んでいます。クリアタイムを縮めるには「わざとエンカウントして逃げる」「メッセージスキップ」の2点がほしいですが、メモリダンプを見ていても全く発生条件がわかりません。仕方ないのでファミコンのCPU 6502のアセンブラを読んでいます。もはやリバースエンジニアリングです。
命令が非常にシンプルで、レジスタ幅は8bit、レジスタ数はA, X, Yの3つしかありません。読んでいる分には面白いですが、これでソフト書くことを想像すると辛いです。昔の人はこんなん書いてたのかあ……。ま、それはさておいて、プログラムの解析を行った結果、エンカウントのルールが「半分だけ」分かりました。
カウントの条件判定関数(アドレス0xE85Dとそのサブ関数)をLuaで書き直しました。BizHawkのLuaも初めて使ったので書き方がわからず、1回Pythonで書いてから移植するという無駄な行為をしました……。中心となる条件判定関数はこんな感じです。
function rol(v)
local ncarry = (bit.band(v, 0x80) ~= 0)
v = bit.lshift(v, 1)
v = bit.band(v, 0xff)
if (carry) then
v = bit.bor(v, 0x1)
end
carry = ncarry
return v
end
function ror(v)
local ncarry = (bit.band(v, 1) ~= 0)
v = bit.rshift(v, 1)
v = bit.band(v, 0xff)
if (carry) then
v = bit.bor(v, 0x80)
end
carry = ncarry
return v
end
function adc(v1, v2)
v1 = v1 + v2
if (carry) then
v1 = v1 + 1
end
carry = (v1 > 0xff)
return bit.band(v1, 0xff)
end
function sbc(v1, v2)
v1 = v1 - v2
if (not carry) then
v1 = v1 - 1
end
carry = not (v1 < 0)
return bit.band(v1, 0xff)
end
function judge(v0, v1, v2)
local v24e = v0
v523 = v1
v524 = v2
-- Addr: E8A1
local v248 = 0x73
local v249 = 0xc
-- Addr: E8AB
local v24a = v523
local v24b = v524
local v24c = v523
local v24d = v524
-- Addr: E8BF...E8D2
for x = 7, 1, -1 do
v24c = rol(v24c)
v248 = ror(v248)
if (carry) then
carry = false
ra = adc(v24a, v24c)
v24a = ra
end
end
-- Addr: E8D4
carry = true
v24a = sbc(ra, v24b)
-- Addr: E8DD...E8F0
for x = 4, 1, -1 do
v24d = rol(v24d)
v249 = ror(v249)
if (carry) then
carry = false
ra = adc(v24b, v24d)
v24b = ra
end
end
-- Addr: E8F2
carry = true
v24b = sbc(ra, v24a)
v524 = v24b
-- Addr: E8FC
carry = true
v24a = sbc(v24a, v24b)
v523 = v24a
----------------------------------------------
-- Addr: E871
v24f = v24a
ra = 0
-- Addr: E87B ... E88F
for x = 8, 1, -1 do
v24f = rol(v24f)
ra = rol(ra)
carry = true
ra = sbc(ra, v24e)
if (not carry) then
ra = adc(ra, v24e)
end
end
-- Addr: E891
v24e = ra
v24e = v24e + 1
return v24e
end
引数のv0には現在いるマップから決まる一定の値(アドレス0x6191の値)を渡し、引数v1, v2にはカウンタ0x523, 0x524の値を渡します。エンカウント判定の結果が1であれば敵とのエンカウントという意味になります。あとjudge() を呼ぶ前に、グローバル変数のcarry = falseにしておかないと結果が狂います。
内部でキャリークリアしとけ、って思われるかもしれませんがcarry = trueで呼ぶケース(今回は追っかけていませんが)もあるので、勝手にキャリークリアしてはいかんのです……。
話を元に戻すと、カウンタを255フレーム分、変化させながらこの判定関数を呼ぶと、今から何フレーム後にエンカウントするか予測できるわけです。
例えば、上記の画像だと(43, 157, 179)と出ています。これは43フレーム目にエンカウント処理が真と判定されるという意味です。ややこしいことに、Might and Magicのエンカウント判定は移動するボタン(前後左右、Bボタンのどれか)を押した「次のフレーム」に行われるため、42フレーム後に移動すると必ずエンカウントします。同様の理屈で156フレーム後、178フレーム後も移動すると必ずエンカウントします。
エンカウントを理解できたぞ、これならエンカウント楽勝だろ!と意気込んで地上MAPに行ってみたら、町以外(地上、ダンジョンなど)はカウンタの増減ルールが全く違っていて予測は微塵も機能しませんでした。ええ……そんな……。
町だと1フレームに1回しかコントローラの状態を見ないため、カウンタも1しか変化しません。そのため予測が楽でした。ところが町以外のMAPはアイドル時間に全力でコントローラの状態を見るため、70〜80くらいカウントが一気に変わり、さらに嫌なことに毎フレーム変化量が違うので予測ができません。こりゃ無理ですね。
エンカウントと並ぶもう一方の難問「メッセージスキップ」のルールは全く分かりません。基本的にはボタンを押すとメッセージがスキップされるはずなのに、そうじゃない時間がかなりあります。プログラムを解析していると8フレームほど入力を全く見ていない瞬間が何カ所かあって、スキップと関連していそうでしたが、仕組みの解明には至りませんでした。
メッセージスキップを諦めるとかなり時間を食ってしまう(最速スキップで11〜16フレーム、スキップしないと160〜170フレーム)ので、困りましたね。
この記事にコメントする
ファミコン版Might and Magic Book Oneにはたくさんのクエストがありますが、クリアに必要なクエストはさほど多くありません。図示するとこんな感じです。
なお、ファミコン版Might and Magic Book Oneの情報は、マイトアンドマジック1攻略情報 さんが非常に参考になります。地図がめっちゃ見やすいです。
クエストの位置など詳しい情報は攻略情報さんを見ていただくとして、下記ではTASで使った攻略ルートを簡単に説明します。
以上がMight and Magicの世界に起こった事件と、その謎に迫るメインクエストを超スピード解決する手順となります。初めてプレイする方がこの手順でクリアすると、たぶん訳が分からないと思います。
お時間がある方は、攻略サイトを見ながらでも構わないので、金の板や町のヒント、囚人たちなどに出会い話すと、しっかり作られた世界感が味わえると思います。
もう一つのメインクエストの流れです。オーラのクエストは、ストーリーにはあまり関係ないです。ラストダンジョンの歯ごたえを増すためのクエストという感じです。アストラル世界は全てのストーリーの終着点で、ああ、そういうことだったんだ!と思うはずです。
この他にも諸侯のクエスト、全く関係ないクエストなど、たくさんありますので、ぜひ遊んでみてください。全体的に良くできたゲームシステムだと思うんですけど、難易度の高さ(敵が強すぎる……)に、挫けそうになるのがイケてないポイントではあります。
この記事にコメントする
子ども時代のトラウマ難易度ゲームMight and Magic Book Oneに、大人になってから挑みましたが、変わらず撃沈しました。やっぱり難しいです。でもエミュレータなら、Lv.1で最速クリアする動画を作れるんです。いわゆるTAS(Tool Assisted Speed-run)動画です。
TASするにあたっては、定番のBizHawkというエミュレータを使います。ROMをロードしてTool - TAStudioを選ぶと、フレーム単位でキー入力を選べる画面が出現します。
操作に自信があるならRecording modeを使って自分の操作を記録し、あとでファインチューンすると良いでしょう。私は操作にあまり自信がなかったので、1フレームずつチマチマとマウスで入力しました。
とりあえずエンディングまで辿り着いたので、YouTubeにもアップロード([TAS] NES Might and Magic Book One (J) 23:30 - YouTube)しました。YouTubeのアップロード側機能は初めて使いましたが、とても使いやすいですね。
TASとしてのクオリティはあまり良くないです。攻略ルートがかなり適当で、これより早くクリアできる動画は簡単に作れると思います。容易に改善できそうなところは、
5人パーティーだとオーラのクエストが長いし、戦闘で行動できない人が出やすく無駄が多いので避けたいですが、4人パーティーだと「ようせいx 3」が出ないので、妥協しました。
あとMight and Magicの大きな特徴として、敵から逃げるとMAPの特定の位置に必ず戻される仕様があります。わざとエンカウントし逃げれば、歩くよりも早く移動ができる可能性があります。TASではぜひとも活用すべき事項ですが、エンカウントのルールがわからず、エンカウント確率もかなり低いため、総当たりだと全然エンカウントしません。これは厳しい。ギブアップ。
とまあ、色々諦めたしょぼいTAS動画を作っただけで非常に疲れました……。世の中のハイレベルTAS動画の作者さんは凄いですわ〜。
Might and Magicファミコン版は日本語版と英語版があります。このうち英語版のTASは既に存在していて、クリアタイムがたったの8分([TAS] NES Might and Magic by Dammit in 08:07.72 - YouTube)です!超早ですね。
英語版はアイテムを別のアイテムに化けさせるバグがあって、そのバグを突くとゴミから終盤のクエストでもらえるはずのアイテムを錬成でき、ほぼ全てのクエストを無視してラストダンジョンに挑めます。
日本語版ではバグが修正されているほか、クエストの仕様も違うため、少なくとも同じ攻略法ではクリアできません。
この記事にコメントする
Nintendo Switch Onlineに加入すると、ファミコンやスーパーファミコンのソフトでも遊べるので、子供の時に挫折したゲーム(最近だとファミコンウォーズ、スーパーピクロス)をやっています。グラフィクスは近年のゲームと比べるまでもなくショボいですけど、今も名作は名作です。面白いですね。
子どもの時に挫折したゲームはいくつもありますが、ナンバーワンがMight and Magic Book One : the Secret of the Inner Sanctumです。この時代に流行ってたWizardryみたいな3D風の迷路を歩いていく海外製RPGです。難易度が異常に高くて有名で、小学生の私はLv.2すら拝むことなく諦めました。
この手のSwitchには収録されていないソフトも遊びたいなあ?と思って、ニューファミコンを物色していたのですが、結構でかくて邪魔そうだし、中古の割に高いです。今でも人気なのか……侮ってましたね。
ですが、我々にはPCとエミュレータがあるじゃないですか。幸いなことに、ファミコンソフトそのものはそんなに高くないので、ROMダンパーでROMを吸い出して、PCで遊ぶことにしました。
私はレトロダンパー(メーカーのサイト)を使っています。クライアントを起動して、認識ボタンを押し、吸い出すだけでOKなので便利です。
早速、中古のカセットを購入しました。外観は割とズタボロというか、年季入った姿です。ま、動けば良いのさ。

ファミコン版Might and Magic Book Oneのカセット
GAKKENのロゴの通り、なぜか日本語ローカライズは学習研究社(学研)が行っています。今見ると不思議です。教科書作ってる学研が、なぜゲームの移植を……。
レトロダンパーさんで吸い出すときはこんな感じになります。吸い出したROMをエミュレータに放り込んでみたところ、正常に動作しているようです。良きかな良きかな。
まずは普通に遊んでみました。今なら意外とクリアできるのでは?と思ったのも束の間、あっ、無理でした。調子乗ってすみませんでした。在りし日の絶望が蘇りました。
最初から難しすぎます。基本的には1バトルごとに休憩+セーブって感じです。攻撃が当たらないのも辛く、一方的にボコられて死んでしまいます。死んだら復活させるお金がないのでリセットです。
さらにWikipediaを見てびっくりしたのは、次の一文です。
「ファミコン版は(中略)やや簡単に調整された部分が多い」
えっ?これで?嘘だろ……??オリジナル版はどれだけ鬼畜難易度なの?
息抜きにYouTubeで攻略動画を見ていると、ラストダンジョン(イドの迷宮、アストラル世界)の音楽がとてもカッコ良いですね。何とか辿り着きたいですが、最初の町(ソーピガルの町)から脱出できていない身からすると、果てしなく遠いです。
この記事にコメントする
TASに挑んだ記録。
解析したときの情報。その他。
Might and Magicの攻略、解析の参考になるサイトです。
目次: 一覧の一覧
この記事にコメントする
| < | 2021 | > | ||||
| << | < | 10 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| - | - | - | - | - | 1 | 2 |
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 | - | - | - | - | - | - |
wiki
Linux JM
Java API
2002年
2003年
2004年
2005年
2006年
2007年
2008年
2009年
2010年
2011年
2012年
2013年
2014年
2015年
2016年
2017年
2018年
2019年
2020年
2021年
2022年
2023年
2024年
2025年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: