コグノスケ


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/04 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/04 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で街にやってくる(2021年)

目次: サンタ

飛行機の位置をリアルタイムに表示する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超えるくらいらしいので、サンタさんめっちゃ速いやん……。戦闘機とやりあう気かよ??

編集者:すずき(2024/01/04 03:18)

コメント一覧

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



2021年12月26日

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満タン攻撃力倍+スピード重視装備+アドレスブレイドで。アドレスブレイド持ちのキャラはとにかく殴り、防御が完全に剥がれたキャラやアドレスブレイドを持っていないキャラは防御回復を連打、これでたぶん倒せるはずです。

編集者:すずき(2023/09/24 13:06)

コメント一覧

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



2021年12月27日

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本とスピード重視装備で挑んでみましたけど、防御すら削りきれないうちに瞬殺されて心が折れました……。勝てる気がしません。もういいわ。

編集者:すずき(2023/09/24 13:06)

コメント一覧

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



2021年12月28日

ゲーム - まとめリンク

目次: ゲーム

一覧が欲しくなったので作りました。

鉄道シミュレーションゲーム、Transport Fever 2の話です。

駅シミュレーションゲーム、STATIONflowの話です。

ゲームプラットフォーム、Steamの話です。

編集者:すずき(2024/10/20 05:13)

コメント一覧

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



こんてんつ

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 サイトの情報