うさむねhello.work

スーパーマリオ64のRTA(リアルタイムアタック)を専門に活動している人のブログです

メニュー

【マリオ64】なぜMISCタイマーはGSコードで実現できないのか?

まえがき

うさむねROMの新たなバージョンであるv1.71uを最近リリースした。

いくつかの機能の改良やバグの修正を行なったものであり、v1.70よりもより良くなっているので、(面倒かもしれないが)うさむねROM使用者にはバージョンアップしてほしいと思っている。

このROMの詳細は以下のドキュメントに全て載っているので、興味のある方は一度確認してみると良いと思う。

うさむねROMドキュメント: Usamune Hello Work - Usamune ROM

 

今回はこのROMの目玉機能のひとつである『MISCタイマー』という機能を言及していく。うさむねROMを全く知らない人でも分かるように説明していくので、特に身構える必要はないし、『使ったことないから読まなくていいや』と思った人も、ぜひ最後まで読んでほしいと思っている。

 

MISCタイマーって何?

MISCタイマーというのは、うさむねROMに組み込まれているタイマー機能のひとつで、ある特定のタイミングで1秒間だけタイマーが停止する機能である。

"特定のタイミング"というのは、最新のv1.71uでは、以下のタイミングとなっている。

1. [!]箱を破壊したとき
2. 数字が表示されたとき(例. 赤コイン、シークレット)
3. 紫スイッチを起動したとき
4. 水位変更クリスタルに触れたとき
5. バク宙や壁キックをしたとき
6. つかむアクションになったとき (例. ポールにつかむ)
7. 初めてケツを燃やしたとき (例. LLLぼすどんけつスター)
8. オブジェクトをつかむアクションになったとき (例. ボム兵をつかむ、小さい木箱をつかむ)
9. 青コインスイッチの青コインが出現したとき
10. 敵を倒したとき
11. カメラ×になったとき (例. 赤コインスター出現、ボスモンスターと話す、ドアをあける)
12. 大きい木箱を壊したとき (BoBやWDWにあるやつ)
13. 壁にぶつかったとき
14. どんけつやジャンゴにぶつかったとき
15. 甲羅に乗ったとき
16. ボム兵を蹴ったとき

 

『一時的にタイマーが停止していいことあるの?』と思う人がいるかもしれないので、とりでのぶっこわスターを一例に説明する。

このスターでMISCタイマーONにした場合、一番始めにタイマーが停止するのは、『木につかまるフレーム』となる。

この『木につかまる』タイムは"2.03"がマックスなのだが、この機能をONにしていた場合、最速タイムが出ていれば"2.03"でタイマーが一時停止することになる。

なので、このスターの最速を目指したいと考えたとき、"2.03"でタイマーが一時停止しなければ即レベルリセットすることができるのだ。

また、その他にも、どのように入力すると(例えば、最速で幅跳びを出すとか、くぼみの角度にしてみるとか)最速タイムが出るのか、プレイしながら学ぶことができる。

今まではこのような『途中タイム』を知るためには、タイマーを常に表示にした上で、動画編集ソフト等でコマ送りで見るしかなかった。

しかし、MISCタイマーのある今では、そんな超めんどくさいことをせずとも、手軽に知ることができるというわけだ。

例を挙げ始めるとキリがないのでここまでとするが、先ほどのぶっこわの例だけでも、十分便利さが伝わったと思う。

 

こんな便利機能を備えた『うさむねROM』を実機で使うためには、『EverDrive-64』というカセットが必要となる。

ここ最近、この『EverDrive-64』を購入する人は増えつつあるが、『ちょっと高いな』と思っている人はなかなか手を出せていないのが現状だ。

このような状況なので、この記事のタイトルにある通り『MISCタイマーはGSコードで作れないの?』という質問を数回聞かれたことがある。

今回はこの質問に対して、全く知識のない人でも分かるように回答していこうと思う。

 

基礎知識のお勉強

"ROM"や”RAM"という単語をご存じだろうか。『名前だけ聞いたことはあるけど・・・』ぐらいな人が大半かもしれない。

今回の話をする上で、ここいら辺の基礎知識は少し知っている必要があるので、ここの項ではその説明をする。

 

このような説明をするときに『例え話』をあまり使うべきではないとぼくは思っているが、専門的な話をしすぎて理解が追い付かずにブラウザバックされてしまうのも悲しいので、直感で分かりやすくなるような『例え話』を使って話そうと思う。

