ごちゃペディア

はなまるデジタル創作紀行(DTM、TAS、いろいろな技術)

DS 悪魔城ドラキュラ 蒼月の十字架 TAS in 08:20.12 by gocha

悪魔城ドラキュラ 蒼月の十字架は、変態的なTASでおなじみの探索型悪魔城シリーズの作品であり、悪魔城ドラキュラ 暁月の円舞曲の続編です。

ここからの記述はおおいにネタばらしになっています。まずは何も読まずに動画を鑑賞することをおすすめします!

リンク: TASVideos: #2392: gocha's DS Castlevania - Dawn of Sorrow in 08:20.12
このスピードラン(タイムアタック)は通常難易度にてグッドエンドを最速で迎えることを目指しています。事前のセーブデータは一切ない状態からゲームを始めていますが、有名な壁抜けバグの変形技を利用することで、8分20.12秒での攻略を実現しています。ゲーム内時間での攻略タイムは00:07:18(26310フレーム)になるはずですが、バグによって書き換えられてしまう都合上、ゲームクリア後の表示は00:43:43になっています。

  • 使用エミュレータ: DeSmuME 0.9.4+(終盤になって0.9.2から移植)
    • タイミング周りのエミュレーションが不正確なため、しばしば実機以上のラグが発生します。
    • OpenGLがおすすめです。OpenGLでもSoftRasterizerでも基本的には問題ないのですが、SoftRasterizerはやや拡大周りが変な感じです。
  • 最短時間での攻略を目指す(グッドエンドでの攻略)
  • ゲーム内のバグを利用 / 壁抜けあり
  • 運調整(Luck manipulation*1)あり(ソウルやアイテムの出現、ボスの動きなどに対して利用)
  • 時間節約のための被ダメージあり
  • ジャンル: 探索型2Dアクション

動画について

この動画の攻略プロセスはこんな感じです。

  1. プロローグ
  2. ヨーコとユリウスに会い、魔封陣1を入手する
  3. アクスアーマーからアクスを入手する
  4. フライングアーマーを倒す
  5. バロールを倒す
  6. 後のバグ利用のためにセーブする
  7. 魔封陣2を入手する
  8. ドミトリーを倒す
  9. 壁抜けを実行して必要な条件をそろえた後、ゲームを中断・再開する
  10. ワープルームから深淵にワープして最後の部屋に突入。なお、この城は数秒後に自動的に消滅する

サキュバスバグと呼ばれる有名な壁抜けバグを利用することで、一瞬にして大量のソウルやアイテムを得ることができるというのは、結構よく知られているようです。サキュバスバグは若干のスピードランでも用いられているのですが、サキュバスのソウルを得るためには悪魔城最上階まで行かなければなりませんでした。

しかし、制作中にサキュバスバグの応用法(イベント会話を利用した必殺技キャンセル)を発見したことで、これまでよりもずっと早い段階で壁抜けできるようになりました。さらに、壁抜けの効能に関してもあれこれと検証してみた結果、ワープルームを有効にできること、メナスと戦わずにクリアできることがわかりました。

エミュレータがとってもとってもラグいので、ラグを主としたフレーム単位のロスはそれほど厳密には気にしてないです(でも基本的には最善を尽くしてます!)。かわりに、全体の戦略やルート最適化やバグ探しなどで、基礎の構築をがんばりました。

技いろいろ

見つけたものいろいろ o(>ヮ<)o

バックダッシュ

バックダッシュ+ジャンプとバックダッシュ+しゃがみという2つの移動方法が考えられました(後に1つ追加)。どちらがより速いのか知るべく、平地での平均速度を比較してみました。

  • バックダッシュ+ジャンプ: (13784+13232+12680+12128+11576+11024+10472+9920+9368+8816+8264+7712)/12 = 10748
  • 前進+バックダッシュ+無入力: (6144 + 13784 + 11384)/3 = 10437.3333
  • バックダッシュ+しゃがみ: (13784+13232+12680+12128+11576+11024+8624+0)/8 = 10381 (8フレーム周期が全周期中最速)
  • 追記: しゃがみの代わりにサブウェポンを使うとほんの少し早くなると思います。繰り返せば早々にMPが尽きるのは言うまでもないですが。

このため基本的にはジャンプしながら移動しているのですが、下り坂やより早いタイミングでジャンプしたい場面ではしゃがみながら移動しています。ときどき乱数調整にも使っています。

じつは「前、無入力、後ろ+バックダッシュ」というもうひとつの移動方法も考えていたのですが、どちらの方法よりも遅いので結局使われませんでした。

モーションキャンセル
  • バックダッシュで攻撃モーションをキャンセルできます。有名ですね。
  • 着地でも一部の武器の攻撃モーションをキャンセルできます。これも有名ですね。
  • アーマーナイトのソウルでダメージ後の着地モーションをキャンセルできます。
  • ブラックパンサーのソウルを着地寸前に解除すると、着地モーションを解除できます(高速移動時のモーションもキャンセル可能)。
