前回の記事でメモリ書き換えによるポケモンのステータス変更方法を紹介しましたが、
ちょっと重大な欠陥が見つかったので報告します。
イメージ 1イメージ 2
スクリプト:手持ちの先頭をHP1に
11 01 3a 42 02 02 02
・・・で前回紹介してたと思うんですけど、
イメージ 3
このスクリプト、手持ちの先頭のHPが256を超えてる場合256+変更後の数値になっちゃうみたいで。
うん、冷静に考えればそりゃそうだって話ですね。
イメージ 4
イメージ 5
メモリー表示で見るとこんな感じで変化しております。
・・・ということで調べた結果この右の01が256繰り上がった分のHP・・・だと微妙に計算合わないなぁorz
これ16bit表示だから逆順で表示されてるのかな・・・?
というわけで色々試した結果0202423bが256繰り上がってる部分のアドレスだったことが判明しましたので、
イメージ 6
スクリプト:今度こそ手持ちの先頭をHP1に
11 01 3a 42 02 02
11 00 3b 42 02 02 02 ff
・・・このスクリプトで手持ちのHPが256を超えていようと容赦なくHP1にできます。
うん、ひどいトラップでしたね・・・
 
・・・ところでこのスクリプトを悪用すればちょっと面白いことができそうですよね。
というわけで電波にそそのかされるままちょっと組んでみたスクリプトがこちらです。
イメージ 7イメージ 8
スクリプト:手持ちの先頭の現在、最大HPを999に
11 e7 3a 42 02 02
11 03 3b 42 02 02
11 e7 3c 42 02 02
11 03 3d 42 02 02 02
ふはははー!すごいぞー!かっこいいぞー!w
というわけであのハピナスでも成し得なかったHP999をついに拝むことができましたw
イメージ 9
ちなみにHP1000の場合がこちら。ちゃんと表示されてません。
イメージ 10イメージ 11
戯れで最大HPを65535にしてまんたんの薬を使ってみたり。
・・・計算上HPが回復しきるまで20分以上かかりますがもうここまで来るとフリーズと同義ですね。
イメージ 12
攻撃を1025にしてみたり。・・・太い骨ガラガラが剣の舞を使うと1024くらいでオーバーフロー起こしたはずなんで
これもオーバーフロー起こすかと思いましたがメモリ書き換えするだけなら意外と大丈夫ですね。
イメージ 13
レベルを999にしてみた結果。計算してみたところ999-256-256-256で231なんで
レベル256を越えた分はオーバーフローして反映されないようですね。ぐぬぬ・・・
 
・・・では前回のスクリプトを今回のデータも加えてまとめましょう。
 
~手持ち1匹目のステータス変更スクリプト~
11 xx 38 42 02 02 02で現在レベル(101~255にも変更可能、256を超えるとオーバーフロー)
11 xx 3A 42 02 02 02で現在HP、
11 xx 3C 42 02 02 02で最大HP、
11 xx 3E 42 02 02 02でこうげき、
11 xx 40 42 02 02 02でぼうぎょ、
11 xx 42 42 02 02 02ですばやさ、
11 xx 44 42 02 02 02でとくこう、
11 xx 46 42 02 02 02でとくぼう、
11 st 34 42 02 02 02で状態異常
どく:08 まひ:40 ねむり:02 やけど:10 こおり:20 もうどく:80
2バイト以上書き込みたいときは
11 xx 3A 42 02 02 11 xx 3B 42 02 02 ~02で終了
※各ステータスの256を超えた分の数値は隣のアドレスで設定されてるのでこちらも変更すること
(例1:手持ち一匹目の現在HP1に→11 01 3A 42 02 02 11 00 3B 42 02 02 02)
(例2:手持ち一匹目の攻撃999に→11 E7 3E 42 02 02 11 03 3F 42 02 02 02)
※2匹目以降に適用するならアドレスを+64h(※16進数で64を足す)
※レベルアップやパソコンに預けることでステータスは元に戻る
※レベルを変更してもステータスは変わらない
※レベルダウン、最大HPを現在HP以下にするなどで音楽バグやブラックアウトの危険有り
※現在HPが0になったポケモンは瀕死、手持ち全員瀕死でも戦闘に入って行動するまでは自由に動ける
※各数値は1000を超えると正しく表示されない(例:1000→?00)
 
・・・こんな感じで大丈夫ですよね?今度こそ抜けはないですよね?
というわけで前回は微妙に漏れのあるスクリプト紹介ですいませんでした。
いやしかし早めに判明してよかったよかった・・・w