賄賂と褒美成功率100%

このゲームには賄賂や褒美というシステムがありますが
これは成功する時と失敗する時があります
今回は「絶対に成功する」ように改造できる場所を
"文字列"から探したいと思います。

賄賂などで成功すれば「成功しました。」
失敗すれば「失敗しました。」という文字が表示されます
まずはこの文字列をラベル一覧から探します

見つかった「"成功しました。"」というラベル
(スクリーン撮影はWinXPです)

今度はこの文字列がある場所へ移動します
このラベルをダブルクリックすると003271F0に画面がジャンプしました。
この近くには「"失敗しました。"」という文字も格納されているようです


この"成功しました。"を参照先に設定して
F3キーでどこから参照されているかを探すと
001B55D0


001B7EBC

の二箇所が検索に引っかかりました
この検索に引っかかった場所から上方向に命令を遡ると
どちらもbeq命令で"成功しました。"の文字を通過するかしないか
比較命令の結果によって決まるようになっています

もう少し遡ると0064と何かの数値が入っているv0レジスタとで
割り算をしてs0レジスタに結果を格納しています
0064は10進数で100、恐らく成功する確率の計算だと思われます


となると、分岐の直前のslt命令で使われている
s0レジスタにはそれで計算した成功するのに必要な数値(確率)
v0には現在賄賂をした時の成功できるかどうかの数値
必要確率を現在確率が超えていればatレジスタに0001が格納され
分岐命令で分岐せず、"成功しました。"を通過します

ここで、絶対に分岐しないように(文字列を通過するように)命令を潰せば
本来失敗するような場合でも成功するように改造出来そうです
成功〜の参照先は上記のように、2箇所もあるので
分岐命令も2箇所同時に潰して実験してみます

絶対に"成功しました。"を通過
9C8ED6E4 0436E7A6
9C8E01D0 0436E7A6

実際に賄賂や褒美をしてみると・・・
絶対に成功するようになっています
どうやら片方は賄賂、もう片方は褒美になってるようです。

たまに文字を通過させても文字が表示されるだけで
内部的には成功していなかったりする物がありますが
このGOC3のように、成功確率を計算してから
分岐命令で文字列を通過するかどうかを処理している場合は
高確率で、通過させるだけで内部的にも成功したようになります。