コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2021年10月15日 >>> 2021年10月2日
link もっと後

2021年10月15日

初めてTASVideosに投稿

目次: Might and Magicファミコン版

そろそろ改善できそうな点がなくなったので、18m43s版をTASVideos(サイトへのリンク)に投稿(TASVideos submissions: #7229: katsuster's NES Might and Magic in 18:43.92)しました。

私もあまり詳しい訳じゃないし、TAS動画の集まる有名サイトってくらいの認識しかなくて、仕組みを知りませんでした。投稿にあたりHow toを読んだ限りでは、下記のような仕組みみたいです。

  • 投稿するとNew状態になる
  • フォーラムでサイトのメンバーが投票する(Yes, No, Mehの3つ)
  • フォーラムでは投票以外にも、質問とか、説明の不足などの指摘もあるとのこと
  • 欠陥があるTAS動画は落とされるらしい
  • イイね!となったらPublishされる

YouTubeにTASVideosの投稿者名でTAS動画が投稿されていますが、あれはPublishされた動画のみです。ま、そりゃそうか。

編集者:すずき(2023/09/24 12:31)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年10月14日

Might and Magic Book One TASは移動が全て

目次: Might and Magicファミコン版

Might and MagicのTAS動画を作るときは戦闘を全く行わない(全部逃げる)ので、いかに最速で移動するか?の勝負になります。もはやRPGとは何だったのか……?という感じですが、TASならこんなもんでしょう。キー入力の基本ルールとして、

  • キー入力可能区間と、禁止区間がある
  • キー入力後、入力禁止区間が始まる(長さは後述)。
  • キー入力可能区間なら、キーを1フレーム押してすぐ離せば認識される(複数フレームに渡って押し続ける必要がない)
  • 同じキーをもう一度入力するには、キー入力を認識する区間が始まった後「最低1フレーム以上空ける」必要がある

最後のルールがわかりにくいと思うんで、画像で紹介します。


1フレーム空けて(6523フレーム目)同じキー入力をすると認識する


1フレーム空けずに同じキー入力をすると認識しない


1フレーム空けなくても、違うキー入力ならば認識する

一番わかりやすい例を挙げると、開けたマスへ前向きに移動する場合です。↑キーでもBキーでも前に進めますが、ルールを勘案すると↑を連打、もしくは、Bを連打(1フレーム空けなければならない)より、↑とBを「交互に連打」した方が速いです。面白いですね。

前向き1マスの移動につき1フレームずつ差が出ます。微々たる差ですが、歩くシーンは多いため意外と効きます。

入力禁止期間

キー入力を受け付けた後に、何フレーム入力禁止になるか?をまとめておきます。先ほどの画像で言うと赤くなっているフレームの数です。

Might and Magicはキー入力チェックと画面描画が全く同期していないせいなのか、入力禁止期間が ±1フレーム変化します。しかも頻繁に変化します。通常プレイなら気に留める必要すらないことです。が、TASは1フレームしかキーを押さないので、1フレームズレるだけで入力が認識されなくなり、めっちゃウザいです……。

基本的な移動

まずは前後左右などの移動方法を紹介します。左右旋回は前後直進の倍時間が掛かります。特に入口、出口、イベントなどは特定の方向しか発生しない場合が多いので、なるべく旋回せずに済むルートを構築しましょう。

前へ移動(↑ or Bキー)
基本的な移動方法です。Might and Magicの歩きは意外に速くて、テレポートする時間で40マスくらい進めてしまいます。迷路、強制エンカウントなどのない場所なら、歩きが最速の移動方法です。
  • 障害物なし: 8〜9フレーム
  • 障害物あり: 3〜4フレーム(乱数振り直しが発生しない)
後ろへ移動(↓キー)
前向きと同じ速度ですが、↑とBを交互に押して速く移動する技は後ろ向きだと使えません。加えてドアや通り抜けられる壁を通過できませんので、基本的には使わないでしょう。テレポート後など、旋回せず交差点に行ける場合に使うことがあるくらい。
  • 障害物なし: 8〜9フレーム
  • 障害物あり: 3〜4フレーム(乱数振り直しが発生する)
左、右旋回(←、→キー)
どちらも同じ速度で、18〜19フレームです。遅いとは言いませんが、速くもないです。戦闘の前後、マップ移動の前後でパーティーの向きが変わらないことをうまく活用し、旋回する回数をなるべく減らしましょう。迷路のマップはどうしようもないですが……。
メッセージ(スキップなし)
スキップしない場合はGO AHEAD! のメッセージウインドウが閉じる、新たなメッセージウインドウが開く、というエフェクトを待つので88フレームほどかかります。意外と長いです。
  • 入力禁止: 5〜6フレーム
  • 閉じる: 24フレーム(スキップ可能区間)
  • 入力禁止: 24フレーム
  • 開く: 24フレーム(スキップ可能区間)
  • 入力禁止: 10フレームくらい、メッセージの長さに依存
メッセージ(スキップあり)
スキップ成功した場合はGO AHEAD! のメッセージが消え、新たなメッセージが上書きされる、という過程を経ます。GO AHEAD! が閉じようとするときにメッセージスキップできた場合が一番速いです。55フレームくらい(30フレーム高速化)です。
  • 入力禁止: 5〜6フレーム
  • スキップまで: 24フレーム以下(スキップ可能区間)
  • 入力禁止: 25フレームくらい、メッセージの長さに依存
マップ移動
メッセージ2回+エフェクトなので時間が掛かります。できるだけマップ移動は避けた方が早くなりますが、Lv.1は移動方法に制約が多く、どうしてもマップ移動が増えます。悩ましいです。

長距離移動その1: テレポート(ダイヤの鍵)

罠や壁を無視、強制エンカウントマスを無視して目的地に飛べます。歩きでは侵入できない場所にも行けるため、必須の魔法です。

  • メニューオープン: 1 + 32フレーム
  • アイテムメニュー選択: 6〜8フレーム(↓→ Aを最速で入力)
  • 使用者リストオープン: 15フレーム
  • 使用者選択: 2フレーム(Aが連続で押せない、1フレーム待たないとダメ)
  • 装備リストオープン: 39フレーム
  • カーソル移動: 16フレーム(↓を6回入力、毎回カーソル描画1フレーム発生)
  • バックパックリストオープン: 33フレーム
  • アイテム選択: 1フレーム(一番上にあると最速)
  • 魔法エフェクト: 53フレーム
  • 方角選択: 3〜12フレーム(↓↓↓Aなど、Aのみで済む「北向き」が最速)
  • 描画待ち: 11フレーム
  • 距離選択: 1〜16フレーム(↑↑↑ or ↓↓↓...Aなど、Aのみで済む「1ブロック」が最速、なぜか↑キーより、↓キーの方が1フレームずつ速い)
  • 移動エフェクト: 240フレーム

非常に便利な反面453〜フレームと長い時間を要するのが欠点です。迷路の構造によっては歩いたほうが速い時もあります。

長距離移動その2: エンカウント+逃げる

なんとLv.1で使える長距離移動の手段では最も速い(230〜フレーム)です。マップごとに固有の地点にしか行けないこと、乱数調整があるので必要フレーム数が不安定なことが欠点ですが、下手なテレポート+歩きよりずっと速いので、使える場所では積極的に使いましょう。

Might and Magicはエンカウント率がかなり低めなので、当てずっぽうだと1度エンカウントするだけで試行回数が数百回を超え、めっちゃしんどいです。正直やってられませんでした。リバースエンジニアリングしてエンカウント予測できるようなってからというもの、気軽にエンカウント+逃げが使えて、TAS作成時に非常に役立ちました。技術力の勝利。

  • 出会うまでの調整: 10〜フレーム(カウンタ次第で100フレームほどもありえる)
  • モンスターが近づいてきた: 130〜フレーム(移動方法により速度が違う、最速は後ろ向き移動で壁に激突)
  • 戦闘メニュー: 16フレーム
  • 逃げる選択: 7〜フレーム(カウンタ次第で失敗する、調整必要だが大抵10フレームあれば収まる)
  • 画面切り替え: 50フレーム

モンスターとの出会い方は3種類あります。

  • 戦うかどうか選択
  • 通常(逃げられる)
  • 「おそいかかってきた」メッセージ+強制的に戦う(ほぼ逃げられない)

通常エンカウントが最速です。選択肢が出るタイプは時間が掛かり、「おそいかかってきた」は逃げられません、どちらも論外です。3種を振り分けるルールが解析できていませんが、幸いにも通常戦闘の発生率が一番高いみたいで、さほど試行錯誤は必要ありませんでした。

編集者:すずき(2021/11/08 23:42)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年10月12日

nostdlibとnostartfiles

目次: GCC

コンパイラの-nostdlibと -nostartfilesの効果についてメモしておきます。確認方法は簡単で、gccに -vオプションを付けるだけです。

結果が大量に出力されるので、collect2のオプションのみ抜粋して、さらに今回の話題と関係ない余計なオプションは省きます。

gcc -staticの場合
/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ライブラリ系も暗黙のうちにリンクされます。

gcc -static -nostartfilesの場合
AAAAA.o
--start-group
  -lgcc
  -lgcc_eh
  -lc
--end-group

先ほどの結果と比べるとcrt何とかが全部消えましたが、-lgccなどは健在です。Cライブラリ関数は使えますが、crt何とかが呼んでくれていたmainが呼ばれなくなります。代わりに _startという関数を定義せよと言われます。

gcc -static -nostdlibの場合
AAAAA.o

暗黙のうちにリンクされるオブジェクトやライブラリが全てなくなりました。printfのようなCライブラリ関数も使えなくなります。

編集者:すずき(2023/09/24 11:45)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年10月11日

freestandingとnostdlib

目次: 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() 関数の呼び出しとしてコンパイルされます。したがって、

freestanding環境、nostdlibでのコンパイル、リンク結果
$ 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') に置き換えた方が良いね!という最適化が働きます。したがって、

hosted環境、nostdlibでのコンパイル、リンク結果
$ 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だけの方が実行速度などで有利だと思われます。

編集者:すずき(2023/09/24 11:44)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年10月10日

Might and Magic Book One TASタイム短縮の記録

目次: 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版では、

  • 無駄にエルキューンに寄っていた箇所を削った
  • 2人パーティーにした(オーラ関連のクエストが短くなる)
  • メッセージスキップする個所を増やした

次の18m43s版では、

  • 1人パーティーにした
  • コリンブルッフ洞穴 → ソーピガルの町の地下に直接飛ぶようにした(町を経由する必要がない)
  • A4エリアのテレポートをやめた(歩きの方が早い)
  • 魔法の砦のテレポートを2回減らした(歩きの方が早い)

これ以上を目指すなら、劇的にルート改善するか、メインクエストを飛ばすようなバグがないと厳しそうです。

失敗の記録

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/11/08 23:42)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年10月9日

