試合時間操作

このゲームは初期設定で試合時間は180秒に設定されています
今回はこの初期設定時間をヒントにコードを探します。

まず180秒という値を実行ファイル上で探すのですが、
注意しなければいけないのは「1秒1カウントではない」という事です。
実は殆どの場合において1秒は60分割されており
そのまま180秒だから「180」で検索しても見つからないのです。
という事で180秒×60カウント=10800=16進数で「2A30」を検索します。

すると通常のプログラム部分でこの値を使っているのは
0017DE00と0017E254の2箇所であることが分かりました。
中でも0017E254の付近を見てみると、
この値を00534728へストアしている命令が存在しています。


他にも同じように00534728へ値をストアする命令があるのですが
(0E10、1C20、3840、4650〜などの値をストアしている)
その値を10進数に直して60カウントで割ってみると
どれも1分単位で変化している事が分かります。

この事から、ここは試合の初期制限時間を設定しているのではないかと思うのですが
このゲームは60秒、120秒、180秒、無制限の4通りしか時間設定が無いので
もしかしたらたまたま数値が同じなだけで無関係の場所かもしれません。
それを確かめるために、2A30(10800カウント=180秒)となっている部分を
倍の5460(21600カウント=360秒)へ変更して変化が無いか確かめて見ましょう。

A017E254 24035460
 ↓暗号化↓
9C82657C 38531B85

このコードを使ってゲームを始めてみると・・・
通常180秒となっている試合時間が360秒に増加していました
やはりここは試合の初期制限時間を設定しているプログラムだったようです。



さて、初期設定の部分は見つかりましたが
このままでは試合時間はいつも通りに減ってしまうので
自由に試合時間を制御できるようこのコードを改良してみましょう。

先ほどのプログラムで「00534728」にストアした値によって
試合の時間が変わった、という事からこのアドレスは
試合時間のワークアドレスであると考えられます。
そこで「00534728」を参照先に設定して
試合時間を減らしているプログラムを探そうと思います。

試合時間を減らすのですから、ロードした値を減らして
(マイナスの値を加算する場合もあるのでadduなどにも注意)
ストアするという流れを持つ場所に注意してF3で探し続けます。

しばらく探し続けた所、0017DA58周辺の処理が
いかにも試合時間を減らしていますという処理をしています。


0017DA5Cのaddiu命令でFFFF(マイナス1)を加算して試合時間を減らしているので
「addiu a1, a0, $0000」と書き換えて減算をしないようにしたら
狙い通り、試合時間が減らなくなりました。
後は「試合時間減らない」と「試合時間0(a1に0を格納すればタイムアップになる)」
をパッドで切り替えるようにすれば試合時間無限コードの完成です。

試合時間減らない
1C825D84 38D9E7A5
0CDCECE6 1456B08B
1C825D84 1456FFC1
セレクト+←でタイムアップ


今回の試合時間のように、特に最大値などが存在しないような要素では
初期設定値を探すことで突破口が開く場合があります。
例えば所持金の最大値がどうしても見つからないような時に
ゲーム開始時の所持金の値を探したらワークアドレスが見つかる、なんて事もあります。