チートコードのようなものを実装する方法です。
文字数によって書き方が少し異なります。
方法A(ADMA)
4文字まで
- 3文字
:key wait 0 0@ = -229908 008B: 1@ = &0(0@,1i) // キー入力履歴の1~4文字を取得 0085: 2@ = 1@ // 抽出のために別の変数にコピー 1@ /= 0x1000000 // 1@に「不要な値だけを残す」ための処理 1@ *= 0x1000000 // 今回は3文字の比較なので、1@を4文字目だけにする 0062: 2@ -= 1@ // 2@(元の値)から1@(不要な値)を引いて、2@を必要な値だけにする if 2@ == 0x475441 // "GTA" jf @key &0(0@,1i) = 0 // ループ防止のためにキー入力履歴の一部を潰す
最低でも4文字ずつしか取り出せないので、6~8行目で不要な文字数分を取り除いています。
10行目の右辺でコマンドを指定します。Googleで「Ascii 変換」などで検索して、指定したい文字列をASCIIコードに変換してください。
2文字以下にしたい場合は6,7行目の0x1000000を変更します。1文字なら0x100、2文字なら0x10000にすればOKです。
- 4文字
:key wait 0 0@ = -229908 if &0(0@,1i) == 0x4841434B // "HACK" jf @key &0(0@,1i) = 0 // ループ防止
4文字の場合はそのまま比較するだけで済みます。
5文字以上
1文字と4文字を合わせた形。6文字なら2+4、7文字なら3+4...となります。
4文字ごとに0@に格納する値を+1するのを忘れずに。-229908のままだと最後に入力された4文字としか比較してくれず、成り立たなくなります。
以下は5文字のコマンド「SANNY」を取得する場合の例です。
:key wait 0 0@ = -229907 // 入力履歴の5~8文字が欲しいので-229908に+1 008B: 1@ = &0(0@,1i) 0085: 2@ = 1@ 1@ /= 0x100 1@ += 0x100 0062: 2@ -= 1@ // 5文字目だけを取り出す if 2@ == 0x53 // "S" jf @key 0@ = -229908 // 1~4文字目を指定 if &0(0@,1i) == 0x414E4E59 // "ANNY" jf @key &0(0@,1i) = 0 // ループ防止
8文字
:key wait 0 0@ = -114954 if &0(0@,1s) == '4321TSET' // "TEST1234" jf @key 0@ = -229908 &0(0@,1i) = 0
16文字
:key wait 0 0@ = -57477 if &0(0@,1v) == "8765432187654321" // "1234567812345678" jf @key 0@ = -229908 &0(0@,1i) = 0
方法B(read_memory)
方法Aと比べると、3文字以下の比較が非常に簡潔に済むのが特徴です。
基本的にはこちらの方が使いやすいかと思います。
4文字まで
0A8D: 0@ = read_memory 0x969110 size 4 virtual_protect 0
のsizeを取り出したい文字数(1-4)にして、それをifで比較するだけです。
- 3文字
:key wait 0 0A8D: 0@ = read_memory 0x969110 size 3 virtual_protect 0 if 0@ == 0x475441 // "GTA" jf @key 0A8C: write_memory 0x969110 size 1 value 0 virtual_protect 0 // ループ防止
抽出処理を丸々省けるので、方法Aと比べると行数も変数も少なくて済みます。
- 4文字
:key wait 0 0A8D: 0@ = read_memory 0x969110 size 4 virtual_protect 0 if 0@ == 0x4841434B // "HACK" jf @key 0A8C: write_memory 0x969110 size 1 value 0 virtual_protect 0 // ループ防止
こちらは方法Aとほぼ同じで、使う命令が変わったくらいです。
5文字以上
1-4文字+4文字のように組み合わせるだけです。
4文字ごとに0A8Dのアドレスに+0x4するのを忘れずに。
例えば「SANNY」なら
:key wait 0 0A8D: 0@ = read_memory 0x969114 size 1 virtual_protect 0 // 5文字目を拾いたいので+0x4 if 0@ == 0x53 // "S" jf @key 0A8D: 0@ = read_memory 0x969110 size 4 virtual_protect 0 // 1~4文字目 if 0@ == 0x414E4E59 // "ANNY" jf @key 0A8C: write_memory 0x969110 size 1 value 0 virtual_protect 0 // ループ防止
となります。
CLEO4の場合
専用のOpcodeが追加されたので、まだるっこしいことをしなくてよくなりました。
:key wait 0 if 0ADC: test_cheat "BLOWUP" jf @key