Might and Magic Book Oneのエンカウント処理が半々でわかった

目次: Might and Magicファミコン版

引き続きMight and Magic TAS動画に挑んでいます。前回書いた通り、町以外のMAPではエンカウント判定用のカウンタ変化量が予測できません。しかしコントローラ入力後だけは、カウンタの変化量が必ず0もしくは1になることに気づきました。これを利用し、町以外のMAPのエンカウントが50%の確率で予想できるようになりました。

残念ながら今の知識ではエンカウント予想を100%にはできなさそうです。Might and Magicはキー入力チェックと画面更新が全く同期しないので、フレーム単位(=画面更新)しか動くタイミングがないTASのツールだと、うまく挙動が推定できません。技術的にはモヤっとしますが、動画を作る分にはこれでも十分です。

地上エリアA1やA2のように、歩きだと脱出に時間が掛かるMAPで「わざとエンカウント+逃げる」手段を使えるようになったので、格段に早く脱出できるようになりました。

他にも細かい点を更新して3分くらいタイムを更新し、20分28秒になりました。

謎のメッセージスキップ判定

メッセージスキップも、未だに仕組みは良くわからないものの、

  • A, Bボタンを1フレームごとに交互に連打
  • 24フレーム(=メッセージが開ききる時間)スキップできないなら、巻き戻す
  • 連打開始タイミングを1フレームずつ遅れさせてスキップできるか試す

