Might and MagicのTASはもうやらんと言いましたが、少しだけやってます。
会社に向かって歩いているときに「もしかしてあの部分は飛ばせるんじゃね?」と思いついたアイデアを試したところ、合計で298フレーム(4.8秒くらい)速い、14分06秒になりました。ニコニコ動画にも載せておきました(【TAS】FC版Might and Magic Book One 14分06秒 マップ付き)。
更新箇所は下記のとおりです。
ダスクの交差点にいる幽霊を無視すると、敵と強制エンカウントすると思いこんでいたのですが、実はそんなことはありませんでした。直進ならエンカウントしません(旋回するとエンカウントします)。確認は大事ですね。
正直に言って2番目と3番目以外は期待していませんでしたが、どれも0.8〜1.5秒程度の短縮と、良い方向に予想を裏切ってくれました。特にエルキューンでアガールをすっ飛ばすのは予想外の効き目でした。
もう短縮できそうなところは思いつきません。このルートで14分切るのは無理かなあ。
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以外ならメッセージスキップします。後ろから見ていきましょうか。
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を「何度もビジーループで呼ぶ」のです。
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がセットされます。
最速でメッセージスキップを発動させようとすると、プレイヤーは下記の条件を満たす刹那の間にキーを押す必要があります。
トレースログで測ったところ入力の猶予は1,055クロック、ファミコンの6502は1.79MHz駆動らしいので、わずか0.589msです。短すぎだよ!!
TASの経験から1フレーム(16.667ms)未満だろうとは思いましたけども、まさかのサブミリ秒でした……。道理で、フレーム単位入力のTASでは最速のメッセージスキップができないわけです。人間ならなおさら無理ですね。このタイミングを毎回狙って押せるやつは100%人間辞めてます。
以上は最速のタイミングを狙って発動させようとした場合の話であり、メッセージスキップを拝むこと自体は割と簡単です。なぜならキーを「押す」タイミングは非常に厳しいものの、他の条件は厳しくないからです。救いの手は2つ、
ですから適当にキーをガチャガチャ連打していれば、たまに条件に該当してメッセージスキップが発動します。
以前予約していた、呼び込み君ミニが届きました。発売は青島(青島文化教材社、公式サイトへのリンク)です。模型をやっている人なら馴染みの名前かと思います。
これは何かというと、スーパーで良く聞く「ポポーポ、ポポポ……」という曲を流してる「呼び込み君」の模型です。「呼び込み君」は群馬電機(公式サイトへのリンク)の販売している、音声POPと呼ばれる広告用の機械の名前です。
パッケージはこんな感じでした。
本物の呼び込み君は20cmくらいあって割とデカいですが「呼び込み君ミニ」は5cmくらいでかなりコンパクトです。本物同様、付属品で顔の部分をPOPに交換できるようになっています。さすがに光りはしませんが……。
音もちゃんと鳴ります。早速鳴らしてみると、思っていたより3倍くらい音がでかくて驚きました。夜中に鳴らすと近所迷惑かも?というレベルです……。
Might and MagicのTASをちょっとだけ更新しました。記録更新に挑んだと言うより実験に近いかも。一応2秒くらい短くなっています。ニコニコ動画にも載せておきました(【TAS】FC版Might and Magic Book One 14分04秒 マップ付き)。
更新内容は端的に言うと「右に回れ」です。このゲームは、なぜか「左に回る」より「右に回る」方が1フレームくらい速いことが多いです。TASに取り込んでみたところ、確かに速くなりました。ただ、残念ながら速くなる理由は良くわかっていません。普通、左だろうが右だろうが、処理変えませんよね?どういう実装したらこうなるのかね?
Might and Magicに限りませんが、ファミコンのゲームは描画とゲーム処理が非同期だったり、描画と無関係に入力を見続けたり、変な作りのゲームが珍しくないみたいです。そのせいか、入力に対してカオス的というか……、失礼な言い方をすればかなり「挙動不審」なんですよね……。
懐かしい画面キャプチャが出てきたので供養しておきます。
だいぶ昔になりますが、イーモバイルのWiFiルーターHuawei GL10Pを買いました。イーモバイルの契約は5年前(2016年11月27日の日記参照)に解約してしまったので、GL10Pだけが寂しく残っている状態でした。
といってもモバイルWiFiルーターはほとんど使わないので、イーモバイル(今はワイモバイルでしたっけ?)を再契約するほどでもありません。
とりあえず何か通信さえできれば良いので、今はb-mobileの格安SIM(ドコモ回線)を入れています。ただしこの時代のイーモバイルのWiFiルーターはSIMロックが掛かっているので、SIMロックを解除する必要があります。SIMロック解除には解除コードが必要(コードを知る方法はググると出てきます)です。以降、コードは既にわかっているものとします。
GL10PにWiFiで接続して、パスワードadminでログインします。おそらく下記のような画面が出ているはずです。
このページにはSIMロック解除コードが隠れているので、DOMインスペクタなどで入力欄を表示させます。
追加のツール等は不要な親切設計となっていて、ありがたい限りです。Huaweiが意図して提供した機能か、デバッグ用の機能が紛れ込んだのか、どちらなのか知りませんけども……。
目次: サンタ
飛行機の位置をリアルタイムに表示する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超えるくらいらしいので、サンタさんめっちゃ速いやん……。戦闘機とやりあう気かよ??
目次: ゲーム
ダンジョンエンカウンターズ、やっと最後まで行きました。謎解きはまじめにやらず、攻略サイトを見てしまいました。難しいというか……正解を見ても「無茶言うなよ」って感じの問題です。攻略サイト作っている人たちはどうやって解いたんでしょうね……?
地下90階にいるラスボスを倒して1回目のスタッフロールを拝むのはそんなに難しくありません。とはいえ、強いのは確かです。特に2回目の戦闘(パノプティコアA, B, C, D)は、何も考えずに突っ込むとパーティーが蒸発します。ラスボスを無視して、地下99階までの謎解きアイテムとアビリティを全部拾ってから改めて挑むと比較的楽だと思います。アビリティ「テレポ」と「ノーエンカウント」を拾うと回収が捗ります。
謎解きを済ませると、この辺の超強力な武器が全て揃うはずです。地下90階以降の敵はアホみたいに攻撃力が高く、一撃で防御値がなくなることが多いため、防具を1〜2段階強化してもほぼ意味がありません。スピードの落ちる重装備(ヘルム、鎧)より、スピード重視で軽装備(服、帽子)+ブーツにして、相手より早く殴って倒すようにすると良いでしょう。
パノプティコアは1体だけ残すと「全ての力」という超強烈な攻撃をしてきて、メンバーが一瞬で蒸発するので、
こうすると比較的楽なはずです。
最下層の地下99階にいるバトルFF「無限」というクッソ強い敵を倒すと2回目のエンディングが拝めます。拾える武器だけでもうまくやれば倒せる気がするんですけど、私はやり方がうまくないのか、火力不足で勝てませんでした。
地下98階辺りの、バトルF7を集中的に選んで、ティアマットLv.99が落とすアドレスブレイドを2本を拾うまで頑張ります。出てくる敵としては、
バトルF8の方がティアマットが確実に出ますが、一気に5体出てきて強力な全体物理攻撃を連発され、パーティーが一瞬で全滅する可能性が高く、面倒な相手です。バトルF7を数こなす方が安定すると思います。
アドレスブレイドを揃えたら、地下99階のなるべく南東のマスに「無限」を出現させます。装備はHP満タン攻撃力倍+スピード重視装備+アドレスブレイドで。アドレスブレイド持ちのキャラはとにかく殴り、防御が完全に剥がれたキャラやアドレスブレイドを持っていないキャラは防御回復を連打、これでたぶん倒せるはずです。
目次: ゲーム
ダンジョンエンカウンターズ、全フロアを踏破しました。基本的には強敵を避けてウロウロ歩けば踏破できますし、アビリティ「ノーエンカウント」取得後は、落とし穴以外に恐れるものは存在せず、ほぼ塗り絵ゲームになります。ただし、地下92階だけはかなり辛いです……。
おそらく全員が「最も踏破に苦労する階は?」という質問に対して「地下92階」と答えるでしょう。それくらい面倒くさい作りです。地下92階は全て飛び地になっていて、一部は地下93階から02(上り階段)で行けますが、残りはほとんど目印がありません。マップの背景(宇宙みたいな赤と青のモヤモヤ)から、飛び地の座標に当たりを付け、アビリティ「仮想階段上り」で上る必要があります。
地下92階から「仮想階段下り」で地下93階に戻ると、いきなり落とし穴に落ちることがありますが、地下94階で必ず受け止めてくれるので心配いりません。
しかし落ちた先の地下94階や、地下92階の小島でミスって落とし穴を踏むと「奈落の底に落ちてパーティーが全員行方不明」になることがあります。被害を最小限にするためにも、地下92階は1人パーティーで攻略した方が良いと思います。入り口となる地下93階は常に一本道です。落とし穴回避のためアビリティ「ムーブ」「ナイトムーブ」、エンカウントマスも回避できないため「ノーエンカウント」もほぼ必須でしょう。
全部巡るのは非常に大変でしたが、下記の表で座標を全部メモできているはずです。
島の種類 | 南 | 東 | 島の広さ |
---|---|---|---|
02階段上り | 2 | 41 | 16 |
02階段上り | 14 | 72 | 20 |
02階段上り | 15 | 13 | 4 |
02階段上り | 21 | 34 | 16 |
02階段上り | 33 | 87 | 16 |
02階段上り | 36 | 20 | 12 |
02階段上り | 47 | 34 | 16 |
02階段上り | 49 | 83 | 16 |
02階段上り | 61 | 10 | 20 |
02階段上り | 72 | 43 | 16 |
02階段上り | 73 | 83 | 16 |
02階段上り | 74 | 15 | 20 |
02階段上り | 92 | 41 | 16 |
02階段上り | 94 | 88 | 9 |
Event 3Fの島 | 49 | 60 | 25 |
Event FDの島 | 87 | 14 | 9 |
仮想階段上り | 5 | 54 | 20 |
仮想階段上り | 9 | 73 | 4 |
仮想階段上り | 10 | 83 | 12 |
仮想階段上り | 10 | 19 | 16 |
仮想階段上り | 14 | 54 | 16 |
仮想階段上り | 16 | 30 | 12 |
仮想階段上り | 17 | 81 | 20 |
仮想階段上り | 18 | 26 | 12 |
仮想階段上り | 19 | 39 | 12 |
仮想階段上り | 19 | 63 | 12 |
仮想階段上り | 24 | 45 | 16 |
仮想階段上り | 25 | 20 | 20 |
仮想階段上り | 27 | 58 | 12 |
仮想階段上り | 27 | 75 | 20 |
仮想階段上り | 29 | 6 | 15 |
仮想階段上り | 30 | 29 | 16 |
仮想階段上り | 37 | 65 | 12 |
仮想階段上り | 39 | 42 | 9 |
仮想階段上り | 40 | 50 | 20 |
仮想階段上り | 41 | 99 | 15 |
仮想階段上り | 41 | 79 | 20 |
仮想階段上り | 52 | 37 | 4 |
仮想階段上り | 55 | 20 | 20 |
仮想階段上り | 58 | 48 | 16 |
仮想階段上り | 61 | 94 | 16 |
仮想階段上り | 63 | 0 | 12 |
仮想階段上り | 67 | 19 | 20 |
仮想階段上り | 68 | 32 | 6 |
仮想階段上り | 68 | 77 | 16 |
仮想階段上り | 70 | 92 | 9 |
仮想階段上り | 71 | 65 | 16 |
仮想階段上り | 77 | 50 | 9 |
仮想階段上り | 79 | 80 | 16 |
仮想階段上り | 80 | 27 | 20 |
仮想階段上り | 83 | 39 | 6 |
仮想階段上り | 87 | 59 | 20 |
仮想階段上り | 89 | 68 | 16 |
仮想階段上り | 95 | 25 | 20 |
サイトだと見づらいと思うので、Googleスプレッドシートにも置きました(Googleスプレッドシートへのリンク)。基本的には地下93階の「曲がり角」で仮想階段を使う座標にしたはずです。間違ってたらゴメンなさい&コメントなどで教えてくれると嬉しいです。
攻略の途中で「この地下92階は山勘でやってもクリア不可能じゃね?」と感じてメモを始めたため、踏破済みと未踏破が中途半端に混ざった状態からメモを始めることになりました。おかげで島の座標を全部列挙したかどうかの検証がめちゃくちゃ面倒くさかったです……。最初からメモすれば良かったよー。
「無限」より強いと思われるのが、バトルFDの「モルモット教授」という敵です。出会える確率が非常に低い、防御とHPが9,999,999の最強タフネス、驚異のスピード130、数ターン耐えるのが限界の超強力な攻撃、と嫌な点の塊のような敵です。
幸い?なことにアイテムを何もドロップしませんから、倒す必要がありません。無視してOKです。ただただやり込みプレイを阻むためだけに用意された、嫌がらせのような敵です。
私もアドレスブレイド3本とスピード重視装備で挑んでみましたけど、防御すら削りきれないうちに瞬殺されて心が折れました……。勝てる気がしません。もういいわ。
目次: ゲーム
一覧が欲しくなったので作りました。
鉄道シミュレーションゲーム、Transport Fever 2の話です。
駅シミュレーションゲーム、STATIONflowの話です。
ゲームプラットフォーム、Steamの話です。