このドキュメントはDreamHackerに含まれる
「GameShark(海外版プロアクションリプレイ)?DC Xターミネーター互換機能」
の解説のテキストファイルです。
GameSharkのコード書式や情報については下記
http://www.gscentral.com/ GSCentral
[THE SECRETS Of Professional Gameshark(tm) Hacking]
を参考にしました。
また、DreamHacker掲示板で互換機能の実装を提案して頂いたねこかぶさんに感謝(^^
----------
?DreamHackerのGameShark互換機能とは?
本来、DreamHackerはプロアクションリプレイに似たコードを用いてはいますが、
基本的なコード動作は独自の書式で動いています。
しかし、コード名を宣言する「/」命令の行に「DCGS」という文字列を含むことで、
GameSharkと同じ書式を使って動作するようになります。
例えばDreamHackerの本来の書式でアドレス15000に01を書き込む場合は…
/アドレス15000に01を書き込むサンプル
00015000 01
このような書式になりますが、互換モードを有効にすると…
/DCGS アドレス15000に01を書き込むサンプルのGameShark版
00015000 00000001
こうなります(DCGSの文字列の場所は自由)。
DreamHackerの標準動作では右の値に 00000001 を指定すると4バイト書き込みですが、
GameSharkは必ず「8桁+8桁」という書式なので右の書き込むバイトサイズそのものも、
アドレス部分のコードの拡張で実現しています。
また、GameSharkではアドレス部に 8Cxxxxxx と指定することがありますが、
自動的に、頭の8Cを削ったアドレス 00xxxxxx にアクセスするように処理を行います。
なお日本語版プロアクションリプレイにあった
「暗号化コード」はサポートしていません。
もしも既に暗号化が施されている改造コードを入力したいのであれば、
冒頭のGSCentralに暗号化?復号化を相互で行うためのツール DCcrypt が公開されて
おりますので、そちらを用いて暗号化の施されていないコードを生成して、
そちらで入力してください。
----------
?DreamHackerでサポートしているGameSharkのコード効果一覧
GameSharkのコードが使えるといっても「完全互換」ではないので注意してください。
現在サポートしている命令は以下の通りです。
00aaaaaa 8BitWrite
01aaaaaa 16BitWrite
02aaaaaa 32BitWrite
0300nnnn GroupWrite
030100vv Increment(8bit)
030200vv Decrement(8bit)
0303vvvv Increment(16bit)
0304vvvv Decrement(16bit)
03050000 Increment(32bit)
03060000 Decrement(32bit)
04aaaaaa Repeat/Filler
05aaaaaa Copy bytes
0Caaaaaa execute or ALL-skip
0Daaaaaa 16bit conditional[equal]
0Daaaaaa 16bit conditional[different]
0Daaaaaa 16bit conditional[less than]
0Daaaaaa 16bit conditional[greater than]
0Ennwwww 16bit conditional[equal] -multi line-
0Ennwwww 16bit conditional[different] -multi line-
0Ennwwww 16bit conditional[less than] -multi line-
0Ennwwww 16bit conditional[greater than] -multi line-
上記コードの詳細は以下の通りです。
~任意のアドレスaaaaaaに1バイトのデータbbを書き込む (8BitWrite)
00aaaaaa 000000bb
(例)アドレス00015000に63を書き込む
00015000 00000063
→主に、キャラのレベルやアイテム個数などの小さい値の書き込みに用いる。
~任意のアドレスaaaaaaに2バイトのデータwwwwを書き込む (16BitWrite)
01aaaaaa 0000wwww
(例)アドレス00015010に03E7を書き込む
01015010 000003E7
→キャラのHPのように999や9999といった比較的大きめの値の書き込みに用いる。
~任意のアドレスaaaaaaに4バイトのデータddddddddを書き込む (32BitWrite)
02aaaaaa dddddddd
(例)アドレス00015020に05F5E0FFを書き込む
02015020 05F5E0FF
→最大経験値(99999999)など、非常に大きな数値の書き込みに用いる。
~任意のアドレスaaaaaaaaにnnnn行分の4バイトデータを書き込み (GroupWrite)
0300nnnn aaaaaaaa
xxxxxxxx yyyyyyyy
zzzzzzzz.....
(例)アドレス00015030~00015038に11111111 22222222 33333333を書き込む
03000003 00015030
11111111 22222222
33333333 00000000
→長い数列を書き込むときに用いる。連続的なパラメータ書き換えにも有効。
※最後の00000000はDreamHackerの構造上必要無いが、念のため書いておく。
当然、nnnnに0004を指定するとアドレス0001503Cに00000000が書き込まれる。
~任意のアドレスaaaaaaaaに1バイトのデータbbを足し続ける (Increment 8bit)
030100bb aaaaaaaa
(例)アドレス00015040の1バイトに常に2を足す
03010002 00015040
→時間経過とともに回復や、特殊な動作をするコードに用いる。
~任意のアドレスaaaaaaaaから1バイトのデータbbを引き続ける (Decrement 8bit)
030200bb aaaaaaaa
(例)アドレス00015050の1バイトから常に5を引く
03020005 00015050
→時間経過で敵を自滅させたりする場合などに用いる。
~任意のアドレスaaaaaaaaに2バイトのデータwwwwを足し続ける(Increment 16bit)
0303wwww aaaaaaaa
(例)アドレス00015060の2バイトに常に0100を足す
03030100 00015060
→放っておくだけでEXPが上昇するコードなどに用いる。
~任意のアドレスaaaaaaaaから2バイトのデータwwwwを引き続ける(Decrement 16bit)
0304wwww aaaaaaaa
(例)アドレス00015070の2バイトから常に0511を引く
03040511 00015070
→時間経過とともに敵兵士数を減少させる場合などに用いる。
~任意のアドレスaaaaaaaaに4バイトのデータddddddddを足し続ける(Increment 32bit)
03050000 aaaaaaaa
dddddddd 00000000
(例)アドレス00015080の4バイトに常に00000001を足す
03050000 00015080
00000001 00000000
→上記までの加算コードよりも大きな値を必要とする場合に用いる。
※最後の00000000はDreamHackerの構造上必要無いが、念のため書いておく。
~任意のアドレスaaaaaaaaの4バイトのデータddddddddを引き続ける(Decrement 32bit)
03060000 aaaaaaaa
dddddddd 00000000
(例)アドレス00015090の4バイトから常に12345678を引く
03060000 00015090
12345678 00000000
→時間経過とともに敵軍の兵力ダウンなどに用いる。
※最後の00000000はDreamHackerの構造上必要無いが、念のため書いておく。
~任意のアドレスaaaaaaに、4バイトのデータddddddddをcccc回、
ssss x 4バイト間隔で書き込む (Repeat/Filler)
04aaaaaa ccccssss
dddddddd 00000000
(例)アドレス000150A0から、数列FFFFFFFFを0005回、8バイト間隔で書き込む。
040150A0 00050002
FFFFFFFF 00000000
少々複雑ですが、これでアドレス000150A0からは…
FFFFFFFF xxxxxxxx FFFFFFFF xxxxxxxx FFFFFFFF... (x=跳び越えた数値)
という列が続きます。00050002を00050001にすれば、
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
もちろん00050003にすれば、
FFFFFFFF xxxxxxxx xxxxxxxx FFFFFFFF xxxxxxxx xxxxxxxx FFFFFFFF...
こうなるわけですね。
→全アイテムを99個にする!といったコードで、アイテムの所有情報などの
箇所に書き込まないようスキップしながら連続的に書き込む場合などに用いる。
~アドレスaaaaaaからxxxxxxxxバイトのデータを、
アドレスccccccccにコピーする (Copy bytes)
05aaaaaa cccccccc
xxxxxxxx 00000000
(例)アドレス000150B0から5バイトのデータをアドレス000150C0にコピーする。
050150B0 000150C0
00000005 00000000
→ブロック単位でのアイテム情報コピーやデータ退避などに用いる。
~アドレスaaaaaaにある4バイトがddddddddでなければ、
全てのコードを無効化する (execute or ALL-skip)
0Caaaaaa dddddddd
(例)アドレス000150C0がFFFFFFFFでなければ全てのコードを無効にする。
0C0150C0 FFFFFFFF
→これにより「タイトル画面でコードを実行しては危険」という場合、
任意の場面で変動するアドレス値を元にコードを実行することが可能になる。
ただし、GameShark互換モードにしか作用しません(本来のコード形式には作用しない
また「他の全てのGameSharkのコードに作用」します。
実際にこのコードを使う機会はほとんど無いでしょう。
~アドレスaaaaaaにある2バイトがwwwwであれば、
次の行のコードを実行する (16bit conditional[equal])
0Daaaaaa 0000wwww
(例)アドレス000150D0が1234ならアドレス000150E0を63にする
0D0150D0 00001234
000150E0 00000063
→いわゆるDコード(条件判断)の「イコール(適合)」です。
次の行のコードは00,01,02(8bit~32bit書き込み)しか
使えないので注意してください。
あくまで動作としては「条件を満たさなければ次の1行をスキップ」です。
理論上は03から始まる一部のコードも使えますが推奨はしません。
~アドレスaaaaaaにある2バイトがwwwwでなければ、
次の行のコードを実行する (16bit conditional[different])
0Daaaaaa 0001wwww
(例)アドレス000150F0が5678ならアドレス00015100を03E7にする
0D0150F0 00015678
01015100 000003E7
→Dコードの「ディファレント(不適合)」です。
イコールと逆の動作をしますし、当然、仕様も同じです。
~アドレスaaaaaaにある2バイトがwwwwより小さければ、
次の行のコードを実行する (16bit conditional[less than])
0Daaaaaa 0002wwww
(例)アドレス00015110が8000より小さければアドレス00015120をFFFFFFFFにする
0D015110 00028000
02015120 FFFFFFFF
→値の小ささを判断するコードです。
仕様も上のDコードと同じであり、あくまで判断条件が異なるだけです。
~アドレスaaaaaaにある2バイトがwwwwより大きければ、
次の行のコードを実行する (16bit conditional[greater than])
0Daaaaaa 0003wwww
(例)アドレス00015130が5000より多きければアドレス00015140を00000000にする
0D015130 00035000
02015140 00000000
→値の大きさを判断するコードです。
言うまでもなくless thanと逆の働きをします。
~アドレスaaaaaaにある2バイトがwwwwであれば、
nn/2行のコードを実行する (16bit conditional[equal] -multi line-)
0Ennwwww 00aaaaaa
(例)アドレス00015150が1111であればアドレス00015160に99を書き込み、
アドレス00015170に8888を書き込む
0E041111 00015150
00015160 00000099
01015170 00008888
→1つの条件で複数のコードに作用する条件判断(イコール)コードですが、
「nnの値に注意」してください。
例えば上記の例では「2行」のコードを実行するかを判断するときのnnの値は
「04」…つまりこのnnは1につき1行2項目の1項目分だけをスキップします。
それではあまりに危険なのでDreamHackerではたとえ1を指定しても2、
3を指定しても4と判断するようにしています。
~アドレスaaaaaaにある2バイトがwwwwでなければ
nn/2行のコードを実行する (16bit conditional[different] -multi line-)
0Ennwwww 01aaaaaa
(例)アドレス00015180が2222でなければアドレス00015190に99を書き込み、
アドレス000151A0にAAAAを書き込み、アドレス000151B0にFFFFFFFFを書き込む
0E062222 00015180
00015190 00000099
010151A0 0000AAAA
020151B0 FFFFFFFF
→イコールに続いてディファレントで、仕様も全く同じです。
上の例ではnnに06を指定して下3行を判断しています。
~アドレスaaaaaaにある2バイトがwwwwより小さければ
nn/2行のコードを実行する (16bit conditional[less than] -multi line-)
0Ennwwww 02aaaaaa
(例)アドレス000151C0がFFFFでなければアドレス000151D0にFFを書き込む
0E02FFFF 000151C0
00015190 000000FF
→値の小ささを判断するコードの複数行タイプです。
上の例はnnに2を指定して次の1行のみに作用するような動作ですが、
普通は0Daaaaaa~のコードを使うほうが賢明ですね。
~アドレスaaaaaaにある2バイトがwwwwより大きければ
nn/2行のコードを実行する (16bit conditional[greater than] -multi line-)
0Ennwwww 03aaaaaa
(例)アドレス000151E0がFFFFでなければアドレス000151F0にFFを書き込む
0E03FFFF 000151E0
000151F0 000000FF
→値の大きさを判断するコードの複数行タイプです。
上記のものと同じ仕様です。
----------
[ 此帖被YZB在2010-06-28 00:08重新编辑 ]