とすると、比較的メッセージスキップが実現しやすいことが判明しました。

改善点の解説

もはや興味のある人はいないと思うので、自分向けのメモです。改善点は下記のとおりです。

  • 地上エリアA1, A2で「わざとエンカウント+逃げる」を使い高速に脱出
  • GEMを「ようせい」ではなく、コリンブルッフ洞穴で調達
  • テレポート回数を減らした(ダイヤのかぎ1つで済ませるため)
  • できるだけメッセージスキップした

TASなら戦闘結果も制御してなんぼだろ!?というご指摘はごもっともですけど、どうも良い乱数が引けず、極端に時間が掛かったり、ドロップアイテムのGEMが足りなくて詰んでしまったり、うまく行かないことが多いです。TASですら戦闘が鬼門なの?このゲーム……??

再現性が不安定すぎるので戦闘をルートから外し、GEMはコリンブルッフ洞穴で拾うことにしました。これでだいぶ安定します。動画をアップロードしてから気づきましたが、5人パーティになっていますが、戦闘しないならメンバーは2人でも良かったかな。うーん、まあいいか。

編集者:すずき(2021/11/08 23:41)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年10月8日

初めての6502アセンブラに挑戦

目次: Might and Magicファミコン版

引き続きMight and Magic TAS動画に挑んでいます。クリアタイムを縮めるには「わざとエンカウントして逃げる」「メッセージスキップ」の2点がほしいですが、メモリダンプを見ていても全く発生条件がわかりません。仕方ないのでファミコンのCPU 6502のアセンブラを読んでいます。もはやリバースエンジニアリングです。