乱数

部屋によっては(より正確には敵・背景・その他効果等の状況によっては)乱数は毎フレーム変化しますし、そうでない場合もあります。

蒼真が乱数を変化させる手段としては、通常攻撃(1回変化)、バックダッシュ(発動中いくらか変化)、振り向き(1回変化、砂ぼこりエフェクトによると思われる)があります。ジャンプやしゃがみ、ソウル使用(少なくとも今回の動画で用いたもの)では変化させることができません。バックダッシュ+しゃがみは、ほとんど速度を落とさずに乱数調整できるので便利です。

乱数生成器(RNG)の漸化式は後発の2作(「ギャラリーオブラビリンス」と「奪われた刻印」)とまったく同じです。また、これは前作「暁月の円舞曲」ともほとんど同じです。以下にRNGのふるまいをエミュレートするCのコードを示します。

static int32_t x = 0; // $020c07e4
int32_t rand() {
    x = (x >> 8) * 0x3243f6ad + 0x1b0cb175;
    return x;
}

あるフレームで乱数が回された回数を表示するLuaスクリプトを書きました(RNGの実装について知ったのは動画制作後なので、制作には用いられていません)。

水晶のブロック

水晶っぽいブロックはスクリーンに触れることで粉砕できますが、TASでは瞬時にペンを遠くへ動かすことで大量のブロックを一度に破壊できます。触れた点が壊れるのはもちろん、どうやら終点の点対称に位置する点(始点を対称点とする)と始点の2点を結んだ線分が通る箇所もブロック破壊の対象となるようです。

速度を落とさずに足場をすり抜ける(未使用)

動画を作り終わる頃に発見したものなので、現状で詳細を述べることはできませんが、限られたピクセル条件でのみ起こりうるトリックなのではないかと思います。次なる更新の種になるかもしれません。見栄えもいいしなったらいいなあ。

壁の向こうのスイッチを押す(未使用)

有名な技です。カタール、チンクエディア、アルカードソードの必殺技は敵の背後に回り込んで攻撃するものですが、これを利用すると壁の向こうのスイッチも押すことができてしまいます。

これにより早期に時計塔に行けることが有名で、この動画でもそういう使い方をする予定でいたのですが、もはやそんな次元ではなくなりました。

無限ジャンプ(未使用)

詳細はまったく見ていないのでわかりません。

壁抜け:基本的な情報

壁を抜けて部屋の外に行くと、既訪問フラグの書き込みが通常の範囲外のアドレスに対して行われます。その結果、ソウルやアイテムが増えたり、ワープが有効になったり、ゲームがフリーズしてしまったりする怪現象が起こるわけです。

つまるところ、この際の書き込みアドレスは蒼真の居場所に基づいて決定されています。そこでわたしは位置情報から書き込みアドレスを求める式を調べて、リアルタイムにアドレスを表示するLuaスクリプトを書き下ろしました。壁抜け部のルート構築には必須の一品です(スクリプトはTASvideosのsubmissionおよび、svnリポジトリに配置してあります)。

蒼真が一部屋分右に動くと、書き込み先は1ビット左シフトされます。ただし、16部屋(つまり2バイト分)ごとに書き込みの区間が異なっています。詳細はTASvideos側に記したスクリプトをご覧ください。

※書き換えしようとした(しないようにした)アドレスの一覧をTASvideosに記しておきました。調査が進んだこととラスボスと戦わずに済んだことで、これらの大半は考慮しなくてよいものになりました。

註:蒼真はスライディングで壁の中を移動することができるよ!

壁抜け:サキュバスバグとその改変

どの壁抜けバグも必殺技を途中キャンセルすることでおこなわれるもので、異なっているのはどのようにして攻撃をキャンセルするかという点のみです。

一番有名なサキュバスバグの実行方法は次のような感じです。

  1. カタール、チンクエディア、アルカードソードのいずれかと、サキュバスを装備する
  2. 必殺技を発動して、それをすぐにサキュバスでキャンセルする
  3. そのまま2.5秒ほど歩いたり通常攻撃したりして過ごす(長々と立ち止まったり、ジャンプしたり、バックダッシュしたりしてはダメ絶対)
  4. 壁に向かって再び必殺技を発動する
  5. うまくいけば壁の中で必殺技がキャンセルされる

じつはアクスも同様にバグの実行に使うことができます。アクスの必殺技が長い関係上、発動時にはどこかで装備を切り替える必要が生じるかと思います。

ボス戦後の会話も必殺技をキャンセルできます(この動画の核)。サキュバスのソウルを必要としないのが便利です。

その他、平地で扉によってキャンセルさせる方法や、スケルトンエイプで細い隙間に入り込む方法もあります。


