コグノスケ


2021年 12月 2日

Might and Magic Book One TAS 最後の更新 2

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

Might and Magic の TAS はもうやらんと言いましたが、少しだけやってます。

会社に向かって歩いているときに「もしかしてあの部分は飛ばせるんじゃね?」と思いついたアイデアを試したところ、合計で 298フレーム(4.8秒くらい)速い、14分 06秒になりました。ニコニコ動画にも載せておきました(【TAS】FC版 Might and Magic Book One 14分06秒 マップ付き)。

更新箇所は下記のとおりです。

  • エルキューン、アガールに会わずに脱出: 98フレーム
  • ダスク、幽霊を無視: 68フレーム
  • ダスク、テルゴランの依頼に「いいえ」: 83フレーム
  • ポートスミス、ザムに会った後に即エンカウント: 43フレーム

ダスクの交差点にいる幽霊を無視すると、敵と強制エンカウントすると思いこんでいたのですが、実はそんなことはありませんでした。直進ならエンカウントしません(旋回するとエンカウントします)。確認は大事ですね。

正直に言って 2番目と 3番目以外は期待していませんでしたが、どれも 0.8〜1.5秒程度の短縮と、良い方向に予想を裏切ってくれました。特にエルキューンでアガールをすっ飛ばすのは予想外の効き目でした。

もう短縮できそうなところは思いつきません。このルートで 14分切るのは無理かなあ。

編集者: すずき(更新: 2021年 12月 4日 03:42)

コメント一覧

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



2021年 12月 4日

Might and Magic のメッセージスキップ処理のタイミング

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

Might and Magic のメッセージスキップについて動作を軽く調べたところ、変な実装になっており超厳しいタイミングを要求されることがわかりました。

メッセージ表示をしているコードは 0x9AAE〜0x9B09 です(たぶん。表示処理は詳しく見てない)。この処理を実行しているときは ROM 0x16000 が 0x8000 にマップされているので、ROM のアドレスでいうと 0x16000 + 0x1AAE = 0x17AAE〜 に該当します。このコードの中でスキップ判定をしているのは 0x9AF7 です。

メッセージ表示処理

9AAE :	20 B4 E3	JSR	$E3B4	;
9AB1 :	A9 00		LDA	#$00	;
9AB3 :	8D 73 03	STA	$0373	;
9AB6 :	A2 00		LDX	#$00	;
9AB8 :	8A		TXA		;
9AB9 :	48		PHA		;
9ABA :	20 49 9B	JSR	$9B49	;
9ABD :	20 48 9A	JSR	$9A48	;
9AC0 :	68		PLA		;
9AC1 :	AA		TAX		;
9AC2 :	BD 20 9B	LDA	$9B20,X	;
9AC5 :	85 7B		STA	$7B	;
9AC7 :	8A		TXA		;
9AC8 :	48		PHA		;
9AC9 :	0A		ASL	A	;
9ACA :	AA		TAX		;
9ACB :	BD 0A 9B	LDA	$9B0A,X	;
9ACE :	85 00		STA	$00	;
9AD0 :	BD 0B 9B	LDA	$9B0B,X	;
9AD3 :	85 01		STA	$01	;
9AD5 :	A5 00		LDA	$00	;
9AD7 :	48		PHA		;
9AD8 :	A5 01		LDA	$01	;
9ADA :	48		PHA		;
9ADB :	20 5F 9A	JSR	$9A5F	;
9ADE :	68		PLA		;
9ADF :	85 01		STA	$01	;
9AE1 :	68		PLA		;
9AE2 :	85 00		STA	$00	;
9AE4 :	20 7F 9A	JSR	$9A7F	;
9AE7 :	20 48 9A	JSR	$9A48	;
9AEA :	68		PLA		;
9AEB :	48		PHA		;
9AEC :	85 7B		STA	$7B	;
9AEE :	A9 0B		LDA	#$0B	;
9AF0 :	38		SEC		;
9AF1 :	E5 7B		SBC	$7B	;
9AF3 :	AA		TAX		;
9AF4 :	20 C2 9C	JSR	$9CC2	; コントローラの状態確認
9AF7 :	AD 73 03	LDA	$0373	; メッセージスキップの条件判定
9AFA :	C9 01		CMP	#$01	;
9AFC :	D0 04		BNE	$9B02	;
9AFE :	68		PLA		; メッセージスキップ発動
9AFF :	4C 09 9B	JMP	$9B09	;
9B02 :	68		PLA		; メッセージスキップ発動せず
9B03 :	AA		TAX		;
9B04 :	E8		INX		;
9B05 :	E0 0B		CPX	#$0B	;
9B07 :	D0 AF		BNE	$9AB8	;
9B09 :	60		RTS		;