命令が非常にシンプルで、レジスタ幅は8bit、レジスタ数はA, X, Yの3つしかありません。読んでいる分には面白いですが、これでソフト書くことを想像すると辛いです。昔の人はこんなん書いてたのかあ……。ま、それはさておいて、プログラムの解析を行った結果、エンカウントのルールが「半分だけ」分かりました。

基本
  • コントローラの状態を得るごとにカウンタが増減(アドレス0x523はデクリメント、0x524はインクリメントされる)
  • キー入力でもカウンタの初期値が大きく変更される
  • 移動用のキー入力(上下左右 とB)した「次のフレーム」でエンカウント判定
町の場合
256フレームでカウンタが1周(逆に言えば256フレーム以内にエンカウントチャンスがないなら、初期値変更の操作を入れる必要あり)

カウントの条件判定関数(アドレス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フレーム)ので、困りましたね。

編集者:すずき(2021/11/03 10:20)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年10月7日

Might and Magic Book Oneのメインクエスト紹介

目次: Might and Magicファミコン版

ファミコン版Might and Magic Book Oneにはたくさんのクエストがありますが、クリアに必要なクエストはさほど多くありません。図示するとこんな感じです。


クエスト、アイテムの依存関係

なお、ファミコン版Might and Magic Book Oneの情報は、マイトアンドマジック1攻略情報 さんが非常に参考になります。地図がめっちゃ見やすいです。

メインクエスト紹介(手紙、兄弟、真のアラマー王)

クエストの位置など詳しい情報は攻略情報さんを見ていただくとして、下記ではTASで使った攻略ルートを簡単に説明します。

盗賊への転職
ソーピガルの町の [X: 2, Y: 13] にあるギルドに行って盗賊に転職します。Lv.1クリアには盗賊が必須です。盗賊以外を選ぶと扉の鍵が解除できなくて進めなくなります。Might and Magicはさ、どうぞどうぞ、と投げ出されたイベントアイテムにすら罠が仕掛けてある鬼畜仕様のため、アイテム拾うだけで盗賊が必須です。
ソーピガルからの脱出
ソーピガル → ソーピガル地下 [14, 0] → ノーザンバリアー洞穴 → 地上エリアC2の経路で移動し、町の外に出ます。ソーピガルの町の出口から出たいところですが、Lv.1で出口に行くと衛兵に「未熟者」と言われて追い返され、ソーピガルの町から出してくれません。
アイスプリンセスのクエスト(ダイヤの鍵)
C2 → C1 → B1 → B2の経路で移動し、[4, 4] にいるアイスプリンセスの問いに答えると、革袋がもらえて、中にダイヤの鍵が入っています。このクエストだけ、なぜか「さがす」必要はありません。ダイヤの鍵はテレポート20回分の魔法が込められていて、とても便利な移動手段です。C2 → B2は近道に見えますが、残念ながらアイスプリンセスに辿り着く道がありません。
GEMの入手
B2 → B3 → コリンブルッフ洞穴にいき、ダイヤの鍵を使ったテレポートで宝箱([1, 1] [0, 3] [1, 5] のどれでもOK)の真上に飛びます。アイテムはクリアに不要ですが、一緒に手に入るGEMは後で使います。GEMもクリア時間短縮に欠かせない存在です。
手紙のクエスト(手紙 その1)
コリンブルッフ洞穴 → ソーピガル地下 [1, 2] へ行きコーラックからクエストを受けます。エルキューンのアガールに手紙を渡してくれと言われます。
手紙のクエスト(手紙 その2)
ソーピガル地下 → ソーピガル →(転送)→ エルキューンの経路で移動します。転送というのは、ソーピガル [11, 3] にいるおじさんのこと(GEM 1個でどの町でも送ってくれる)です。宿屋の奥 [4, 3] にいるアガールに手紙を渡すと、別の手紙を渡されてダスクのテルゴランに渡してくれと言われます。
オーラのクエスト
エルキューン → B1 → C1 → C2 → ソーピガルの経路で移動します。道すがら別のクエストを進めます。
  • C2 [8, 8]: 占いオババと会いオーラの色を調べます。後のクエストで聞かれる(さんごの鍵)のでメモをお忘れなきよう。
手紙のクエスト
ソーピガル →(転送)→ ダスクの経路で移動します。テルゴランは迷路の先 [8, 0] にいます。この町はテレポート無効なので、地道に歩きましょう。テルゴランに手紙を渡すとアルガリーのゾム、ポートスミスのザムの兄弟に会ってくれと言われます。
兄弟のクエスト
ダスク → ダスクの地下 → ソーピガル →(転送)→ アルガリー → ポートスミスの経路で移動し、兄弟に会います。歩いて会おうとすると大量の強制エンカウントで時間が掛かるので、テレポートで全部飛ばします。ゾムザム兄弟はどちらが先でも良いですが、ポートスミス → アルガリーだとポータルもなく移動も辛いので、アルガリー → ポートスミスがおススメです。
  • アルガリー [1, 1]: ゾム
  • ポートスミス [12, 2]: ザム
市民のパスポート、兄弟のクエスト(ルビーの笛)
ポートスミス → B3 → B2 → B1 → C1の経路で移動します。C1 [7, 7] でゴールデンバウムという金ぴかの木を見て、ゾムザム兄弟の伝言通りに歩き [15, 15] へ行くと、ルビーの笛が沸いてきます。基本的に「さがす」しないとモノが手に入らないゲームですが、このクエストだけ「さがす」をする必要がありません。変なクエスト……。
  • C1 [5, 7]: 市民のパスポート(城に入るために必要)を取る、馬車を調べるか?に「はい」、その後「さがす」です。
  • C1 [7, 7], [15, 15]: ゴールデンバウムとルビーの笛です。
