Might and Magic TASのルートです。いくつか試したところこれが一番早く14m46sでした。
エリアC1にある「魔力がみなぎる泉」(一時的に全員の魔法レベルMLが最大の7になる)を使い、魔法使いML3「ひこう」とML6「つうか」、僧侶ML6「まちへ」を利用して大幅にショートカットします。
大きな問題は6人パーティーにして盗賊と僧侶を除いた4人を魔法使いにしてもMPが不足し、後半「ひこう」が使えず大きなロスになります。解決策として5人パーティーにして一回「やすむ」でMPを回復させることにします。「魔力がみなぎる泉」に2回通うことになりますが、その分、デューム城を「つうか」でぶっ飛ばせるので、総合的にみると早くなります。
気を付けるべきは、初期魔法キャラのユーリエール、ガーデニアです。この2人は最初MP 10ですが「やすむ」とMP 6に下がる変な奴らです。MPを使ってから「やすむ」をしないと、MPが無駄になります。
GEMはコリンブルッフで20個手に入りますが、GOLDと違ってGEMは足りない時に1人に集める方法がありません。所持数4個未満になる分け方をすると「つうか」も「まちへ」もGEM不足で使えなくなり(どちらも消費GEM 4)、GEMを持っている意味がなくなります。
5人パーティーで3人「つうか」「まちへ」を使う場合、GEMを使う3人に「わりあい」を3にして分けると、2, 2, 4, 4, 4に分けられます。「わりあい」を変えたときの「わける」は挙動がバグっており、なぜか合計GEM数が減ります。今回のパターンだと1/5も消え(20 → 16個)ます。しかも1:1で分けても4, 4, 4, 4, 4になるので、魔法系キャラに渡せるGEM数が全く変わらず、「わりあい」を変えるだけ無意味です。面食らうバグですね……。
ソーピガルの転送おじさんは、基本的には先頭の人からGEMを1つ持っていきます。先頭の人がGEM 0だったら次の人から持っていきます。便利なんですけど、間違って「つうか」係の人からGEMを奪わないよう、並び順もしくはルートに気を付ける必要があります。今回、転送は3回使います。
FOODはギルドで転職すると20個もらえますから「わける」すればOK です。初期キャラはFOOD 0個なので、「わける」を忘れると「やすむ」で回復しません。罠としか思えない設定です。このゲームの難易度おかしいポイントの1つですね。
初期キャラは全員無一文&ほぼ手ぶらなのは不思議ですよね。かろうじて武器か道具を1つだけ持っていますが、装備すらしていません。冒険舐めすぎでしょ?
移動系魔法を使う回数は「ひこう」9回、「つうか」2回、「まちへ」1回です。内訳は、
下記では今回のTASで使った攻略ルートを簡単に説明します。まずは準備です。
メインクエストを解く順番は以前と変わっています(貴族のパスポート、デューム城を後回し)、地上をちんたら歩いていた部分を「ひこう」で積極的にぶっ飛ばします。
メインクエストの流れとしては、このままデューム城に乗り込みたいところですが、今回はMPの配分の都合もあって別のクエストに寄り道します。
もう一つのメインクエストですけど、オーラのクエストはストーリーとあまり関係ないです。ラストダンジョンの歯ごたえを増すためのクエストという感じです。
これで寄り道終わりです。メインクエストに戻ります。
TASでは無視できるものは全て無視して、最速で解きますけども……。本来、真のアラマー王とアストラル世界のクエストは、他のクエストや金の板(ヒントが書いてある)を見ないと答えがわからない作りになっています。全てのストーリーの終着点となっていて、ああ、そういうことだったんだ!と思う作りです。
以上がMight and Magicの世界に起こった事件と、その謎に迫るメインクエストを超スピード解決する手順となります。初めてプレイする方がこの手順でクリアすると、たぶん訳が分からないと思います。
お時間がある方は、攻略サイトを見ながらでも構わないので、金の板や町のヒント、囚人たちなどに出会い話すと、しっかり作られた世界感が味わえると思います。
解析というほどでもないですが、メモがてら残しておきます。アドレス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の迷路を歩かないと、デューム城内部には入れません。そうか、ズルは許さんってことね。良くできてるじゃん……。
< | 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 | - | - | - | - | - | - |
合計:
本日: