supra13のまげつけ日記

supra13のまげつけ日記

今こそまげつけを有名に!

をAI君に手伝ってもらって作ってます。

といっても何言ってるか分からないと思うのでスクショ見てもらいましょう

 

分かります?

今までコース外は真っ平らな何もない平地でしたが、

このアップデートでランダムな丘が生成され、そこに木が生えます。

 

なお、この丘は道路が無いことを確認してから生成するので、道路に被ってしまうことはありません。

ただし、ちょっと動作が重くなります…。

 

コース外が海の時は今まで通り平らなままです。木も生えません。

近々海の時はランダムにヨットでも動かして無人島も出現させようかなぁ…

その為にはヨットと無人島のXGとIMXを用意してそれを読み込ませに行くプログラムを用意しないと。

相当大規模な改修になりそうだ…

 

追記:Youtubeに動画上げました。

 

 

あと、AI君のおかげでオブジェクトのZ座標指定と回転も出来るようにしてもらいました。

これもバニラでは無理なのでプログラム改造必須ですが。

やっとサンフランシスコみたいな高低差ある街も作れるようになりますね。

があるのかをAI君に手伝ってもらって探してもらいました。

結論から言うと特に有用なものはありませんでした。

 

・L1+R1でカメラリセット

 カーエディタのボディやタイヤのプレビュー時とテクスチャエディタで有効。

 カーエディタの方では瞬間で元に戻るので全く意味なし。

 テクスチャエディタでは一応ちょっとは使い道がなくはない…こともないくらい。

 しかし逆に、カーエディタのこのエリアを自作プログラムに置き換えるという夢が広がる。

 L1+R1でブレーキテクスチャ入れ替えるとかどうよ。めっちゃ良くね?

 

・△+□でエンディングスキップ

 ストーリーの終了コマンドに入る直前から上記2ボタンを押し続けていると、エンドクレジットが流れずゲームが終了する。

 エンドクレジット流れててもSTARTボタンで飛ばせるからほぼ意味なし。

 

・2Pコンで十字キー上+START

 一応分岐があるのだが何の意味もなさげ。

 関数TexFrameBufPcOut__Fiiiiが実行されて戻る。

 接続しているPCにスクショでも送る機能だった…?

 

・L1+□

 レース直前のカメラ処理で一応分岐があるのだが何の意味もなさげ。

 

他にAI君に教えてもらったこととして、

タイトル画面で放置するとDEMOが再生されるようなプログラムが残っているとか。

但し肝心のDEMOのファイルが無いので実行不可。

DEBUG/COURSE00.BINってファイルが復元できれば行けそうだけどねぇ…

 

ディスクチェンジについても調べてもらって、

動作としては新しいディスクにDATA/MAGEKEY.DATがあるかを確認、

あればゲームをリセットするって形だったっぽい。

同一ディスクでやれば一応リセットされることは確認出来た。

 

とりあえず現在はリプレイのポーズを復活させたのでこれをベースにフォトモードを作ろうと画策中。

ポーズ中だけカメラプログラムに飛ばないようにして十字キー等でカメラ位置と角度をいじれるようにすれば行けそう。

また一つ、アセンブラの理解が深まった!

てことで、ダイナミックカメラに新たな機能を追加しました。ついでに2つの元々の機能をキャンセル。

まずは動画で見てもらった方が分かりやすいかと。

 

 

で、動画序盤で紹介している、64km/hを境にカメラ制御が変わる処理は

0x0022d094の分岐内で行われています。

切り替わらなくするだけであれば、このbc1tをbに置き換えるだけでOKです。

しかし、今回はこのスペースに動画後半で紹介している右スティックによる見回し機能をつけることにしました。

こうすれば実機でもOPL等とのメモリ競合に悩まされずに済みます。

v1で実装した車速に応じて画角が変化する機能も一緒にここに入れてしまいます。

 

 

(画像がPS2DISだったりPCSX2Debuggerだったりするのは気にしないで)

0x0022D07Cからが上記分岐のための値取得なので、そこから自作プログラムに置き換えています。

直前のlwc1でf01に車速情報が入っています(前回の記事参照)。

 

