DQ3 各職業の習得呪文情報設定

いよいよネタが枯渇気味になってきたということで、今回は解説のみのエントリです。知ってる人は知っている、スキップしてかまわない内容です。バイナリwikiには個々のデータの場所や各フィールドの意味がかなり明らかにされていますが、明らかに用途がわかるデータ以外については、残念ながらその用途や他のデータとどう関連しているかについての解説があまりありません。索引的な役割なのでしょうがないといえばしょうがないのですが。というわけで、その足りない部分の補足を主な目的とします。もちろん全部は無理ですが、少なくとも自分が知りえた範囲はカバーしていく予定です。なお、解説中のアドレスは全てオリジナルのアドレスを使用します。拡張パッチ使用の場合はreadmeを参照しながら適宜読み替えてください。

さて、プログラムの変更が必要がない割には複数箇所のデータを使用するためにわかりにくい呪文習得の仕組みについて解説します。関係しているのは以下のデータです(データ名は便宜上勝手に名づけたものもあります)

  1. 職業データ($04179E-) 呪文習得数(14B)
  2. 職業データ($04179E-) 習得呪文アドレス(11-13B)
  3. 呪文習得レベル($3EF879-)

1にはその職業で習得可能な呪文数をセットします。この値が0の場合にはレベルアップ時にMPが上がらないようにプログラムされています。

(参考)

  • SR: $043C83 レベルアップ時のステータスアップ,呪文習得処理?
043E45JSL $C903E2SR: $0903E2 引数:1#$01 引数:2#$0173 引数:3#$C424A9 引数:4#$000E呪文習得数を取得
043E51AND #$00FFA&=#$00FF
043E54BEQ #$22if(z==on) goto $043E780ならMPアップ処理、呪文習得処理をスキップ

このため、呪文習得数0の戦士、ぶとうかはMPが上がらないのです。呪文習得数を0にしたままこれらの職業のMPを上がるようにしたい場合は上記$43E54-55をEA EAに置き換えれば上がるようになります。なお、この変更を行うと戦士、ぶとうかでも呪文習得判定処理のSR:$045827が実行されるようになりますが、そこでも呪文習得数のチェックを再度行い、0の場合は呪文習得判定を行わないようになっているので、バグることはありません。

2にはその職業の3のデータの開始アドレスをセットします。基本的には3のデータは全職業連続で並んでいるため、とある職業で覚える呪文の数を変えた場合は、他の職業の習得呪文アドレスが全てずれてしまうため注意が必要です。

3は各職業の習得可能な呪文とその習得レベルが格納されています。データの構成は単純で

00レベル
01呪文ID

だけです。ちなみに呪文IDというのは呪文基本データ($04130D-)から並んでいる呪文データのインデックスに相当します。呪文習得レベルは全部で140レコードありますが、上から順に魔法使い、僧侶、勇者、賢者、盗賊、遊び人、商人のデータが並んでいます。それぞれの情報の開始アドレスを見ると、$3EF879、$3EF8B7、$3EF8E7、$3EF913、$3EF981、$3EF98B、$3EF98Dとなっており、これが2のRAM上の値に対応していることがわかると思います。プログラム的には各職業に設定されたこのアドレスと習得数を見てその職業が習得可能な呪文の情報を入手し、習得判定をしている、ということになります。

これが大体のメカニズムですが、次に習得できる呪文を変える場合にどうするべきか、という話になります。例えば魔法使いの呪文を1つ増やそうとした場合、僧侶の呪文開始位置に魔法使いの新呪文の情報を1レコード挿入し、以降のレコードが1つずつ繰り下がります。それに伴い、僧侶、勇者、賢者、盗賊、遊び人、商人の開始アドレスが2ずつずれるため、魔法使いと関係ないこれらの職業の2のアドレスも変更しないといけません。逆に減らす場合は間が空いてしまうことを気にしないのであれば2のアドレスの変更は不要ですが、間違いの元になるのでつめたほうがいいと思います。複数の職業に対して同様の処理を行った後は開始アドレスの対応が取れていない可能性があるのでテストプレイで確認したほうがいいでしょう。

コメント

  1. はちろく より:

    例えば、勇者習得のメラをイオに置き換えるためには、バイナリのどこをイジるのですか?
    3は理解できたのですが、1と2がバイナリのどの位置なのか良く分かりません。

    管理者より返信:

    入れ替えの場合は1,2は変える必要はありません。

  2. 匿名 より:

    レベルアップで「習得した」と出ても、「つよさ」や戦闘場面で確認すると空欄になってしまいます。
    どう修正すれば良いのですか?

    管理者より返信:

    戦闘呪文であれば$0416B7-「戦闘呪文」での各職業に相当する呪文の表示順を変えていないからです。対応する呪文の表示順が”0″だと覚えていても表示されないようです。

  3. 匿名 より:

    勇者だけでよいので、詳細を教えてくれませんか? メラ、二フラム、イオラを削除して、バイキルト、マホカンタ、パルプンテに入れ替えたいです。

    管理者より返信:

    やることは以下の2点だけです。

    • 1.「呪文習得データ」の勇者の部分の習得呪文とレベルの指定を行う。削除数と追加数が同じなのでアドレスの移動は不要。
    • 2.「戦闘呪文」の勇者の列で削除する呪文の順番を0に、追加する呪文の表示順を指定する。順番を樹にしないのであれば削除した位置に追加する呪文をはめ込めばいい。

    1はともかく、2を変えてやればこのように表示できます。

    キリがないので返信はこれで最後にします。

  4. 匿名 より:

    初心者のため理解できませんでした。$0416B7の「勇者の列」と言われても全く分かりませんでした。上記の状態がとても羨ましいですが、バイナリのどこを入れ替えれば良いのですか? 変更した画面があれば入れ替えられるのですが。

    管理者より返信:

    私が開発して公開している「SFCGENEditor」での編集を前提にして話をしています。バイナリエディタ上でどこを変えたらいいのかはこちらでも把握していません。悪しからず。

タイトルとURLをコピーしました