最後の方で関数 0x9CC2 → 0x9D14 → 0x9B2B と call し、変数 0x0373(コントローラ状態変更フラグ)が 0 以外ならメッセージスキップします。後ろから見ていきましょうか。

コントローラ状態を確認する関数 0x9B2B

9B2B :	A9 00		LDA	#$00	;
9B2D :	8D 73 03	STA	$0373	;
9B30 :	20 C5 E7	JSR	$E7C5	; コントローラの状態チェック関数、結果は $0200 に格納される
9B33 :	AD 00 02	LDA	$0200	;
9B36 :	CD 01 02	CMP	$0201	;
9B39 :	F0 0D		BEQ	$9B48	; 前回と状態が変わっているか?
9B3B :	8D 01 02	STA	$0201	; 変わっているなら、変数 $0201 に状態を保存
9B3E :	AD 00 02	LDA	$0200	;
9B41 :	F0 05		BEQ	$9B48	; 状態が 0 以外(=何か 1つでもキーが押されている)か?
9B43 :	A9 01		LDA	#$01	; 押されているなら、変数 $0373 に 1 を設定
9B45 :	8D 73 03	STA	$0373	;
9B48 :	60		RTS		;

関数 0x9B2B は現在のコントローラの状態と、保存していた前回のコントローラの状態を比較し、変化していたら変数 0x0373 に非 0 の値をセットする関数です。推測するに、プレイヤーがボタンを押したら変数 0x0373 がセットされ、メッセージスキップが発動する……はずだったのでしょう。

ところが関数 0x9D14 の実装が完全におかしくて、画面描画が 1回終わる(※)まで、関数 0x9B2B を「何度もビジーループで呼ぶ」のです。

画面描画を待つ関数 0x9D14

9D14 :	8D 64 02	STA	$0264	;
9D17 :	A9 C0		LDA	#$C0	;
9D19 :	8D 51 61	STA	$6151	;
9D1C :	20 2B 9B	JSR	$9B2B	; ↓このループが全力で回りまくる
9D1F :	AD 51 61	LDA	$6151	;
9D22 :	D0 F8		BNE	$9D1C	; ↑
9D24 :	60		RTS		;

短期間に関数 0x9B2B を繰り返し呼ぶとどうなるかというとですね。プレイヤーがコントローラのキーを押して変数 0x0373 がセットされても、次の呼び出しですぐに「前の状態と変化ナシ!」と判定し、変数 0x0373 がクリアされてしまい、キーは押されていなかった扱いになるわけです。ええー……なにこの実装。

(※)VBlank NMI を契機に画面描画され、変数 0x6151 に 0 がセットされます。

メッセージスキップの発動条件

最速でメッセージスキップを発動させようとすると、プレイヤーは下記の条件を満たす刹那の間にキーを押す必要があります。

  • 関数 0x9B2B
  • 関数 0x9B2B(この処理が終わった後から)
  • 関数 0x9B2B(この処理が始まる前まで)
  • 画面描画

トレースログで測ったところ入力の猶予は 1,055 クロック、ファミコンの 6502 は 1.79MHz 駆動らしいので、わずか 0.589ms です。短すぎだよ!!

TAS の経験から 1フレーム(16.667ms)未満だろうとは思いましたけども、まさかのサブミリ秒でした……。道理で、フレーム単位入力の TAS では最速のメッセージスキップができないわけです。人間ならなおさら無理ですね。このタイミングを毎回狙って押せるやつは 100%人間辞めてます。