全命令の解説は画像に書き込みました。

※1はliと表示されていますが、luiとaddiuの2行で命令しています

※2は127を足したり引いたりしていますが、これは右スティックの倒れてない状態が1バイトで7Fであり、これをゼロ拡張しfloat化すると127となるためです。

また、v1の時に作った車速に応じて画角が変わるプログラムでは車速情報(f01)自体を計算して元に戻すという無駄な工程を踏んでいます。これを別のレジスタに入れてやれば2行くらいは減らせるはずです。

 

 

 

先日YouTubeにアップしたこちらの解説です

とりあえずやりたかったことは出来ました。

車速に応じて視野角が変化するエフェクトはレースゲームではよく見るかと思います。

それをまげつけにも入れてやったという訳です。

以前から視野角(画角)のアドレスは判明していたので、

車速のアドレスさえ見つければ楽勝だぜ!と思っていたんですが

なんと車速のアドレス全然見つからん。普通にfloatで保持してるかと思ったのに。

Twitterに書きましたが、タイヤの回転数はfloatで保持されていたのでそれ使って疑似的に一回作りましたが空転した時とかおかしくなるので没。

 

そんでめちゃくちゃ大変でしたが色々学んでいくと、どうもベクトル関係らしいと分かってきました。

高校数学赤点マンには厳しい…

が、現代にはchatgptなる優秀?なヘルプがいるので助けを求め、なんとか行けました。

 

0x00179E50のaddiuから始まる関数(MAIN_OLD.ELFある方はVectorLengthGetってラベルがついてます)でベクトルの長さ=速度情報を取得していました。これは6か所くらい?で呼ばれていて、タイヤ関係とか?でも呼ばれるんですが、一部はCPU車も使う関数なので、メーターUIに近い位置で呼ばれる場所を探しました。

0x0022D088のnopにjを仕込んで自作プログラムへジャンプ。遅延スロットによりc.le.sは実行されます。

このとき、f01に車速にあたる情報が入ってます。

自作プログラムはこんな感じ

luiで0x4380をv0に代入。256ですね。

これをf20へロード。

そしてf01(車速情報が入ってる)にf20(先ほど256を入れた)を掛け算してf01へ再度ロード。

f01を平方根にする(後述)

v0に0x4218を代入。38ですね。これがベースの画角になります。ちなみにバニラは45固定。数字が小さいほど画角が狭くズームしてる感じになります。

これをf20へロード。

f01とf20を足し算してf20へ再度ロード。つまり、ベース画角38 + √(車速情報 × 256 )ってことです。

luiとaddiuで0x00480330をv0へロード。画角情報のアドレスです。

swc1でf20をv0のアドレスへストア。つまり計算結果を画角に反映させます。

luiで再びv0に0x4380(256)を代入。

これをf20へロード。

f01を2乗する。平方根にしてしまったのを元に戻すためです。

そしてf01をf20(256)で割る。これも元に戻すためです。

そんでjを使って元の位置に戻る。

 

平方根にする理由について

いわゆる単調増加と違い、平方根は最初の変化量が大きく、徐々に変化量が小さくなる特性があります。

なので、加速しだした瞬間は大きく画角が変化し、ある程度速度が乗るとあまり変化しないようになるのです。

大体のレースゲームではこれに近い処理をしてるんじゃないかなと思います。

 

 

いじょっ!そんな感じでした。

というかメモリの限界というか。

大量にオブジェクト設置していくと100 64種類くらいを超えるといくつか出現しなくなり始めます。

これは、市街+街並みの合計数(66)とほぼ同じです。

…が、一部のデカいオブジェクトはテクスチャ容量もデカいのでこいつらを使うともっと減るかも。

 

しかしコレがまげつけの画面だなんて数年前の自分は信じられないだろうなぁ…

 

カフェハナコがいい感じ。

 

看板がこんな風に生えてるビル好き。

 

エンデバー石油とモーターマン、俺マート。

 

道幅可変だから仕方ないとはいえ、歩道橋とか、電線とか、空中を埋めるパーツが無いのがちょっと物足りないところ。