フック付きロープ
C1 → C2 → ソーピガルの経路で移動し、店で「フック付きロープ」を10Gで買います。ソーピガル以外にも売っていますので、ソーピガル以外でも構いません。デューム城で使うので、その前に買っておいてください。
真のアラマー王のクエスト(金の鍵)
ソーピガル →(転送)→ ポートスミス → B3 → 魔法の砦の経路で移動し、魔法の砦B2の [3, 4] にいる犬の像まで行きます。テレポート活用が吉です。犬の像と話した後に「さがす」と金の鍵が拾えます。デューム城で使います。
真のアラマー王のクエスト(貴族のパスポート)
B3 → B2 → A2の経路で移動し、迷路の奥 [0, 15] にいるドルイドのパルセラの問いに「はい」と答えた後に「さがす」と貴族のパスポートが拾えます。アラマー城で使います。エリアA2はテレポートが使えないので地道に歩きましょう。
真のアラマー王のクエスト(ゴロスのめだま)
A2 → B2 → B1 → A1 → デューム城の石垣 → デューム城内部の経路で移動します。エリアA1もテレポートが使えないので、地道に歩きますが、迷路がクッソ長くて辛いです。
  • A1 [7, 14]: デューム城の石垣、内部への入り口です。
  • デューム城 [8, 5] [6, 6] [7, 10]: 壁の外に押し戻される罠(三カ所)、フック付きロープで飛び越えましょう。
  • デューム城 [7, 7]: 金の鍵を持たずに行くと扉に吹き飛ばされます。
  • デューム城 [7, 8]: 真のアラマー王と話した後「さがす」と「ゴロスのめだま」を拾えます。
ニセのアラマー王の正体クエスト
デューム城 → A1 → B1 → C1 → C2 → ソーピガル →(転送)→ ダスク → E1 → E2 → E3 → アラマー城の経路で移動します。アラマー城に入るにはハレーショにパスワードを聞いて、ライオンのレリーフに答える必要がありますが、テレポートで全て無視して入り口 [14, 7] に直行できます。必要なアイテムを所持していればニセのアラマー王に「正体を見破ったな」と言われ、イドの迷宮に飛ばされます。
  • 市民のパスポート: 持たずに入り口に行くと、衛兵に追い返されます。
  • 貴族のパスポート: 持たずに王の部屋の前に行くと、衛兵に追い返されます。
  • ゴロスのめだま: 持たずにニセのアラマー王に会うと、クリア不能クエストを押し付けられます(僧侶の「ちゅうし」でキャンセルするしかない)
イドの迷宮
英語版だとSoul Mazeですが、日本語版は「イドの迷宮」という全然違う名前で、ニセのアラマー王のセリフ「ソウルメイズの地に監禁」が意味不明に見えます。訳を間違ったのかなあ……?本来はマッピングしてパスワードを知ります。「いちをしる」魔法が使えないため、マッピングの難易度は高いです。しかしパスワードは固定なので正解を知っていれば瞬殺です。クリア後はソーピガルに戻されます。

以上がMight and Magicの世界に起こった事件と、その謎に迫るメインクエストを超スピード解決する手順となります。初めてプレイする方がこの手順でクリアすると、たぶん訳が分からないと思います。

お時間がある方は、攻略サイトを見ながらでも構わないので、金の板や町のヒント、囚人たちなどに出会い話すと、しっかり作られた世界感が味わえると思います。

メインクエスト紹介(オーラ、アストラル世界)

もう一つのメインクエストの流れです。オーラのクエストは、ストーリーにはあまり関係ないです。ラストダンジョンの歯ごたえを増すためのクエストという感じです。アストラル世界は全てのストーリーの終着点で、ああ、そういうことだったんだ!と思うはずです。