(だが、やはり『例え話』であることは変わらないので、より正しい内容を知りたい人はググったほうが良い。)

 

どのような『例え話』を使おうか悩んだが、『本棚から魔法の本を全て取り出して作業机の上に並べる。適宜、それらの本から必要な呪文を唱えていく』というイメージで話すのが一番都合が良さそうだったので、これにする。

まず、"ROM"と"RAM"の関係を簡単に説明したのが、以下の2つの画像になる。

f:id:circumark994:20190211172800p:plain f:id:circumark994:20190211172823p:plain

  

"ROM"・・・データを永遠に記憶している場所。N64ならカセットにあたる。一般的なPCでいうとハードディスクにあたる。

"RAM"・・・データを一時的に記憶している場所。ハードの電源をOFFにするとデータが全てなくなり、次に電源をONにするとデータがゼロの状態からスタートする。N64ならその内部にあるメモリにあたるが、拡張パックを接続することでこの領域を増やすことができる。

 

今回は、先に挙げた2つ目(右)の画像を使って説明していく。

この画像(例え話)では、本棚が"ROM"となっていて、作業机が"RAM"となっている。マリオ64をプレイするときに当てはめると、大まかなシーケンスは以下である。

① N64を起動すると、『神様』は本棚から全ての本を取り出して作業机に並べる。

② マリオプレイ中は、『神様』が作業机にある本を必要に応じて開いて、呪文を読み上げる。すると、ゲーム内にその呪文が反映される。

③ N64の電源を切ると作業机の本が全てなくなり、本棚に全ての本が格納された状態に戻る。

厳密に言うとちょっと違うのだが、話をする上ではこの違いは重要じゃないので、この例え話で話を進めていく。

 

例え話に出てきた本の中身

先ほどの例え話で呪文が書いてある本が出てきたと思うが、具体的に本の中身がどうなっているのかが重要になってくるため、例を紹介する。

例えば、『Aボタンの入力があったら/マリオさんに/一段の/ジャンプをさせます』という呪文が載っている本がある。

f:id:circumark994:20190211180518p:plain

プレイヤーがAボタンを押したのを見た『神様』が、この本を開いて、この呪文を唱えることになっていて、この呪文を唱えるとゲーム内のマリオが一段ジャンプをする。

注目してもらいたいのは、この呪文は四節で構成されているという点だ。

一節目: Aボタンの入力があったら

二節目: マリオさんに

三節目: 一段の

四節目: ジャンプをさせます

本題の話をする上で、『呪文の構成』はポイントになってくるので、覚えておいてほしい。

 

例が1つだけだと理解しにくいかもしれないので、2つ目の例を出す。

『赤コインを取得したら/数字を/表示させます』という呪文が載っている本がある。

f:id:circumark994:20190211182019p:plain

プレイヤーが赤コインを取得したのを見た『神様』が、この本を開いて、この呪文を唱えることになっていて、この呪文を唱えると赤コインのあった位置に数字が表示される。

そして、これは三節で構成されている。

一節目: 赤コインを取得したら

二節目: 数字を

三節目: 表示させます

 

このような感じで、マリオ64にはたくさんの呪文が存在し、神様がその呪文を唱えることでゲームが動いていく仕組みになっている。

この話は以上になるが、ここで覚えてもらいたいポイント2つを以下に書いておく。

① (先に挙げたが\)呪文は節によって構成されていること

② 本のページには、呪文が改行なくぎっしり詰められていること

 

なお、一例で挙げた本はあくまで『例え話』なので、呪文の中身や節分けは実際とは異なる(もっと複雑)。その点を誤解しないようにしてほしい。

 

GSコードを適用するってどういうこと?

先ほど本の中身を紹介したが、一つ目の『Aボタンの入力があったら/マリオさんに/一段の/ジャンプをさせます』という呪文に手を加えるとなると、例えば、以下のようになる。

f:id:circumark994:20190211182903p:plain

この例では、三節目の『一段の』を『二段の』に書き換えている。

先ほどから出てくる『神様』は本の中身の呪文を忠実に唱えるので、勝手に読み替えたりなんてことは絶対にしない。

