目次: Might and Magic ファミコン版 - まとめリンク
日記が増えすぎて、一覧が欲しくなってきたので作りました。
Might and Magic の攻略、解析の参考になるサイトです。
目次: Might and Magic ファミコン版 - まとめリンク
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 で攻略動画を見ていると、ラストダンジョン(イドの迷宮、アストラル世界)の音楽がとてもカッコ良いですね。何とか辿り着きたいですが、最初の町(ソーピガルの町)から脱出できていない身からすると、果てしなく遠いです。
目次: 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)です!超早ですね。
英語版はアイテムを別のアイテムに化けさせるバグがあって、そのバグを突くとゴミから終盤のクエストでもらえるはずのアイテムを錬成でき、ほぼ全てのクエストを無視してラストダンジョンに挑めます。
日本語版ではバグが修正されているほか、クエストの仕様も違うため、少なくとも同じ攻略法ではクリアできません。
目次: Might and Magic ファミコン版 - まとめリンク
ファミコン版 Might and Magic Book One にはたくさんのクエストがありますが、クリアに必要なクエストはさほど多くありません。図示するとこんな感じです。
なお、ファミコン版 Might and Magic Book One の情報は、マイトアンドマジック 1 攻略情報 さんが非常に参考になります。地図がめっちゃ見やすいです。
クエストの位置など詳しい情報は攻略情報さんを見ていただくとして、下記では TAS で使った攻略ルートを簡単に説明します。
以上が Might and Magic の世界に起こった事件と、その謎に迫るメインクエストを超スピード解決する手順となります。初めてプレイする方がこの手順でクリアすると、たぶん訳が分からないと思います。
お時間がある方は、攻略サイトを見ながらでも構わないので、金の板や町のヒント、囚人たちなどに出会い話すと、しっかり作られた世界感が味わえると思います。
もう一つのメインクエストの流れです。オーラのクエストは、ストーリーにはあまり関係ないです。ラストダンジョンの歯ごたえを増すためのクエストという感じです。アストラル世界は全てのストーリーの終着点で、ああ、そういうことだったんだ!と思うはずです。
この他にも諸侯のクエスト、全く関係ないクエストなど、たくさんありますので、ぜひ遊んでみてください。全体的に良くできたゲームシステムだと思うんですけど、難易度の高さ(敵が強すぎる……)に、挫けそうになるのがイケてないポイントではあります。
目次: Might and Magic ファミコン版 - まとめリンク
引き続き 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 ファミコン版 - まとめリンク
引き続き 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 ファミコン版 - まとめリンク
いくつか改善を盛り込んで 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 の迷路を歩かないと、デューム城内部には入れません。そうか、ズルは許さんってことね。良くできてるじゃん……。
コンパイラオプションで -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 だけの方が実行速度などで有利だと思われます。
コンパイラの -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 ライブラリ関数も使えなくなります。
目次: Might and Magic ファミコン版 - まとめリンク
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種を振り分けるルールが解析できていませんが、幸いにも通常戦闘の発生率が一番高いみたいで、さほど試行錯誤は必要ありませんでした。
そろそろ改善できそうな点がなくなったので、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 ファミコン版 - まとめリンク
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 の世界に起こった事件と、その謎に迫るメインクエストを超スピード解決する手順となります。初めてプレイする方がこの手順でクリアすると、たぶん訳が分からないと思います。
お時間がある方は、攻略サイトを見ながらでも構わないので、金の板や町のヒント、囚人たちなどに出会い話すと、しっかり作られた世界感が味わえると思います。
もう一つのメインクエストの流れです。オーラのクエストは、ストーリーにはあまり関係ないです。ラストダンジョンの歯ごたえを増すためのクエストという感じです。アストラル世界は全てのストーリーの終着点で、ああ、そういうことだったんだ!と思うはずです。
目次: 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 ファミコン版 - まとめリンク
Might and Magic TAS のルートです。いくつか試したところこれが一番早く 14m46s でした。YouTube にも載せておきました([TAS] NES Might and Magic Book One (J) 14:46 with Map - YouTube)
エリア 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 の世界に起こった事件と、その謎に迫るメインクエストを超スピード解決する手順となります。初めてプレイする方がこの手順でクリアすると、たぶん訳が分からないと思います。
お時間がある方は、攻略サイトを見ながらでも構わないので、金の板や町のヒント、囚人たちなどに出会い話すと、しっかり作られた世界感が味わえると思います。
目次: Might and Magic ファミコン版 - まとめリンク
通常の歩く移動以外の長距離移動手段の方法と、所要時間をメモしておきます。
行先はマップの特定位置のみですが、ショートカットに使えます。また上り階段マスに行くことが多いため、ダンジョンや城からの脱出には最適です。
最速で 213〜フレームくらいです。エンカウントが乱数依存なので若干ブレがあるものの、それでも一番早いです。
使用場所に制限があり、地上でしか使えません。しかし任意の地上 MAP に行ける優れもので GEM も不要の優れものです。
282〜フレームくらいです。非常に早く、使い勝手も良いので、私が TAS するうえでのメイン武器です。
使用場所の制限はないものの、町にしか行けない点と、消費が大きいのが欠点です。
発動は早いですが、移動エフェクトがテレポートと同じで長く、350〜フレームくらい掛かります。しかし Might and Magic は町から町への移動が不便なので、非常に重宝する魔法です。
テレポート禁止マップ(地上 A1, A2、ダスクの町、デューム城、アラマー城など)以外なら使えます。どこにでも行けて非常に便利なうえ、序盤のイベントなら無視できてしまうミラクル魔法です。本来は消費 MP 5 ですが、ダイヤの鍵なら MP 消費なく使えます。
453〜フレームくらいです。便利な反面、時間が掛かりますから、歩きの方が早い時もあります。具体例を挙げると、地上 A4 や、魔法の砦 B1、B2 はテレポート 2回より、歩き+テレポート 1回の方が早いです。
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2021.
Powered by PHP 5.2.17.
using GD bundled (2.0.34 compatible)(png support.)