メモリアドレス

掲載は省略します。TASvideos側のテキストをご覧くださいませ。

エリアごとのコメント

プロローグ

じつは最初のスケルトンは、2回目のバックダッシュでジャンプせずに早めにスライディングを繰り出すことで、1フレーム早く倒せます。

ゴーレムのところは蒼真がめちゃくちゃな早さで攻撃をしかけるのでお気に入りです (*´▽`*)

地図から消えた村〜フライングアーマー前まで

じつは蒼真はスケルトンで投げる骨よりも早く動くので、最適な投げ方を実現するのはちょっと難しいです。結局、思いつくやり方を全部試して比較しました。ぼくは賢くありません!™

ピーピングアイは、アーマーナイトの槍でとどめを刺すのではなく、適切なバックダッシュと2フレームジャンプを伴ったナイフ攻撃でしとめる方が硬直がなくてよいかもしれません。ただ、未検証なので想像の域を出ません。

アクスアーマーの部屋はひどく運のいる部屋です。アクスアーマーのソウルとアクスを入手して、なおかつゾンビが邪魔にならない位置で発生するようにしなければなりません。ナイフを振り回して乱数調整につとめたものの、アクス直後のゾンビはうまく消せませんでした。これらの条件に加えて、ラグがとても多いといういじめ仕様なので泣けます。

アクスアーマーのソウルをここ(と魔導研究棟)で拾い集めておくと後々に短縮になるかもしれません(あの大量のラグがないものとすれば)。ただしこれまで以上に難しいプレイを要求されることになりますが…… (*っд<)・。

そういえば、メニュー画面ではタッチペンによる操作が可能です。キー操作と比較して短縮になる場合もあるので忘れないようにしましょう。

地図から消えた村・魔導研究棟〜フライングアーマーからバロール前まで

フライングアーマーでは、簡単に攻撃が届くようになるべく相手を下の方に誘導するとともに、できる限り左の方にスクロールして倒すのが理想的です。粘ってはみたのですが、いかんせん斧による近接戦なので左端にたどり着けませんでした。もっとよいパターンが引ければちょっぴり早くなるかもしれません。

中にはフライングアーマーの時点で壁抜けができると考える人もいるかもしれません。壁抜けができること自体は正しいのですが、この間なにも操作することができないので戻ってくるのに数分の時間がかかります。そのうえ、ここで壁抜けをしてもとくに得られるものはないはずです(書き込み可能範囲: 020f6e34-020f7033)。

フライングアーマー使用後はすぐにアーマーナイトに切り替えています。バロール戦が短くなるのとダメージモーションがキャンセルできることで、フライングアーマーのままでいるよりも若干早く進めると考えたからです。

もし足場の類を着地抜きに通り抜けられるとすれば、10〜20フレームくらい縮められるのではないかと思います。たぶんそう都合よくいくものでもないと思いますが……。

魔導研究棟・狂乱の花園〜バロールからセーブルームまで

最終的にはバロールはマインドアップを使わずに倒しました。3秒ほど戦闘が長引きますが、後に10秒程度の利が得られます。戦闘後、水晶にメッセージを書き残そうかと思ったのですが、体感できるほどラグが出てきてしまったのでやめました。明らかに改善できる点の一つです。

バロール戦の直後にポーションを2つ使って体力を回復していますが、これは失敗だったかもしれません。単純にここに至るまでのダメージの量を減らした方が、ポーションを使ってわざわざ回復するよりも早いような気もします。

ファットスローターの部屋では、倒すよりもダメージを受けていく方がよいのかもしれません。得られる経験値の量を少なくすることができるため、あとで出会う敵をさらに倒せるチャンスが生じるからです。それはそうと、ファットスローターの位置と動きの調整は引きも悪くてちょっと面倒でした。TASに挑む気概のある人には、当たり判定枠を表示するLuaスクリプトを書くことをおすすめします(製作当時はまともな描画周りのAPIが実装されていませんでした)

中断セーブを有効にするために狂乱の花園でゲームをセーブしました。セーブルーム内のきらきらりんはタイムに影響するのかもしれませんが、今回これの調整などはまったく考えませんでした。壁抜けといえどセーブが省略できないであろうことは、メモリの値から調査済みです。それにしても、TAS動画がセーブを始めたときほど嫌な予感がするものはありませんね! (>ヮ<)

狂乱の花園・黒の礼拝堂〜ドミトリー戦終了まで

レベルアップしてしまうと数秒動けなくなってしまうので、あまり敵は倒さずに進んでいます。ブレストプレートは装備にかかる時間を考えると節約にならなさそうに見えたのでつけませんでした。ロスも利得も非常に小さいので正確にはよくわかりません。

サッカーボーイに向かって斧を投げた際、上に上らずに足場の上で待っているのは、上へ行ってしまうと当たり判定が行われずサッカーボーイを倒すことができないからです。

この世の果てでフラグを立てる少年SO-MA〜THE・壁抜け

「何がなんだかわからない」ですねわかります。とりあえず、まずは上のほうの壁抜けに関する基本情報を読んでみてください。要するに、画面外の特定の位置に行くと、特定のフラグが立つのですが……

動画の中でしたことは、

  1. ブラックパンサーを取得する
  2. ヒポグリフを取得する(補助的、たぶん時間節約になってると思います。取らなかったり、代わりにマルファスを取るよりも)
  3. メナスを飛ばすべく$020F718Aを$30にする(結果、ゲームは戦闘とその前の会話が終わっているとみなします)
  4. 深淵へのワープを有効にする

そして動画の中でしなかったこと(するのに時間がかかると考えられたもの)は、

  • マルファスの取得
  • 初回の「Warp Room」説明メッセージの省略

たまにぼーっと止まっているのは、中断復帰後の開始位置が大幅にずれないようにしているためです。ほかにもいくつか地雷があったのですが、調査の結果、最終的にはそことは関わらなくてよくなりました。

このどうにもよくわからないルートはこんな手順で考えました。

  1. 便利そうな箇所と踏んじゃいけない地雷箇所を列挙する
  2. 各箇所の位置が奇数アドレスか偶数アドレスか、上位4ビットか下位4ビットかで、4つにグループ分けする
  3. それぞれの場所に行くために必要な横方向の最小距離を調べて、16部屋区切りのどのゾーンに属するかでグループ分けする
  4. どこが近くてどこが遠いのかを見て、ルートを決める

一回ぐるりと縦に回るのには数秒かかるので、無理してたくさんの場所に行こうとするのはあまり得策ではなさそうです。

フィナーレ

リフトのある部屋は上から行っても下から行っても同じ時間になったので、下を採用してみました。

高いところから落ちるときは、着地寸前に一瞬ブラックパンサーを解除してモーションをキャンセルしています。

コメント

まさかこんなひどいルートを考えつくとは、Trailerを放出した頃には思ってもいませんでした。じつを言うとDeSmuME-rrに出会う以前は、蒼月の十字架のスピードランについて考えたことなんてなかったほどなのです。

ある日、新しいDSエミュレータのTAS動画記録を試してみたかったわたしは、好奇心からこのゲームの開幕部(最初の敵3体との戦い)のTAS動画を書きました。そうしてゲームの動作の基本を学んだことから、ふとTASvideosフォーラムにあるAtmaさんのTAS動画デモが更新できることに気づきます。これがこのゲームのTASに真剣に取り組み始めたきっかけでした。まさかわたしが、あの有名な悪魔城のTASに取り組むことになるだなんて、当初はまったく想像していませんでした。

よぉし、まじめにやるぞー!ヽ(>○<) と決めたところで、まずはYouTubeにあったGrooboさんの追記動画に目を通しました*2。これはカタールによる扉が裏開けできるバグと、サキュバスバグ(壁抜け・ソウル取得が可能)という2つの有名なバグ(詳細は後述)を利用して、ゲームをわずか28分58秒でクリアする動画です。わたしの当初の狙いはこの動画を最適化することであり、クリアタイムはせいぜい20分を切らないくらいだろうと考えていました。

しかし、その予想は見事に外れることとなりました。この記録を作ることができたのも、期待を寄せて声をかけてくださった皆様のおかげです。ありがとう! ヽ(>ヮ<)

追伸:制作途中にエミュレータ本体に不満を感じて改変を始めるのは、わたしの行動パターンみたいです。

スペシャルサンクス

Satoryu
Satoryuさんの実機スピードラン(multi-segment)はこの動画とGrooboさんの動画の礎になっています。
Groobo
Grooboさんの追記動画はこの動画の基盤になりました。
蒼月トピの皆様
親切にしてくれて大助かりです。とくに最初に動画を投げたAtmaさんがいなかったら、たぶんやってなかったと思います。
#TASers
きゅんきゅん癒し空間。ピロ彦先生がロックマン2で開拓した動画編集方法はじつにたのしくてよいです ヽ(>ヮ<)

たのしんでもらえるとうれしいです。

スペシャル総評

あんず 「ながい」

すもも 「むずい」

ももこ 「わかんないです」

gocha 「おまえら……!(がんばったのにっ!)」

*1:通常ランダムな要素を、何度も撮り直しを繰り返して成功させるTASの手法。より効率的に成功を導くために、ゲーム内部の乱数が都合良く変化するような動きを交えることがしばしばある。蒼月の十字架においては、攻撃やバックダッシュがそれにあたる。

*2:追記動画の制作のもとになったSatoryuさんの実機スピードラン(multi-segment)も鑑賞しました。ルートはどちらも同じです。