以上は最速のタイミングを狙って発動させようとした場合の話であり、メッセージスキップを拝むこと自体は割と簡単です。なぜならキーを「押す」タイミングは非常に厳しいものの、他の条件は厳しくないからです。救いの手は 2つ、

  • 毎フレーム判定が行われる
  • キーを「離す」タイミングは 30フレームくらいと猶予が大きい

ですから適当にキーをガチャガチャ連打していれば、たまに条件に該当してメッセージスキップが発動します。

編集者: すずき(更新: 2021年 12月 4日 12:43)

コメント一覧

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



2021年 12月 17日

呼び込み君ミニ

以前予約していた、呼び込み君ミニが届きました。発売は青島(青島文化教材社、公式サイトへのリンク)です。模型をやっている人なら馴染みの名前かと思います。

これは何かというと、スーパーで良く聞く「ポポーポ、ポポポ……」という曲を流してる「呼び込み君」の模型です。「呼び込み君」は群馬電機(公式サイトへのリンク)の販売している、音声 POP と呼ばれる広告用の機械の名前です。

パッケージはこんな感じでした。


呼び込み君ミニ、パッケージ

本物の呼び込み君は 20cm くらいあって割とデカいですが「呼び込み君ミニ」は 5cm くらいでかなりコンパクトです。本物同様、付属品で顔の部分を POP に交換できるようになっています。さすがに光りはしませんが……。


呼び込み君ミニ、付属品

音もちゃんと鳴ります。早速鳴らしてみると、思っていたより 3倍くらい音がでかくて驚きました。夜中に鳴らすと近所迷惑かも?というレベルです……。

編集者: すずき(更新: 2021年 12月 29日 21:26)

コメント一覧

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



2021年 12月 21日

Might and Magic Book One TAS 最後の更新 3(右に回れ)

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

Might and Magic の TAS をちょっとだけ更新しました。記録更新に挑んだと言うより実験に近いかも。一応 2秒くらい短くなっています。ニコニコ動画にも載せておきました(【TAS】FC版 Might and Magic Book One 14分04秒 マップ付き)。

更新内容は端的に言うと「右に回れ」です。このゲームは、なぜか「左に回る」より「右に回る」方が 1フレームくらい速いことが多いです。TAS に取り込んでみたところ、確かに速くなりました。ただ、残念ながら速くなる理由は良くわかっていません。普通、左だろうが右だろうが、処理変えませんよね?どういう実装したらこうなるのかね?

Might and Magic に限りませんが、ファミコンのゲームは描画とゲーム処理が非同期だったり、描画と無関係に入力を見続けたり、変な作りのゲームが珍しくないみたいです。そのせいか、入力に対してカオス的というか……、失礼な言い方をすればかなり「挙動不審」なんですよね……。

編集者: すずき(更新: 2021年 12月 23日 00:48)

コメント一覧

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



2021年 12月 23日

GL10P の SIM ロック解除(思い出)

懐かしい画面キャプチャが出てきたので供養しておきます。

だいぶ昔になりますが、イーモバイルの WiFi ルーター Huawei GL10P を買いました。イーモバイルの契約は 5年前(2016年 11月 27日の日記参照)に解約してしまったので、GL10P だけが寂しく残っている状態でした。

といってもモバイル WiFi ルーターはほとんど使わないので、イーモバイル(今はワイモバイルでしたっけ?)を再契約するほどでもありません。

とりあえず何か通信さえできれば良いので、今は b-mobile の格安 SIM(ドコモ回線)を入れています。ただしこの時代のイーモバイルの WiFi ルーターは SIM ロックが掛かっているので、SIM ロックを解除する必要があります。SIM ロック解除には解除コードが必要(コードを知る方法はググると出てきます)です。以降、コードは既にわかっているものとします。

GL10P に WiFi で接続して、パスワード admin でログインします。おそらく下記のような画面が出ているはずです。


SIM ロックが掛かっている状態