なので、このような悪さをしたいのなら、『神様』とは全く別の存在である『悪魔』を用意する必要がある。それがまさに『ゲームシャーク』である。

 

『ゲームシャーク』を使った場合は以下のようなイメージになる。

f:id:circumark994:20190211184100p:plain

こんな感じで、『悪魔』は作業机にある本の呪文をこっそり書き換えている。

この『悪魔』はかなりしつこい性格で、なんらかの手段で『二段の』を『一段の』に戻したとしても、すぐさま『二段の』に戻してしまうのだ。

普段『81012345 9999』・・・みたいなコードを『ゲームシャーク』で入力していると思うが、これは、『悪魔』に対して『どの呪文をどう書き換えればよいか』を命令しているのである。

これが、GSコードの適用の正体なのだ。

 

この項はここでおしまいだが、ひとつ補足しておく。

既に気づいている人はいるかもしれないが、GSコードには種類がある。これはこの『悪魔』に対しての命令の種類だと思ってほしい。

様々な命令を駆使できれば、(先の例を用いると)"常に『二段に』に書き換えろ"ではなく、"『Lボタンが押された時』に『二段に』書き換えろ"みたいなちょっと複雑な命令もつくることができる。

 

うさむねROMの原理って?

先ほどGSコードの適用のイメージを見せたが、うさむねROMではこれとは全く異なるやり方で、呪文を書き換えている。

そのやり方のイメージが以下の図となる。

f:id:circumark994:20190211190406p:plain

上の図で示している通り、うさむねROMでは、本棚にある本の呪文を書き換えてそれを作業机に並べている。このようにすることによって、『悪魔』がいなくても『神様』が書き換わった呪文を唱えてくれるというわけだ。

『神様が書き換えに気づくんじゃないの?』と思った人がいるかもしれないが、この『神様』は、"全ての本の呪文は正しい"と思い込んでいるので、そのようなことはない。

この話を聞いて既に気づいたと思うが、GSコードを適用した場合だと、作業机のところに『悪魔』が出てきてしまうので、その分、処理が重くなってしまう。

よく『EverDrive-64のほうがゲームシャークよりも処理落ちが少ない』と言われているが、これはこのことが理由である。

なお、EverDrive-64でも『悪魔』を召喚すること(GSコードを適用すること)はできるが、処理が重くなることからそれを避けている。

 

うさむねROMでMISCタイマーをどう実現しているか

今までの話から、以下の特徴があることに気づいたと思う。

① 『GSコード適用』では、作業机にある本を書き換えることしかできない。

② 『うさむねROM』では、本棚に格納されている段階で本を書き換えていて、作業机では特別なことはしていない。

 

②にあるように、『うさむねROM』では、本棚の段階から本を書き換えているのだが、応用編として『カスタムした本を作成して、こっそり本棚にしまう』ことができる。

本棚にある本は、漏れなく全て作業机に展開されるので、本棚にしまってある『カスタム本』も作業机に展開されるようになっている。

 

この『カスタム本』の用途はなんなのか、疑問に思う人もいると思うので、この項ではそれを説明していく。

 

例えば、『赤コインを取得したら/数字を/表示させます』という呪文に『そして/タイマーを/表示させます』という"自作の呪文"を付け加えるとする。

 f:id:circumark994:20190211195902p:plain

上の図のように、"元々の呪文"に付け加えて書けば良いと思うだろうが、これができないのだ。

仮に無理やりこれをやろうとした場合、『別の呪文1 、2,3』に上書きする形になってしまい、本来あるはずだった『別の呪文』達がなくなってしまうので、エラーが起こってしまう。

 

こんな時に登場するのが、『カスタム本』である。

『カスタム本』は何も書いてないまっさらな本なので、自由に呪文を書くことができるようになっている。

この『カスタム本』を使うと、以下のように"自作の呪文"を実現することができる。

f:id:circumark994:20190211201329p:plain

元々の本には『カスタム本』を参照するよう書いておき、『カスタム本』で"元々の呪文"+"自作の呪文"を唱える。唱え終わったら、元々の本に戻ってくる。

『はじめから"神様"にカスタム本を読ませた方がいいじゃん』と思うかもしれないが、それはできない。なぜかというと、『神様』は呪文で命令されない限り、『元から存在する本』しか読まないからだ。

