戦闘終了後経験値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を論理和させてまたシフトさせ〜」 より分かり易いと思うのでそこはカットしています。 「ここはどういう数値を格納しようとしているんだろう?」 という部分はエミュ機能で処理できる場所も結構多いので これを利用して分かり難い処理を簡単にする事も出来ますが 慣れてくると見ただけでプログラムの流れが掴めます。