このページには SIM ロック解除コードが隠れているので、DOM インスペクタなどで入力欄を表示させます。


実は SIM ロック解除コードを入力する欄が隠れている

追加のツール等は不要な親切設計となっていて、ありがたい限りです。Huawei が意図して提供した機能か、デバッグ用の機能が紛れ込んだのか、どちらなのか知りませんけども……。

編集者: すずき(更新: 2021年 12月 24日 01:54)

コメント一覧

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



2021年 12月 24日

サンタがマッハ 2で街にやってくる

飛行機の位置をリアルタイムに表示する Flightradar24 というサービス(サイトへのリンク)があります。飛行機やヘリコプターが発する ADS-B という信号を、世界中の有志が受信して、Flightradar24 のサーバーに送ることで実現しているそうです。へえ〜。

仕組みはさておいて、このサービスではクリスマス・イブの日にはサンタが出現する毎年恒例のお約束演出があります。夜にサンタの飛んでいる様をボーっと眺めていました。

マレーシア上空をインド方面に飛んでいましたが、どうも移動速度が速いような気がしてなりません。表示上は 40ノット(時速 74.8km/h)となっています。しかしマレーシアをあっさりと横断して、インド洋に抜けており、そんなゆっくり飛んでいるように見えません。

サンタの対地速度

サイトの速度表示は無視して、2地点間の距離で速度を測ってみました。


20:27:14 時点の位置(緯度 9.99903度、経度 93.3008度)


20:27:41 時点の位置(緯度 10.1382度、経度 93.2107度)

緯度、経度から距離を出すときは、地球の形状(赤道方向がやや長い、楕円形)を考慮したりで割と面倒らしいんですが、国土地理院のページを使うと一発で計算してくれて超便利です(サイトへのリンク)。


緯度、経度から距離と方位角を計算(国土地理院のサイト)

2地点間の距離は約 19.1km で、時間差は 27秒なので、対地速度は約 2,546km/h です。地上で言うところのマッハ 2くらい(ただし、上空 34,000fts だとマッハ数はもっと高く出る)です。旅客ジェット機は対地速度 800km/h くらい(マッハ 〜0.8 程度)なので、ジェット機の 2〜3倍速です。

戦闘機の巡航速度がマッハ 1くらいで、アフターバーナーでマッハ 2超えるくらいらしいので、サンタさんめっちゃ速いやん……。戦闘機とやりあう気かよ??

編集者: すずき(更新: 2021年 12月 29日 21:13)

コメント一覧

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



2021年 12月 26日

DUNGEON ENCOUNTERS クリア

目次: DUNGEON ENCOUNTERS - まとめリンク

ダンジョンエンカウンターズ、やっと最後まで行きました。謎解きはまじめにやらず、攻略サイトを見てしまいました。難しいというか……正解を見ても「無茶言うなよ」って感じの問題です。攻略サイト作っている人たちはどうやって解いたんでしょうね……?

ラスボス 1

地下 90階にいるラスボスを倒して 1回目のスタッフロールを拝むのはそんなに難しくありません。とはいえ、強いのは確かです。特に 2回目の戦闘(パノプティコア A, B, C, D)は、何も考えずに突っ込むとパーティーが蒸発します。ラスボスを無視して、地下 99階までの謎解きアイテムとアビリティを全部拾ってから改めて挑むと比較的楽だと思います。アビリティ「テレポ」と「ノーエンカウント」を拾うと回収が捗ります。

  • 武器: アドレスブレイド(単体物理、アドレス依存ダメージ)
  • 武器: ジャベリン(全体物理 375,000)
  • 武器: トウルヌソル(単体物理 100,000)
  • アビリティ: 防御系全部、HP満タン攻撃力倍、精神統一(飛行に剣や槍が当たる)

謎解きを済ませると、この辺の超強力な武器が全て揃うはずです。地下 90階以降の敵はアホみたいに攻撃力が高く、一撃で防御値がなくなることが多いため、防具を 1〜2段階強化してもほぼ意味がありません。スピードの落ちる重装備(ヘルム、鎧)より、スピード重視で軽装備(服、帽子)+ブーツにして、相手より早く殴って倒すようにすると良いでしょう。

  • ブーツ: コスト内で速度が一番上がるもの
  • 防具: コスト内で速度の落ちない軽装備、ただし裸は即死するので NG