『神様』に『カスタム本』を読んでもらうためには、『元から存在する本』の中で『カスタム本』を参照するよう書く必要がでてくるのである。

なお、これは『カスタム本』を使った"自作の呪文"を実現する方法の一例であり、この他にも色々な方法があるので、誤解しないでほしい。

 

以上で分かったと思うが、うさむねROMでMISCタイマーを実現するために、ぼくらは『カスタム本』にたくさんの"自作の呪文"を書き、『元から存在する本』に『"カスタム本"を参照しろ』というような命令文を書いている。(MISCタイマーに限らず、その他の機能も基本的にこの方法で実現している。)

 

GSコードでMISCタイマーが実現可能かどうか

ここまで読んだあなたは『"悪魔"に"カスタム本"を作らせて、こっそり作業机の上に置くことはできないの?』と思ったはずだ。

結論を言うとそれは可能である。実際に『カメラ×タイマー』では、その方法を使っている。

 

『カメラ×タイマー』で使われている"元々の呪文"では、『スター取得後カメラ×になったとき/マリオさんに/ダンスをさせます』という呪文となっている。

これに"自作の呪文"を付け加えた場合は以下となる。

f:id:circumark994:20190211205100p:plain

先ほどの話を理解していれば、わざわざ図を見なくても分かると思うが、

- 元々の呪文: 『カスタム本の呪文を参照してください』

- カスタム本の呪文: 『スター取得後カメラ×になったとき/タイマーを/止めます/そして/マリオさんに/ダンスをさせます/完了後元々の呪文に戻ります』

みたいな感じになっている。(厳密には違うので、注意してほしい。)

 

GSコードでは、『元々の呪文の書き換え』と『自作の呪文の書き込み』の2つを『悪魔』に命令してやらせていて、Timers - SM64 Practice Codes によると、『カメラ×タイマー』のコード行数は、日本版で27行となっている。

上の図だけ見ると、『たいした事してないのになんでこんなにコードが長いんだ』と思うかもしれないので、理由を話しておく。

実は、GSコードは"コード2行で1節分"となっていて、基本的には『節の数』の2倍のコード行数が必要になってくるのだ。

 

以上の内容を以って、もし『GSコードでMISCタイマー』を実現しようとした場合を話す。今思いつく限りで、必要な呪文修正は以下となる。

① 15項目の"元々の呪文"の書き換え

② 15項目分の"自作の呪文"の書き込み

③ "タイマー表示"呪文の書き換え

④ 一時的に1秒だけタイマーを表示するための"自作の呪文"の書き込み

⑤ "タイマー動作"呪文の書き換え

⑥ 表示用のタイマーとずっと動き続けるタイマーをつくるための"自作の呪文"の書き込み

⑦ その他細かいところ

 

GSコードに換算すると、『7つ分の節』×『2倍』のコード行数になると予想される。(少なくとも1000行は余裕で超えるぐらいあると思う)

 

もしかしたら『コード入力さえ頑張ればできるじゃん』等と思った人がいるかもしれないが、

1. ゲームシャークにはコード行数に上限がある。『全合計250行』程度(F0、F1系を除く)となっていて、その制限にひっかかるので実現できない。

2. そもそもこんなものをGSコードにしようとしたら、作るだけで死ぬほど時間がかかるのでやりたくないこと。

を考えると、実現が不可能だということはご理解いただけると思う。

 

最後に

今回は少し専門的な内容を語ったかもしれないが、かなり分かりやすく書いたので、意味は通じたと思う。

ぼくらはこのROMで何か実現したい機能があったとき、『どこの本にどんな呪文が書かれているか』を調査し、『その呪文が実現したい機能に使えるか』を吟味して作っている。

加えて、機能の追加のしすぎで、作った呪文同士が衝突し合ってバグるようなこともあり、これを修正したり、"自作の呪文"を最適化して呪文の節数を減らしたりと、(タダ働きするにはおかしいぐらいの)ものすごい時間をかけている。

こんなROMのパッチをフリーで公開しているのだから、どれだけ良心的な話なのかは言うまでもないだろう。

この記事を最後まで読み切ったあなたには、是非とも『EverDrive-64』を購入した上で『うさむねROM』を使ってほしいものである。

EverDrive本家ホームページ: EverDrive Store

 

追記: うさむねROMは現状で93186行分あるらしい。

f:id:circumark994:20190212010851p:plain