いよいよネタが枯渇気味になってきたということで、今回は解説のみのエントリです。知ってる人は知っている、スキップしてかまわない内容です。バイナリwikiには個々のデータの場所や各フィールドの意味がかなり明らかにされていますが、明らかに用途がわかるデータ以外については、残念ながらその用途や他のデータとどう関連しているかについての解説があまりありません。索引的な役割なのでしょうがないといえばしょうがないのですが。というわけで、その足りない部分の補足を主な目的とします。もちろん全部は無理ですが、少なくとも自分が知りえた範囲はカバーしていく予定です。なお、解説中のアドレスは全てオリジナルのアドレスを使用します。拡張パッチ使用の場合はreadmeを参照しながら適宜読み替えてください。
さて、プログラムの変更が必要がない割には複数箇所のデータを使用するためにわかりにくい呪文習得の仕組みについて解説します。関係しているのは以下のデータです(データ名は便宜上勝手に名づけたものもあります)
- 職業データ($04179E-) 呪文習得数(14B)
- 職業データ($04179E-) 習得呪文アドレス(11-13B)
- 呪文習得レベル($3EF879-)
1にはその職業で習得可能な呪文数をセットします。この値が0の場合にはレベルアップ時にMPが上がらないようにプログラムされています。
(参考)
- SR: $043C83 レベルアップ時のステータスアップ,呪文習得処理?
略 | |||
---|---|---|---|
043E45 | JSL $C903E2 | SR: $0903E2 引数:1#$01 引数:2#$0173 引数:3#$C424A9 引数:4#$000E | 呪文習得数を取得 |
043E51 | AND #$00FF | A&=#$00FF | |
043E54 | BEQ #$22 | if(z==on) goto $043E78 | 0なら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のアドレスの変更は不要ですが、間違いの元になるのでつめたほうがいいと思います。複数の職業に対して同様の処理を行った後は開始アドレスの対応が取れていない可能性があるのでテストプレイで確認したほうがいいでしょう。
コメント
例えば、勇者習得のメラをイオに置き換えるためには、バイナリのどこをイジるのですか?
3は理解できたのですが、1と2がバイナリのどの位置なのか良く分かりません。
入れ替えの場合は1,2は変える必要はありません。
レベルアップで「習得した」と出ても、「つよさ」や戦闘場面で確認すると空欄になってしまいます。
どう修正すれば良いのですか?
戦闘呪文であれば$0416B7-「戦闘呪文」での各職業に相当する呪文の表示順を変えていないからです。対応する呪文の表示順が”0″だと覚えていても表示されないようです。
勇者だけでよいので、詳細を教えてくれませんか? メラ、二フラム、イオラを削除して、バイキルト、マホカンタ、パルプンテに入れ替えたいです。
やることは以下の2点だけです。
1はともかく、2を変えてやればこのように表示できます。
キリがないので返信はこれで最後にします。
初心者のため理解できませんでした。$0416B7の「勇者の列」と言われても全く分かりませんでした。上記の状態がとても羨ましいですが、バイナリのどこを入れ替えれば良いのですか? 変更した画面があれば入れ替えられるのですが。
私が開発して公開している「SFCGENEditor」での編集を前提にして話をしています。バイナリエディタ上でどこを変えたらいいのかはこちらでも把握していません。悪しからず。