戦闘終了後経験値MAX

このゲームでC9FFや270Fなどの最大値検索をしていると
所持金やステータス関連は見つかるものの
どうしても経験値に関係する場所は見つかりません
それもそのハズ、最大値がワードデータで管理されていなかったからです。

ゲーム画面を見て、経験値のケタ数を計算すると
恐らくワードデータ以上溜まるのでは無いかと考えられます
という訳でダブルワード以上の数値を16bit数値検索していると
E7FFで数箇所が検索に引っかかりました
(00174876E7FF=99999999999)
そのうちの1箇所の画像を見て下さい


ここではダブルワードでの最大値チェックをしていますが
レジスタ同士が干渉してしまって見た目では分かり難いですね
他ページで紹介しているエミュ機能を使ってみると
数値の変化が良く分かるので使ってみましょう。

001C7EE8からエミュ機能を起動して
001C7F04の比較命令直前までをStepで処理させてみると
レジスタにこういう数値が入る事が分かりました。
このatレジスタに格納されている数値は10進数で
「100000000000」00174876E7FF=99999999999より1多い数値です


この最大値チェックで、a2レジスタの値が
100000000000を超えていた場合分岐命令で分岐せず
001C7F0C〜001C7F1Cの命令が処理されます
この部分も上と同じくエミュ機能でレジスタの変化を見ると
a2レジスタに下画像の数値が格納されるのが良く分かります


つまり、ワードデータの最大値チェックと同じく
分岐命令を潰せば最大値に修正されるという事です
早速この分岐命令を潰します

A01C7F08 14200001
〜暗号化〜
9C8B0030 0836E7A6

コードONでゲームを始めて、戦闘に勝利すると
経験値が入ったキャラ全員の経験値がMAXになりました
これで宿に泊まると一気にレベル999になります。


今回は実際に解析した時の手順にエミュ機能を混ぜて見ました
「ダブルワードを16bit左へシフトさせて
そこへ00004876を論理和させてまたシフトさせ〜」
より分かり易いと思うのでそこはカットしています。

「ここはどういう数値を格納しようとしているんだろう?」
という部分はエミュ機能で処理できる場所も結構多いので
これを利用して分かり難い処理を簡単にする事も出来ますが
慣れてくると見ただけでプログラムの流れが掴めます。