オーラのクエスト(さんごの鍵)
ソーピガル → ポートスミス → B3 → B4 → A4の経路で移動します。[4, 6] にいる老人に、各キャラクターのオーラの色を答えます。オーラはエリアC2の占いオババに教えてもらった色です。正解すると [4, 2] に飛ばされるので、その場で旋回(移動しちゃダメ)、「さがす」で「さんごの鍵」を拾えます。
オーラのクエスト(金色のオーラ)
A4 → B4 → C4の経路で移動します。先頭のキャラクターにさんごの鍵を持たせて [7, 2] で南を向くと、ボルカノ神殿に入れます。ボルカノ神殿 [7, 11] の火山の神に「なぞ」を出してもらって、答えると「金色のオーラ」にしてもらえます。ボルカノ神殿の入り口のある島は、テレポートで入れますが、テレポートで出ることはできません。注意。
オーラのクエスト(キーカード)
C4 → B4 → A4の経路で移動します。[4, 6] にいる老人に会うと、また [4, 2] に飛ばされるので、その場で旋回、「さがす」で「キーカード」を拾えます。
アストラル世界
ゴロスのめだまを使ってアストラル世界に飛びます。壁がほぼすべて透明のバリアで構成されている鬼畜が考えたダンジョンです。迷ってしまったら敵から逃げれば、かならずスタート地点の [7, 0] に戻れるので、敵を倒すばかりでなくうまく使いましょう。
  • 5カ所の封印: [4, 6] [4, 10] [7, 14] [10, 10] [10, 6] にある封印を解除します。解除するたびに敵が出ます。
  • [7, 10]: ドア、キーカードで開きます。
  • [7, 8]: 「やすむ」と次に進みます。イドの迷宮をクリアしている必要があります。
  • [6, 7]: コーラックがいて、世界の果てに行けと言われ、ソーピガルに戻されます。
世界の果て
ソーピガル →(転送)→ エルキューン → B1の経路で移動します。[4, 15] にある世界の果てに行くとゲームクリアです。最後にBook Twoに続く!と出ますが、Book Twoはファミコンでは発売されませんでした。悲しい。スーパーファミコン版が発売されているようです。

この他にも諸侯のクエスト、全く関係ないクエストなど、たくさんありますので、ぜひ遊んでみてください。全体的に良くできたゲームシステムだと思うんですけど、難易度の高さ(敵が強すぎる……)に、挫けそうになるのがイケてないポイントではあります。

編集者:すずき(2022/04/04 05:52)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年10月6日

Might and Magic Book Oneで初めてのTASに挑戦

目次: Might and Magicファミコン版

子ども時代のトラウマ難易度ゲームMight and Magic Book Oneに、大人になってから挑みましたが、変わらず撃沈しました。やっぱり難しいです。でもエミュレータなら、Lv.1で最速クリアする動画を作れるんです。いわゆるTAS(Tool Assisted Speed-run)動画です。

TASするにあたっては、定番のBizHawkというエミュレータを使います。ROMをロードしてTool - TAStudioを選ぶと、フレーム単位でキー入力を選べる画面が出現します。


BizHawk TAStudio

操作に自信があるならRecording modeを使って自分の操作を記録し、あとでファインチューンすると良いでしょう。私は操作にあまり自信がなかったので、1フレームずつチマチマとマウスで入力しました。

TAS第一弾

とりあえずエンディングまで辿り着いたので、YouTubeにもアップロード([TAS] NES Might and Magic Book One (J) 23:30 - YouTube)しました。YouTubeのアップロード側機能は初めて使いましたが、とても使いやすいですね。

TASとしてのクオリティはあまり良くないです。攻略ルートがかなり適当で、これより早くクリアできる動画は簡単に作れると思います。容易に改善できそうなところは、

  • メッセージスキップしてない(スキップ条件が良くわからなかった)
  • 「ようせい」との戦闘に2ターン掛けてる
  • 「ガラドリエルのめぐみ」取りに行くのが無駄(Gemは「ようせい」が落とした7つで足りてた)
  • ダスクの町の店で物を売る必要がない(金は足りてる)
  • 地上エリアA2(火山地帯)からの脱出が遅い
  • 「さんごのかぎ」の受け渡しが無駄(先頭の人が持てるルートに変えた方が良い)
  • 5人もパーティーに入れている

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)です!超早ですね。