パノプティコアは 1体だけ残すと「全ての力」という超強烈な攻撃をしてきて、メンバーが一瞬で蒸発するので、

  • HP が低い A を速攻で潰す
  • スピードの速い D をアドレスブレイドで殴りまくって潰す
  • 残ったノロマの B と C 2体をアドレスブレイドで殴り、HP はトウルヌソルで削る
  • 最後にジャベリンで 2体同時に倒す

こうすると比較的楽なはずです。

ラスボス 2

最下層の地下 99階にいるバトル FF「無限」というクッソ強い敵を倒すと 2回目のエンディングが拝めます。拾える武器だけでもうまくやれば倒せる気がするんですけど、私はやり方がうまくないのか、火力不足で勝てませんでした。

地下 98階辺りの、バトル F7 を集中的に選んで、ティアマット Lv.99 が落とすアドレスブレイドを 2本を拾うまで頑張ります。出てくる敵としては、

ティアマット Lv.99
メインターゲットです。スピード 80 で比較的行動が早いうえ、ほぼ確実に全体物理攻撃(咆哮: 割合ダメージなので雑魚、なぎ倒す: 超強烈で物理防御が一撃でなくなる)をしてきて超危険です。幽霊船の番が来ないなら、こいつを集中攻撃で潰しましょう。
幽霊船 Lv.99
スピード 85、飛行状態、高確率で全体物理攻撃(砲撃: 強烈な物理攻撃、恐怖: 確率で物理防御破壊)をしてくる危険な相手です。ですが幸いなことに HP 1 なので、「精神統一」アビリティ、全員を「物理武器+素手」にしておけば、素手パンチをお見舞いして確実に倒せます。ホクガクの刀攻撃も有効です。
ウィールワーター Lv.98
単体、全体魔法攻撃を使ってきますが、全体攻撃は半々くらいですかね。スピード 65 と遅く、攻撃頻度は低いです。先行で魔法攻撃を食らって魔法防御がなくなったとしても、次の攻撃を食らう前に、ジャベリンとアドレスブレイドの順が回ってきて確実になぎ倒せるはずです。

バトル F8 の方がティアマットが確実に出ますが、一気に 5体出てきて強力な全体物理攻撃を連発され、パーティーが一瞬で全滅する可能性が高く、面倒な相手です。バトル F7 を数こなす方が安定すると思います。

アドレスブレイドを揃えたら、地下 99階のなるべく南東のマスに「無限」を出現させます。装備は HP満タン攻撃力倍+スピード重視装備+アドレスブレイドで。アドレスブレイド持ちのキャラはとにかく殴り、防御が完全に剥がれたキャラやアドレスブレイドを持っていないキャラは防御回復を連打、これでたぶん倒せるはずです。

編集者: すずき(更新: 2022年 1月 12日 17:34)

コメント一覧

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



2021年 12月 27日

DUNGEON ENCOUNTERS 完全踏破

目次: DUNGEON ENCOUNTERS - まとめリンク

ダンジョンエンカウンターズ、全フロアを踏破しました。基本的には強敵を避けてウロウロ歩けば踏破できますし、アビリティ「ノーエンカウント」取得後は、落とし穴以外に恐れるものは存在せず、ほぼ塗り絵ゲームになります。ただし、地下 92階だけはかなり辛いです……。

魔の地下 92階

おそらく全員が「最も踏破に苦労する階は?」という質問に対して「地下 92階」と答えるでしょう。それくらい面倒くさい作りです。地下 92階は全て飛び地になっていて、一部は地下 93階から 02(上り階段)で行けますが、残りはほとんど目印がありません。マップの背景(宇宙みたいな赤と青のモヤモヤ)から、飛び地の座標に当たりを付け、アビリティ「仮想階段上り」で上る必要があります。

