1・レッドオーブ即MAX 2・落とすレッドオーブ3000 レッドオーブ即MAX レッドオーブの最大値は000F423Fですが 今回はこれだけでは見つからないようになっています 423Fで検索すると、一箇所だけヒットしますが 周辺を見ても最大値チェックなどは一切ありませんでは、ここは何の為に存在してるのか? どこで最大値チェックしているのか? 答えは非常に簡単です ここは最大値を算出する為だけに存在していて 実際の最大値チェックは別の関数で行われています この最大値検出関数の先頭である 002276E0 をマークして参照先を探すと 00227504から怪しい流れが見つかりました
先ほどの最大値検出関数でv0に最大値が格納され v1には数値加算後の値が入っていて sltu命令で比較されています 比較内容によって sw v0, $0000(a0) という命令で最大値に書き換えられます パッと見、アドレスが違うように見えますが 途中で0078h+しているので修正先は同じです この最大値へ修正するように分岐を潰せばOKです 実は、最大値検出はオーブ以外にも アイテムの最大値も検出するようになっていて オーブ加算時のみ000F423Fをv0に格納し アイテム加算時には最大個数をv0に格納します なので近くにある他の最大値チェックを潰すと・・・ 落とすレッドオーブ3000 敵が落とすオーブには法則性があり 5、20、40、60、100・・・・・・ と個数が一定の数値になっていて 6や24などの中途半端は数値はありません このように決まった数しか出ない場合は 加算する数値をテーブル管理している可能性があります テーブルとは決まった数値を一エリアに格納した物を指します そこの数値をどこかのプログラムで読み込んで 最大値チェックをする事もたまにあるみたいです 落とすオーブの個数で何度か検索した結果 それらしき場所が見つかりました
敵は少なくても5は落とします テーブルでも最低値が5なのでほぼ確定ですね 次に、この数値を読み込む場所を探します テーブルの先頭は003D3B90なので ここをマークして参照先を探します すると一箇所のみヒットします
どうやらv1に入ってる値によって 読み込む場所をズラしているようなので このv1がv0に影響を与えないようにすれば 常に0BB8の部分、つまり3000の部分を読むようになります 手っ取り早いのはnop命令にする事ですね これで試した所3000のみ落とすようになりました 常に3000を読む状態にしておけば テーブル内の3000を変更するコードを使用すれば 落とす個数を自在に変える事が出来ます それが落とすオーブ設定コードです