ゲーム改造FAQ
ここでは、ゲームの改造をするにあたって、主に初心者が疑問を持ちやすいと思われる点をいくつか挙げてみました。
安易に掲示板に質問を書き込む前に、一度目を通してみてください。
当サイトでは、メールでの、改造コードに関する質問をお断りしています。
掲示板である程度の質問を受け付けています。但し、あまりにも初歩的な質問はご遠慮願います。 → 改造掲示板
あと、当サイトで紹介しているコードとは全く関係のない質問に対しては回答できません。
☆改造にはどんな物が必要?
ゲームを改造するためには、プロアクションリプレイ(PAR)やエックスターミネータ(XT)といったツールが必要です。
PS(プレステ)、GB(ゲームボーイ)、SS(サターン)など、ゲーム機毎に、専用のツールが存在しているので、自分の改造したいゲーム機のツールを準備しましょう。
ちょっと大きなゲームショップに行けば、比較的簡単に入手できるでしょう。
ただし、サターンについては、現在ツールが入手できるかどうか不明です。
☆自分で解析をするには何が必要?
改造コードを使って改造するだけなら、上記のツールだけでできますが、自分で解析したいという場合は、上記ツールの他に、パソコンとリンクするためのツールが必要です。ただ、一部にパソコン無しでもコードサーチができるツールがありますが、パソコンとリンクした場合と比べると、決して使い勝手が良いとは言えません。
パソコンとリンクするツールとしては、ゲームリンクボードやコムズリンクなどが必要です。ただ、現在はパソコンのプリンタポート(パラレルポート)を使って、ボード無しでリンクできる物も売られています。Windowsマシンを使っている人は、プリンタポートを使った物を買うといいでしょう。
ちなみに、こちらでは、PSやSSに関しては、古いPC9801にゲームリンクボードを挿して、MS-DOS環境で解析しています。ゲームボーイはパソコンとリンクできないので、XTの解析機能+α(これは、ないしょ!)を使っています。
具体的な解析の方法は、各種書籍が出ていますので、それを参照してください。
解析ツールのメモリエディットが使いこなせると、かなりラクに、いろいろいじれておもしろいですよ。
☆ビットとは
ここからは、ちょっとばかし難しくなってきますが・・・
ゲーム機といえども、CPUを搭載したれっきとしたコンピュータです。コンピュータの中では0か1かの2つの値(2進法)で全てが表現されています。実際、ゲームの画面や音などは人間が見て聞いて判るように、ゲーム機の内部で2進法で表現されている演算結果をアナログに変換して最終的にTV受像(信)機に出力されているにすぎないのです。
このコンピュータの中で扱われている2進数というのは0か1かで全てが表現され、
0
1
10
11
100
・・・
というように、0→1ときて次は10というように桁が上がっていきます。10進数では1の次は2ですが、2進数では1の次は10なのです。2になるときは次の桁に上がるので2進数、この数値体系を2進法と呼びます。
人間の言葉なら「YES」か「NO」、「はい」か「いいえ」といったところでしょう。0と1という2つの値で示されるため、白黒がハッキリつきます。
この2進数1桁を「1ビット」と言います。2進数が8桁あれば、これは8ビットです。
コンピュータの世界では、特に2進数8桁の集まりを1バイト、2進数16桁の集まりを1ワードと呼んでいます。
例:
00101101 → 2進数8桁(8ビット)(1バイト)
0010110111101010 → 2進数16桁(16ビット)(1ワード)
桁数が増えてくると非常に扱いにくいですね。でも、8ビットで0~255の256通り、16ビットでは0~65535(65536通り)の数値を表現できるのです。
ここで、2進数を4桁ごとに区切りるとどうなるでしょうか・・2進数4桁では0~15(16通り)の値を表現できます。この2進数4桁をまとめて1桁として扱うのが下で出てくる「16進数」です。
☆16進数ってなに?
通常、私たちが使っている数値は10進法で表されています。これは0,1,2,3,4,5,6,7,8,9ときて、次に10として桁が上がる数値体系です。しかし、コンピュータの中では、2進法が使われていて、これは0か1だけで表現されています。これは人間が扱う上では、非常に使いにくいものなのです。とにかく、ちょっとした数値を表すにも桁数がやたらと多くなってしまい、見にくいことこの上ありません。
ここで、2進数を数桁ごとにまとめて考えることにします。
10進数の0~9を扱える範囲・・・ということで、9は2進法の表現では「1001」ですから、4桁必要です。
9は2進法では「1001」です。泣いても笑っても4桁必要です。4桁必要ですが、その中にはまだゼロがありますから、まだもっと大きな数値を扱える余地があるわけですね。
2進数4桁では0000(0)~1111(15)の数が扱えます。0~9までで表現できる範囲にすればいいじゃないか・・と思いますが、そう都合よくはいきません。2進数4桁は、0000~1111まで表現できるのです。
こうなると、10で桁上げが起こってしまっては都合が悪いわけです。そこで、10をA、11をB、12をC、13をD、14をE、15をFというアルファベットで表現することにしたのです。これが16進数です。
16進法では、0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F ときて、次に10と桁があがります。
16進数は、36hとか6Dhというように、最後に「h」を付けて、10進数と区別します。他には、0x33というように、先頭に0xを付けて区別している例もあります。
☆ビット操作のやり方
当サイトで扱っているコードは、所々でビット操作が必要なものが出てきます。
これは、当方では「何でもかんでも最大にするだけが改造コードではない」と考えているため、必要に応じてそのコードについて判明した詳細をできるだけ公開していこう・・と思っているためです。
改造コードというのは、難しいゲームを少しでもプレイヤーに有利に展開させる・・という最大の目的があります。しかし、これは逆に例えば自分のプレイする技術レベルが高い(ゲームがカンタン過ぎる)場合にゲームを難しくするという目的にも使えるのです。
さて、本題に移りましょう。
例えば、次のようなコードがあったとします。
キャラクタフラグ2 300A3D81 00xx bit : 76543210
bit0 ファウストVIII世
bit1 リゼルグ
bit2 マルコ
bit3 チョコラブ
bit4 恐山アンナ
bit5 小山田まん太
bit6 麻倉 葉明
bit7 玉村たまお
面倒な場合は xx=FFh
キャラクタフラグ3 300A3D82 00xx bit : ----3-1-
bit0 未定義
bit1 アイアンメイデンジャンヌ
bit2 未定義
bit3 2P 育てた葉を使う
bit4 未定義
bit5 未定義
bit6 未定義
bit7 未定義
未定義ビットは常に0にしてください
面倒な場合は xx=0Ah
キャラクタフラグ2・・・とあって、右側に bit : 76543210 というのがあると思います。これは、その1バイトの中の有効なビットが示されています。この場合は0~7までの8ビット分が有効ということになります。
次にあるキャラクタフラグ3では bit : ----3-1- となっています。これは、8ビットのうちの1ビット目と3ビット目が有効であることが示されています。原則としてこれらのビットを0にすればキャラが引っ込み、1にすれば出てくる・・というわけです(例外もあるかもしれません)。「未定義」となっているものは原則として0にします(これも例外がありますが)。
もちろん、これ以外の表現の場合がありますが(ドラクエのような場合)、基本的な考え方は全部一緒です。
では、ここでキャラクタフラグ2を操作してリゼルグと恐山アンナと小山田まん太の3人だけを出す設定をしてみましょう。まず、この3人を出すためには、ビット1、4、5を「1」にして他は0にすれば良いことがわかります。
まず、これをとにかく2進数で並べてみます。ビット7(最上位)が左、ビット0(最下位)が右になるように並べます。そうすると・・・
b7b6b5b4b3b2b1b0
00110010
となります。
次にこれを4桁で区切り、分割します。
0011 0010
こうなれば、あとはこれを16進数に直せばいいだけです。
以下の表を使うとカンタンに16進数に直せます
2進数 | 16進数 |
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
この表を使って 0011 0010 を16進数に直すとそれぞれ 3 と 2 になります。つまり、00110010b(最後のbは2進数を表す)を16進数に直すと32h(最後のhは16進数を表す)になります。こうなってしまえば、もうあとはいつもと同じですね。そうです、皆さんがいつもPARに書き込んでいる16進数です。こうして得られた値を、いつも入力している「改造コード」として入力すれば良いわけです。
この例の場合は・・・リゼルグと恐山アンナと小山田まん太の3人を出すためには・・・
300A3D81 00xx → 300A3D81 0032
となるわけです。
もちろん、関数電卓とかが使える場合には、2進←→16進相互変換ができるようならば8桁なら8桁を直接電卓に入れて16進数に直しても構いません。
改造コードにおけるビット操作とは・・・手動で変換する場合は、①とにかく所望の結果になるように0と1を並べ(最上位が左、最下位が右) → ②4桁ごとに区切り → ③16進数に変換する → ④改造コードとして入力・・基本的にこの作業です。
最後に、「面倒な場合は・・」とありますが、これは面倒なビット操作をしなくても手っ取り早くキャラを出せるように・・ということで書いてあります。キメ細かい操作はできませんが、手っ取り早くキャラを出すことができるわけです。なお、全ての場合に「面倒な場合は・・」があるとは限りません。
☆10進←→16進 どうやって変換すればいいの?
さて、改造コードは、殆どの場合、16進法で表現されます。ゲーム機といえども、コンピュータですから、これは仕方がありません。しかし、10進数と16進数は、必ずしも相性がいいとは言えません。手計算で変換しようとしても、結構面倒なんですよね・・これが・・・。
でも、今はこの「困ったちゃん」に対抗できうる、「関数電卓」という便利な道具(文明の利器)があるじゃないですか!こんないい物を使わない手はありません。もちろん、ポケコンとかでもOKです。
今の関数電卓には、殆ど10進・16進・8進・2進の相互変換機能が付いています。持っている人は、これを活用しましょう。
理工系の学校に行っている人や、設計などに従事している人であれば、大抵は持っているのではないか?と思います。
昔の変換機能が無い関数電卓や八百屋電卓ではNGです。
不幸にも関数電卓を持っていない人は・・「関数電卓? そんなもん持ってないよ!!」 って怒る前に、冷静に考えてみてください。今、このFAQを見るのに何を使っていますか・・? 「そんなのパソコンに決まってんじゃん」と言うでしょう。そうです。パソコンです。Windowsマシンには、アクセサリの中に電卓が入っています。この電卓を関数電卓モードに切り替えれば、相互変換機能が使えるようになるのです。これで、もう10進←→16進相互変換は怖くないですね。
なお、マッキントッシュについては、こちらでMACを使っていないので、電卓があるかどうかわかりません。ごめんなさい。
あと、もし、あなたがパソコン以外の端末(例えば、インターネットTVやゲーム機、iモード端末、ワープロ等)を使っている場合は・・・残念ながら、その場合は、手計算がイヤなら、パソコンに乗り換えるか、関数電卓を入手するしかありません・・・
手計算しか使えない時は・・・
例:1000を16進数に変換する
以下に示すように、変換したい数値を、順に16で割っていきます。16で割れる限り割っていきます。割れなくなったらそこでストップ。
16 )1000 余り
16 ) 62 … 8←(最下位)
3 … 14 ←←ここで、3は、もう16では割れないのでストップ。
↑ ↑
(最上位)(第2位)
3,14,8が最終的な答え。最上位から順番に並べて、14をEとして、3E8hが1000を16進数に変換した結果となります。
例:3E8hを10進数に変換する
Ehは10進数に変換して14としておきます。桁ごとにバラして、以下のように計算れば、変換できます。
ここでは、ターゲットの16進数が3桁なので、16の2乗までの項が出ます。4桁なら16の3乗の項まで出てくることになります。n桁なら、16のn-1乗までの項が出てきます。
162×3+161×14+160×8 = 1000
ちなみに、16の2乗は256、16の1乗は16、16の0乗は1です。
☆コードにはどんな意味があるの?
一口に改造コードと言っても、いくつかの種類があります。
大まかに分けると、
1. バイト系書き変えコード
2. ワード系書き変えコード
3. 条件一致検出系コード
があります。今、こちらには初代のアクションリプレイしか無いので、その後拡張されたコードについてはわかりませんが、いずれにしても、おおまかに分ければ上記の3つになると思われます。
後から拡張されたコードには、もしかすると、Dワード系(32ビット)書き変えコードなどもあるのかもしれません。
プレステの場合
プレステのコードでは、
80xxxxxx dddd
30xxxxxx 00dd
D0xxxxxx cccc
という3種類のコード(これは、初代アクションリプレイでの例です)があります。それぞれ、先頭の値が違っています。この違いで、改造のモードが変わるわけです。
先頭が8のコードは、そのアドレスのデータをワード値(16ビット)で書き変えることを意味します。
80xxxxxx と 80xxxxxx+1 のアドレスの、2バイト分のデータをddddに書き変えます。
先頭が3のコードは、そのアドレスのデータをバイト値(8ビット)で書き変えることを意味します。
30xxxxxx のデータをddに書き変えます。上位バイトは無意味なので、00になります。
先頭がDのコードは、D0xxxxxx と D0xxxxxx+1 のアドレスのデータが、ccccになったときに、次の行に書き込まれた改造コードを有効にするという一致検出のためのコードです。
D0xxxxxx cccc
80xxxxxx dddd
というように使います。こうすると、条件が一致したときだけ、下の80xxxxxx ddddが有効になります。
ここで注意が必要なのは、Dのコードは、あくまでも次の1行に書かれたコードしかコントロールできないということです。Dコードの下に、8コードや3コードをまとめて書き込んでも、あくまでもDコードの直下のコードしかコントロールされないので注意してください。いつだったか、何かの雑誌に、1行のDコードの下にまとめて数行コードを記述してあった例がありましたが、そのまま入力すると、当然、期待した結果にはなりません。
ゲームボーイの場合
ゲームボーイの場合は、ワード系のコードはありません。バイト系だけです。
01ddxxxx
9bddxxxx
というコードが存在します。この例は、エックスターミネータZの場合です。
01で始まるコードは、全てのゲームボーイで共通に使える「ノーマルGB」コードです。ddには書き変えるデータ、xxxxにはアドレスが入ります。注意が必要なのは、アドレスの上位と下位が入れ替わるということです。
例えば、CC00というアドレスは、00CCとなり、xxxxに入るということです。こういうのは、少々見づらくなる原因なので、改善してほしいところですが、コードの互換性を維持するために、今後も改善はされそうにありません。いままでのしがらみというヤツですね・・・
さて、9bで始まるコードですが、これはゲームボーイカラー専用のコードです。ゲームボーイカラーは、D000~DFFFまでのアドレスのRAM領域が、バンクRAMになっているのです。そのため、通常の01コードでは、アクセスできない領域ができてしまうのです。それをカバーするのが9bコードです。bにはバンク番号が入ります。そのほかは、01コードと同じです。
サターンの場合
サターンは、現在は新しくソフトも出ていないし、あまり改造コードを使うこともないと思うので、簡単に済ませます。
サターンは、プレステのコードとだいたい同じようなものなのですが、マスターコードというのが存在するため、ちょっとややこしくなっています。マスターコードについては、詳しいことはよわかりません。ただ、殆どの場合、マスターコードを入力しようとするときに既に入っている初期値をそのまま入力しておけば、大丈夫だろうと思われます。ごくまれに、初期値のままだとダメな場合があります。
あとは、
06xxxxxx dddd
16xxxxxx dddd
36xxxxxx 00dd
D6xxxxxx cccc
というコードがあります。このうち、一番上の0で始まるコードを使っている例は殆ど見たことがありません。1で始まるコードは、プレステでいうところの8コードと同じ、3のコードはプレステの3コードと同じ、DのコードはプレステのDコードと同じ意味です。0コードは、常時コードが有効とならないで、起動時の一瞬のみ有効となるコードです。
☆省略表記について
例えば、RPGのアイテムテーブルのように、数十個~数百個の書き変えるポイントが、連続したアドレスに存在している場合、
アイテム1 xxxxxxx0 00xx アイテム種類
xxxxxxx1 00xx アイテム個数
アイテム2 xxxxxxx2 00xx
xxxxxxx3 00xx
|(実際は、この間を省略していない)
アイテムn n 00xx
n+1 00xx
のように、一つずつ全部コードを載せるのは困難です。まぁ、数が少なければ、全部記載しても大丈夫ですが・・・
そこで、
アイテム1 xxxxxxx0 00xx アイテム種類
xxxxxxx1 00xx アイテム個数
|
| 以降2バイトステップ
|
アイテムn n 00xx
n+1 00xx
というように表記すれば、簡単に表記できます。この場合は、1アイテムにつき、アイテムの種類で1バイト、個数で1バイトの計2バイトを使うので、アイテムテーブルの先頭を記載し、それ以降は2バイトずつ増やしていけば、目的のアドレスを割り出せます。そして、テーブルは最後アイテムnで終わるわけです。
雑誌のコードでは、RPGのキャラが複数人いる場合などに、キャラ1人目のみのアドレスを記載しておき、他のキャラについては、「2人目以降+140h」などと表記しているのを比較的多く見掛けます。これも省略表記で、考え方は一緒です。
とはいっても、希望のアドレスを割り出すには、計算しないといけません。
ここで、具体的に計算してみましょう(例は、ゲームボーイの改造コード表記の場合)
アイテム1 01xx00C0 アイテム種類 ← ここがアイテム1の先頭アドレス
01xx01C0 アイテム個数
以降2バイトステップ
(本当は、ここから先は省略されている)
アイテム2 01xx02C0
01xx03C0
アイテム3 01xx04C0
01xx05C0
アイテム4 01xx06C0
01xx07C0
|
|
となっていたとします。まず、アイテムの1個目は、C000hにその種類が、C001hに個数が入っています。(ここでは、判りやすくするために、全てのアドレスを出しています)
ここで、アイテム3個目のアドレスを計算してみましょう。
まず、アイテム1個目はC000hとC001hの2バイトですから、アイテムのアドレスは以降2バイトステップで進んで行くことがわかります。アイテム1は、そのアドレスそのものですから、加算分は当然0です。では、3個目はどうでしょう。1個目が加算分0ですから、1-1=0ということです。3個目は、3-1=2で、加算分は2となります。しかし、ここでは2バイトステップなので、さらに2を掛けて2×2=4となり、4は16進数に変換しても4hですから、1個目の先頭アドレスC000hに+4hして、C004hとなります。
上のアイテムのアドレスと比べてみましょう。アイテム3個目はC004hとC005hなので、確かに合っていますね。
アイテム10だったら、(10-1)×2=18 18を16進数に変換すると12hですから、C000h+12hでC012hとC013hになります。
以上をまとめると・・・
アイテム番号nのアドレス = アイテム1の先頭アドレス + (アイテム番号n - 1) × ステップ数
ということになります。進数の違いには十分注意して計算してください。アドレスは16進数、アイテムnは10進数で表されている場合が多いですよ!!
あと、くれぐれも左からぶっきらぼうに計算しないでくださいね。きちんと数式の規則に従って計算してください。
カッコの中が最優先され、次は掛け算が優先ですよ!