地下 92階から「仮想階段下り」で地下 93階に戻ると、いきなり落とし穴に落ちることがありますが、地下 94階で必ず受け止めてくれるので心配いりません。

しかし落ちた先の地下 94階や、地下 92階の小島でミスって落とし穴を踏むと「奈落の底に落ちてパーティーが全員行方不明」になることがあります。被害を最小限にするためにも、地下 92階は 1人パーティーで攻略した方が良いと思います。入り口となる地下 93階は常に一本道です。落とし穴回避のためアビリティ「ムーブ」「ナイトムーブ」、エンカウントマスも回避できないため「ノーエンカウント」もほぼ必須でしょう。

全部巡るのは非常に大変でしたが、下記の表で座標を全部メモできているはずです。

島の種類 島の広さ
02 階段上り 24116
02 階段上り 147220
02 階段上り 1513 4
02 階段上り 213416
02 階段上り 338716
02 階段上り 362012
02 階段上り 473416
02 階段上り 498316
02 階段上り 611020
02 階段上り 724316
02 階段上り 738316
02 階段上り 741520
02 階段上り 924116
02 階段上り 9488 9
Event 3F の島496025
Event FD の島8714 9
仮想階段上り 55420
仮想階段上り 973 4
仮想階段上り 108312
仮想階段上り 101916
仮想階段上り 145416
仮想階段上り 163012
仮想階段上り 178120
仮想階段上り 182612
仮想階段上り 193912
仮想階段上り 196312
仮想階段上り 244516
仮想階段上り 252020
仮想階段上り 275812
仮想階段上り 277520
仮想階段上り 29 615
仮想階段上り 302916
仮想階段上り 376512
仮想階段上り 3942 9
仮想階段上り 405020
仮想階段上り 419915
仮想階段上り 417920
仮想階段上り 5237 4
仮想階段上り 552020
仮想階段上り 584816
仮想階段上り 619416
仮想階段上り 63 012
仮想階段上り 671920
仮想階段上り 6832 6
仮想階段上り 687716
仮想階段上り 7092 9
仮想階段上り 716516
仮想階段上り 7750 9
仮想階段上り 798016
仮想階段上り 802720
仮想階段上り 8339 6
仮想階段上り 875920
仮想階段上り 896816
仮想階段上り 952520

サイトだと見づらいと思うので、Google スプレッドシートにも置きました(Google スプレッドシートへのリンク)。基本的には地下 93階の「曲がり角」で仮想階段を使う座標にしたはずです。間違ってたらゴメンなさい&コメントなどで教えてくれると嬉しいです。

攻略の途中で「この地下 92階は山勘でやってもクリア不可能じゃね?」と感じてメモを始めたため、踏破済みと未踏破が中途半端に混ざった状態からメモを始めることになりました。おかげで島の座標を全部列挙したかどうかの検証がめちゃくちゃ面倒くさかったです……。最初からメモすれば良かったよー。

真のラスボスは諦めた

「無限」より強いと思われるのが、バトル FD の「モルモット教授」という敵です。出会える確率が非常に低い、防御と HP が 9,999,999 の最強タフネス、驚異のスピード 130、数ターン耐えるのが限界の超強力な攻撃、と嫌な点の塊のような敵です。

幸い?なことにアイテムを何もドロップしませんから、倒す必要がありません。無視して OK です。ただただやり込みプレイを阻むためだけに用意された、嫌がらせのような敵です。

私もアドレスブレイド 3本とスピード重視装備で挑んでみましたけど、防御すら削りきれないうちに瞬殺されて心が折れました……。勝てる気がしません。もういいわ。

編集者: すずき(更新: 2022年 1月 12日 17:34)

コメント一覧

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



2021年 12月 28日

DUNGEON ENCOUNTERS - まとめリンク

目次: DUNGEON ENCOUNTERS - まとめリンク

日記が増えすぎて、一覧が欲しくなってきたので作りました。とは言ったものの、もう増える気がしない。

編集者: すずき(更新: 2022年 1月 12日 17:33)

コメント一覧

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



こんてんつ

open/close wiki
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 過去日記について

その他の情報

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