英語版はアイテムを別のアイテムに化けさせるバグがあって、そのバグを突くとゴミから終盤のクエストでもらえるはずのアイテムを錬成でき、ほぼ全てのクエストを無視してラストダンジョンに挑めます。

日本語版ではバグが修正されているほか、クエストの仕様も違うため、少なくとも同じ攻略法ではクリアできません。

編集者:すずき(2021/11/08 23:40)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年10月5日

久しぶりにファミコンのMight and Magic Book Oneをやってみたい

目次: 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購入

早速、中古のカセットを購入しました。外観は割とズタボロというか、年季入った姿です。ま、動けば良いのさ。


ファミコン版Might and Magic Book Oneのカセット

GAKKENのロゴの通り、なぜか日本語ローカライズは学習研究社(学研)が行っています。今見ると不思議です。教科書作ってる学研が、なぜゲームの移植を……。


レトロダンパーにカセットを挿した状態

レトロダンパーさんで吸い出すときはこんな感じになります。吸い出したROMをエミュレータに放り込んでみたところ、正常に動作しているようです。良きかな良きかな。

ゲームの感想

まずは普通に遊んでみました。今なら意外とクリアできるのでは?と思ったのも束の間、あっ、無理でした。調子乗ってすみませんでした。在りし日の絶望が蘇りました。

  • 攻撃がほぼ当たらない
  • 敵から逃げられない
  • Lv2が果てしなく遠い
  • 罠解除役(盗賊)が宝箱の罠に掛かる
  • パーティーがすぐ全滅、タイトルに戻される

最初から難しすぎます。基本的には1バトルごとに休憩+セーブって感じです。攻撃が当たらないのも辛く、一方的にボコられて死んでしまいます。死んだら復活させるお金がないのでリセットです。

さらにWikipediaを見てびっくりしたのは、次の一文です。
「ファミコン版は(中略)やや簡単に調整された部分が多い」
えっ?これで?嘘だろ……??オリジナル版はどれだけ鬼畜難易度なの?

息抜きにYouTubeで攻略動画を見ていると、ラストダンジョン(イドの迷宮、アストラル世界)の音楽がとてもカッコ良いですね。何とか辿り着きたいですが、最初の町(ソーピガルの町)から脱出できていない身からすると、果てしなく遠いです。

編集者:すずき(2021/11/08 23:39)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年10月4日

Might and Magicファミコン版 - まとめリンク

目次: Might and Magicファミコン版

TASに挑んだ記録。

解析したときの情報。その他。

リンク集

Might and Magicの攻略、解析の参考になるサイトです。

編集者:すずき(2024/03/26 03:14)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2021年10月15日 >>> 2021年10月2日
link もっと後

管理用メニュー

link 記事を新規作成

<2021>
<<<10>>>
-----12
3456789
10111213141516
17181920212223
24252627282930
31------

最近のコメント5件

  • link 21年9月20日
    すずきさん (11/19 01:04)
    「It was my pleasure.」
  • link 21年9月20日
    whtさん (11/17 23:41)
    「This blog solves my ...」
  • link 24年10月1日
    すずきさん (10/06 03:41)
    「xrdpで十分動作しているので、Wayl...」
  • link 24年10月1日
    hdkさん (10/03 19:05)
    「GNOMEをお使いでしたら今はWayla...」
  • link 24年10月1日
    すずきさん (10/03 10:12)
    「私は逆にVNCサーバーに繋ぐ使い方をした...」

最近の記事3件

  • link 23年4月10日
    すずき (11/15 23:48)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 24年11月6日
    すずき (11/15 23:47)
    「[Ubuntu 24.04 LTS on ThinkPad X1 Carbon Gen 12] 目次: Linux会社ではTh...」
  • link 24年11月11日
    すずき (11/15 23:26)
    「[Pythonのテストフレームワーク] 目次: Python最近Pythonを触ることが増えたのでテストについて調べようと思い...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 11/19 01:04