先日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を使って元の位置に戻る。
平方根にする理由について
いわゆる単調増加と違い、平方根は最初の変化量が大きく、徐々に変化量が小さくなる特性があります。
なので、加速しだした瞬間は大きく画角が変化し、ある程度速度が乗るとあまり変化しないようになるのです。
大体のレースゲームではこれに近い処理をしてるんじゃないかなと思います。
いじょっ!そんな感じでした。